компилятор — Разница между компилятором и интерпретатором
Какая разница между компилятором и интерпретатором? Может ли язык программирования иметь и компилятор и интерпретатор?
- компилятор
- терминология
- интерпретатор
3
Чтобы опеределить разницу, давайте узнаем, что это такое:
Компиля́тор — программа или техническое средство, выполняющее компиляцию.
Компиля́ция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера). Входной информацией для компилятора (исходный код) является описание алгоритма или программа на предметно-ориентированном языке, а на выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код). Википедия
Интерпрета́тор — программа (разновидность транслятора), выполняющая интерпретацию.
Интерпрета́ция — пооператорный (покомандный, построчный) анализ, обработка и тут же выполнение исходной программы или запроса (в отличие от компиляции, при которой программа транслируется без её выполнения). Википедия
Таким образом, можно заключить, что компилятор преобразует исходный код к близкому к машинному коду. Интерпретатор же, позволяет выполнять некоторое представление программы, налету преобразуя в машинный код.
Если взять язык java
, то он имеет, как компилятор, так и интерпретатор. Компилятор преобразует исходный код в байткод. А байткод в начальной стадии выполнения программы обрабатывается интерпретатором.
Компилятор, это отдельная программа
, интерпретатор же встроен в jvm
. Помимо обычного компилятора, в jvm
присутствует just-in-time
компиляция. т.к. интерпретация довольно медленна, то горячие места в программе компилируются в машинный код jit
компилятором, тем самым ускоряя выполнение.
6
1) Разница в том, что компилятор преобразует код алгоритмического языка в исполняемый (байт-код либо нативный) код (в пределе — в машинные коды), в то время как интерпретатор самостоятельно распознаёт и выполняет построчно инструкции программного кода.
2) Да, может. Даже древние turbo/quick basic — и те могли. Причём Borland Turbo BASIC был «в одном флаконе», в то время как Microsoft Quick Basic использовал, как и все современные, внешний компилятор.
UPD: Наверное, можно ещё сформулировать так: интерпретатор для выполнения программы обязан располагать исходным кодом программы (в исходном либо формализованном виде) на алгоритмическом языке, в то время как компиляция создаёт исполняемый модуль, который не содержит текста программы на алгоритмическом языке. Также, если при компиляции не добавляется отладочная информация, невозможно полное восстановление исходного кода.
интерпретатор выполняет программу, трансляторы в т.ч. компиляторы преобразуют без выполнения
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
python — В чем преимущество интерпретируемых языков перед компилируемыми?
В чем преимущество интерпретируемых языков перед компилируемыми?
Википедия говорит например что преимущества это
кроссплатформенность
Java — кроссплатформенный компилируемый язык со строгой типизацией.
пошаговое отслеживание (отладка)
Компиляция препятствует отладке и в интерпретируемых языках. Сложные вложенные list comprehensions с генераторами сложно отлаживать пошагово потому что это сложные конструкции со сложными правилами (хотя они хотят выглядеть легкими и приятными).
динамическая типизация
Lisp компилируется в машинный код и у него динамическая типизация. В компилируемом языке Julia динамическая типизация, а компилятор порождает столько вариантов процедуры, сколько будет вариантов типов входных параметров для неё.
Вроде бы все абсолютно логично но можно предположить что мы можем перед выполнением компилируемой программы просто собирать ее т.е. грубо говоря вместо команды выполнения будет команды сборки+выполнения из этого предположения следую вопросы к этим пунктам
Если мы однажды должны установить интерпретатор по нашу ос+архитектуру и т.п. почему мы не можем установить компилятор так же под нашу ос и собирать каждый раз проект из исходников например с++
Всё так и есть, разницы почти нет.
На данный момент мы же можем отлаживать код С++ пошагово? не совсем понимаю этот пункт
Можете, если не применяли агрессивные оптимизации. Чем сильнее оптимизируется код, тем слабее соответствие между исходным кодом и машинными инструкциями. Замечу что для C есть чистые интерпретаторы, хотя они мало полезны в отладке из-за недостаточной переносимости языка.
Вроде бы динамическая типизация жестко не привязана к интерпретируемым языкам т.е. может быть реализована и в компилируемых?
Да, примеры были выше.
И будет ли компиляция+запуск дольше чем интерпретация? т.е. можно ли говорить о том что из этого быстрее?
Обычно интерпретаторы стартуют быстрее потому что у них простые компиляторы без глубоких оптимизаций. Но Pascal компилировался в машинный код (Turbo Pascal). Исходный код Паскаля рассчитан на однопроходную компиляцию. IDE работала быстрее чем QBasic.
Разделение интерпретатор/компилятор имеет исторические корни. Первые интерпретируемые языки не проводили компиляцию (BASIC). Сам язык BASIC со строчно-ориентированным синтаксисом разработан для построчной интерпретации.
Компилятор ТурбоПаскаля порождал машинный код в один проход, без введения промежуточного представления чтобы расходовать меньше памяти (он вообще весь работал в памяти без обращения к диску — диском была медленная дискета).
Позже, когда памяти и процессора стало больше, компиляторы и интерпретаторы стали заимствовать технологии друг у друга. Всё смешалось.
Предлагаю другую классификацию: динамическая/статическая типизация и возможность исполнения произвольного кода во время исполнения программы.
Разница между компилятором и интерпретатором
Компиляторы и интерпретаторы — это программы, которые помогают преобразовывать язык высокого уровня (исходный код) в машинные коды, понятные компьютерам. Компьютерные программы обычно пишутся на языках высокого уровня. Язык высокого уровня — это язык, понятный человеку. Чтобы было понятно, они содержат слова и фразы из общеупотребительных языков — например, английского или других языков. Однако компьютеры не могут понимать языки высокого уровня, как мы, люди. Они могут понимать только программы, разработанные в двоичных системах, известных как машинный код. Начнем с того, что компьютерная программа обычно пишется на языке высокого уровня, описываемом как исходный код. Эти исходные коды должны быть преобразованы в машинный язык, и здесь наступает роль компиляторов и интерпретаторов.
Реклама
Различия между интерпретатором и компилятором | |
Интерпретатор переводит в машинный код только одно выражение программы за раз. | Компилятор сканирует всю программу и сразу переводит ее целиком в машинный код. |
Интерпретатору требуется гораздо меньше времени для анализа исходного кода. Однако общее время выполнения процесса намного медленнее. | Компилятору требуется много времени для анализа исходного кода. Однако общее время, необходимое для выполнения процесса, намного меньше. |
Интерпретатор не генерирует промежуточный код. Следовательно, интерпретатор очень эффективен с точки зрения его памяти. | Компилятор всегда генерирует промежуточный объектный код. Это потребует дальнейшего связывания. Следовательно, требуется больше памяти. |
Продолжает непрерывно переводить программу до тех пор, пока не будет обнаружена первая ошибка. Если обнаружена какая-либо ошибка, она перестает работать, и, следовательно, отладка упрощается. | Компилятор выдает сообщение об ошибке только после сканирования всей программы, поэтому отладка при работе с компилятором относительно сложнее. |
Интерпретаторы используются, например, в таких языках программирования, как Ruby и Python. | Компиляторы используются, например, в таких языках программирования, как C и C++. |
Как работают интерпретатор и компилятор?
Для начала компилятор создает программу. Он проанализирует все языковые операторы, чтобы проверить их правильность. Если он столкнется с чем-то неправильным, он выдаст сообщение об ошибке. Если ошибок не обнаружено, компилятор преобразует исходный код в машинный код. Компилятор связывает различные файлы кода в программы, которые можно запускать, такие как exe. Наконец программа запускается.
Интерпретатор создает программу. Он не связывает файлы и не генерирует машинный код. Исходные операторы выполняются построчно во время выполнения программы.
Реклама
Преимущества и недостатки интерпретатора и компилятора
В случае использования компиляторов программный код уже транслируется в машинный код и, следовательно, время на выполнение кода очень меньше. С другой стороны, невозможно изменить программу, не вернувшись к исходному коду при работе с компилятором.
Интерпретаторы значительно упрощают работу с исходным кодом. Следовательно, они очень подходят, особенно для начинающих. С другой стороны, интерпретируемые программы могут работать только на тех компьютерах, на которых установлены соответствующие интерпретаторы.
Разница между компилятором и интерпретатором
Типичная компьютерная программа обычно существует на языках высокого уровня, понятных человеку. Таким образом, они содержат различные фразы и слова из английского языка (или любого другого общеупотребительного). Компьютеры, с другой стороны, не могут понимать эти языки, как мы, но могут понимать программу в двоичном коде. В результате мы сначала пишем программу на языке высокого уровня (исходный код), конвертируем ее в машинный язык и делаем читаемой для компьютеров.
Что такое компилятор?
Компилятор — это транслятор, который производит вывод языка низкого уровня (например, ассемблера или машинного языка), принимая входные данные языка высокого уровня. Это в основном компьютерная программа, используемая для преобразования кодов, написанных на языке программирования, в машинный код (удобочитаемый код в двоичный язык 0 и 1 бит для понимания компьютерным процессором). Затем компьютер обрабатывает машинный код для выполнения соответствующих задач.
- Компиляторы проверяют все типы ошибок, пределы и диапазоны. Таким образом, он более интеллектуален.
- Время выполнения его программы больше, и он занимает больше памяти.
Кто такой переводчик?
Это программа, предназначенная для перевода языка программирования в понятный язык. Это компьютерная программа, используемая для преобразования операторов программы высокого уровня в машинные коды. Он включает в себя предварительно скомпилированный код, исходный код и скрипты.
- Интерпретатор переводит только один оператор за раз в программе.
- Они создают исполняемый файл языка программирования перед запуском программы.
Разница между компилятором и интерпретатором
Параметр | Компилятор | Переводчик |
Шаги программирования |
|
|
Преимущество | Время выполнения кода сравнительно меньше, поскольку программный код уже транслируется в машинный код. | Они довольно просты в использовании и выполнении даже для новичка. |
Недостаток | Нельзя изменить программу, не вернувшись к исходному коду. | Только компьютеры с соответствующим Интерпретатором могут запускать интерпретируемые программы. |
Машинный код | Сохраняет машинный язык на диске в виде машинного кода. | Вообще не сохраняет машинный язык. |
Время работы | Скомпилированные коды работают сравнительно быстрее. | Интерпретируемые коды работают сравнительно медленнее. |
Модель | Работает по модели «язык-перевод-связывание-загрузка». | Работает на основе метода интерпретации. |
Генерация программы | Генерирует программу вывода в формате exe. Пользователь может запускать ее независимо от изначально задуманной программы. | Программа вывода не создается. Это означает, что он оценивает исходную программу каждый раз во время индивидуального выполнения. |
Исполнение | Можно отделить выполнение программы от компиляции. Таким образом, вы можете выполнить его только после завершения компиляции всего вывода. | Выполнение программы является одним из этапов процесса интерпретации. Таким образом, вы можете выполнять его построчно. |
Требование к памяти | Целевые программы выполняются независимо. Им не требуется компилятор в памяти. | Интерпретатор изначально существует в памяти на момент интерпретации. |
Подходит для | Вы не можете портировать компилятор, поскольку он остается привязанным к конкретной целевой машине. Модель компиляции очень распространена в таких языках программирования, как C и C++. | Они лучше всего работают в веб-средах, где время загрузки очень важно. Компиляция занимает относительно много времени, даже для небольших кодов, которые могут не запускаться несколько раз из-за исчерпывающего анализа. Интерпретации лучше в таких случаях. |
Оптимизация кода | Компилятор может видеть весь код заранее. Таким образом, он заставляет коды работать быстрее, выполняя множество оптимизаций. | Интерпретатор видит код построчно. Таким образом, оптимизация не очень надежна по сравнению с компиляторами. |
Динамическая типизация | Компиляторы очень сложно внедрить, потому что они не могут предсказать ничего, что произойдет во время хода. | Интерпретируемый язык поддерживает динамическую типизацию. |
Использование | Лучше всего подходит для производственной среды. | Лучше всего подходит для среды программирования и разработки. |
Выполнение ошибки | Компилятор отображает каждую ошибку и предупреждение во время компиляции. |