Скомпилированные языки программирования: что это такое? Преимущества, компиляторы, машинный код, скорость выполнения. Различия с интерпретируемыми языками.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Компилируемый язык программирования — это язык программирования, реализации которого обычно представляют собой компиляторы (программы, преобразующие исходный код в машинный код), а не интерпретаторы (пошаговые исполнители исходного кода, не осуществляющие предварительного перевода во время выполнения). Сам термин несколько размыт. В принципе, любой язык программирования может быть реализован как с помощью компилятора, так и с помощью интерпретатора. Распространено также сочетание обоих подходов: компилятор может преобразовывать исходный код в промежуточную форму (часто называемую p-кодом или байт-кодом), которая затем передается интерпретатору для исполнения.
Programming language which is converted into executable code
A compiled language is a programming language whose implementations are typically compilers (translators that generate machine code from source code), and not interpreters (step by step executors of source code, where no pre runtime translation takes place). The term is somewhat vague. In principle, any language can be implemented with a compiler or with an interpreter. A combination of both solutions is also common: a compiler can translate the source code into some intermediate form (often called p code or bytecode), which is then passed to an interpreter which executes it.
Преимущества и недостатки
Программы, компилируемые в машинный код на этапе компиляции, как правило, работают быстрее, чем те, которые транслируются во время выполнения, из-за накладных расходов, связанных с процессом трансляции. Однако новые технологии, такие как JIT-компиляция (компиляция "на лету"), и общие улучшения в процессе трансляции начинают сокращать этот разрыв. Решения, использующие байт-код, обычно демонстрируют промежуточную эффективность. Языки программирования низкого уровня обычно компилируются, особенно когда приоритетом является производительность, а не кроссплатформенность. Для таких языков существует большее соответствие один к одному между написанным кодом и аппаратными операциями, выполняемыми машинным кодом, что позволяет программистам более точно управлять использованием центрального процессора (ЦП) и памяти. При определенных усилиях всегда возможно разработать компиляторы даже для традиционно интерпретируемых языков. Например, Common Lisp можно скомпилировать в байт-код Java (который затем интерпретируется виртуальной машиной Java), в код на C (который затем компилируется в машинный код) или непосредственно в машинный код. Языки программирования, поддерживающие несколько целевых платформ для компиляции, предоставляют разработчикам больше возможностей для выбора между скоростью выполнения, кроссплатформенной совместимостью или областью применения.
Programs compiled into native code at compile time tend to be faster than those translated at runtime due to the translation process's overhead. Newer technologies such as just in time compilation, and general improvements in the translation process are starting to narrow this gap, though. Mixed solutions using bytecode tend toward intermediate efficiency. Low level programming languages are typically compiled, especially when efficiency is the main concern, rather than cross platform support. For such languages, there are more one to one correspondences between the programmed code and the hardware operations performed by machine code, making it easier for programmers to control the use of central processing unit (CPU) and memory in fine detail. With some effort, it is always possible to write compilers even for traditionally interpreted languages. For example, Common Lisp can be compiled to Java bytecode (then interpreted by the Java virtual machine), C code (then compiled to native machine code), or directly to native code. Programming languages that support multiple compiling targets give developers more control to choose either execution speed or cross platform compatibility or usage.