Компилятор против интерпретатора — разница между ними
Что такое компилятор
Это программа, которая преобразует код, написанный на языке программирования высокого уровня, в машинный код.
Что такое интерпретатор
Это программа, которая выполняет код, написанный на языке программирования. Она не переводит его в машинные коды целиком, а построчно принимает команды и сразу выполняет их. Можно отдать интерпретатору команду и сразу понять, сработала ли она.
Ключевая разница между компилятором и интерпретатором
— Компилятор позволяет одновременно проверять как синтаксические, так и семантические ошибки. А интерпретатор только синтаксические ошибки.
— Скомпилированный код работает быстрее, а интерпретируемый код работает медленнее.
— Компилятор отображает все ошибки после компиляции, а интерпретатор отображает ошибки каждой строки одну за другой.
— Компилятор принимает всю программу, а интерпретатор — одну строку кода.
— Компилятор крупнее. Интерпретаторы часто меньше, чем компиляторы.
Что из них лучше?
Это как выбирать между машиной и велосипедом. Смотря, что вам нужно в данный момент. Программа, созданная компилятором, будет работать быстрее. Интерпретированный исходный код легче поддерживать, отлаживать и выпускать для разных платформ. Нет ничего «лучшего» в интерпретации или компиляции, когда мы говорим об абсолютах. Есть много компромиссов, которые необходимо учитывать.
Разница между компилятором и интерпретатором
Какая разница между компилятором и интерпретатором? Может ли язык программирования иметь и компилятор и интерпретатор?
Отслеживать
11.5k 8 8 золотых знаков 42 42 серебряных знака 69 69 бронзовых знаков
задан 23 дек 2016 в 8:09
Salut Amigo Salut Amigo
540 1 1 золотой знак 3 3 серебряных знака 18 18 бронзовых знаков
23 дек 2016 в 8:14
Бейсик имел традиционно много разных компиляторов и интерпретаторов.
23 дек 2016 в 8:24
– user181100
23 дек 2016 в 8:40
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Чтобы опеределить разницу, давайте узнаем, что это такое:
Компиля́тор — программа или техническое средство, выполняющее компиляцию.
Компиля́ция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера). Входной информацией для компилятора (исходный код) является описание алгоритма или программа на предметно-ориентированном языке, а на выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код). Википедия
Интерпрета́тор — программа (разновидность транслятора), выполняющая интерпретацию.
Интерпрета́ция — пооператорный (покомандный, построчный) анализ, обработка и тут же выполнение исходной программы или запроса (в отличие от компиляции, при которой программа транслируется без её выполнения). Википедия
Таким образом, можно заключить, что компилятор преобразует исходный код к близкому к машинному коду. Интерпретатор же, позволяет выполнять некоторое представление программы, налету преобразуя в машинный код.
Если взять язык java , то он имеет, как компилятор, так и интерпретатор. Компилятор преобразует исходный код в байткод. А байткод в начальной стадии выполнения программы обрабатывается интерпретатором.
Компилятор, это отдельная программа javac , интерпретатор же встроен в jvm . Помимо обычного компилятора, в jvm присутствует just-in-time компиляция. т.к. интерпретация довольно медленна, то горячие места в программе компилируются в машинный код jit компилятором, тем самым ускоряя выполнение.
Компиляция и интерпретация кода: что это такое и в чем разница

Наши компьютеры — это переключатели, для которых мы пишем инструкции. При этом для их работы мы пишем тексты на английском (ну или русском, если мы говорим про 1С) языке. Рассказываем, как наши изощренные языковые инструкции превращаются в примитивный двоичный код, при этом абсолютно не теряя смысла.
Это адаптированный перевод статьи A Deeper Inspection Into Compilation And Interpretation от разработчика Vaidehi Joshi из компании Vimeo. Повествование ведется от имени автора.

Если у вас нет способа говорить с компьютером на человеческом языке, то вы вынуждены писать машинный код. При этом даже после появления первых компьютеров программирование как таковое появилось не сразу: тогда вычислительные устройства весили по 13 тонн, занимали комнату, стоили миллионы долларов, а годились только для выполнения арифметических операций.
Бесплатные курсы по программированию в Хекслете
- Освойте азы современных языков программирования
- Изучите работу с Git и командной строкой
- Выберите себе профессию или улучшите навыки

Когда одна программистка из Гарварда научила компьютер понимать инструкции, которые похожи на человеческую речь, ее открытием просто никто не воспользовался — люди не понимали, зачем это нужно. Инженеры 50-х не могли даже представить себе мир, в котором компьютеры выполняют инструкции, а не считают формулы.
Чтобы понять упрямство людей того времени, пройдем вместе с ними этот тернистый путь, выстланный перфокартами.
Все объединяет идея языков
Машинный код в конечном итоге является языком, пусть и очень простым. Код, который пишут программисты, тоже написан на каком-то языке. Если смотреть на два этих кода — машинный и созданный разработчиками, как на два текста на разных языках, становится очевидным, что нам нужен переводчик.
Давайте на минуту представим такой переводчик. Он обязан сохранить смысл текста, но чтобы сделать это хорошо, он также должен:
- Проверить текст на ошибки
- Сделать лексический и синтаксический анализ
- Сохранить результат перевода.
Теперь становится понятно, почему инженерам прошлого, которые до этого видели только калькуляторы, сложно было представить себе переводчик между языками. К счастью для нас, эти трудности не напугали парочку бунтарей — Грейс Хоппер и Стива Рассела. Они работали в разных лабораториях, но оба пошли наперекор начальству и придумали те переводчики, которыми мы пользуемся каждый день.
Чтобы познакомиться с ними, а заодно и с магией перевода, перенесемся в США прошлого века.
От цифр к словам
Преспер Эккерт и Джон Мокли делали компьютеры для военных. Сначала они работали в родном университете, но потом тот стал присваивать патенты преподавателей. Эккерту и Мокли это не понравилось, они ушли и открыли собственную фирму по продаже компьютеров.
Так они получили первый заказ от Бюро переписи населения США, но для этого им пришлось соврать по мелочи — например, занизить цену в три раза, но зато компьютер в итоге получился отличный. Еще бы, ведь над ним работали лучшие инженеры того времени.
В том числе и Грейс Хоппер.
Однажды Хоппер предложила коллегам не мучиться с машинным кодом, а говорить с компьютером на английском языке. Например, сказать ему: «Вычти подоходный налог из зарплаты». Как отреагировали ее коллеги и начальство, вы уже знаете: «Они мягко объяснили мне, что компьютеры могут решать лишь арифметические задачи и что они никогда не смогут выполнять программы», — рассказывала Хоппер в своей биографии «Grace Hopper: Navy Admiral and Computer Pioneer».
Но Грейс Хоппер не так легко сбить с толку. Эта женщина пошла на фронт добровольцем, причем исключительно благодаря напористости — ее не хотели брать из-за дефицита веса. Она закончила обучение с лучшими оценками и стала лучшим инженером штаба.
Хоппер проявила упорство и на новой работе. Она в одиночку придумала первый в мире переводчик, который позволял говорить с компьютером на английском языке. Теперь программировать могли не только математики, а кто угодно! При этом сами программы теперь можно было сделать намного более сложными.
Первым переводчиком был компилятор
Хоппер показала коллегам свой переводчик в 1952 году, и ее проигнорировали. Три года технологией никто не пользовался, пока, наконец, проект не заметили в Министерстве обороны США.
Зачем военным понадобился компьютер, который заказали в Бюро переписи населения? Зачем им нужна была технология Хоппер, на которую махнули рукой ее более авторитетные коллеги?
Дело в устройстве первого переводчика (как говорят в программировании, транслятора). Вот как работал этот транслятор:
- Хоппер писала инструкцию на английском языке — «Вычти подоходный налог»
- Компилятор переводил инструкцию в машинный код — тогда это были цифры и буквы
- Компьютер выполнял машинный код, не зная ничего про инструкцию на английском.
Как вы видите, транслятор Хоппер делал весь перевод текста за один подход. Транслятор, который делает весь перевод за один раз, называется компилятором. Это важный момент, потому что мы познакомимся и с другим видом трансляторов, интерпретатором, но для этого нужно подробнее изучить именно работу компиляторов.

Для Хоппера было важно, что благодаря компилятору инструкции можно было писать на языке программирования, похожим на человеческий — это был прообраз COBOL. Военных интересовало другое: в результате работы компилятора пользователь мог пользоваться программой, но не мог прочитать ее исходный код.
Военные давно искали способ делиться программами так, чтобы никто не мог узнать их исходный код. В том числе по этой причине мы до сих пор пользуемся скомпилированными программами, тогда как во времена Хоппер были только перфокарты, но принцип остался тем же.

Люди в американском правительстве считали компилятор временным решением. Однако концепция трансляторов, как и принципы языка COBOL, прочно вошли в инженерные практики на многие годы.
Но когда вы пишете код, то можете запустить его, не компилируя. Вы построчно видите выполнение кода в консоли и работаете с ошибками «на лету». Это работа интерпретатора — другого вида трансляции в машинный код.
Этот транслятор придумал другой бунтарь: его тоже отвергали авторитеты, и он тоже определил черты индустрии на многие годы. История Хоппер повторилась, но в этот раз в другом штате.
Как интерпретатор делает построчную трансляцию
На дворе идет 1958 год, компиляторы давно и успешно используются — в том числе в Массачусетском технологическом университете, где стоит IBM 704. Эта гигантская дорогая штуковина занимает всю комнату. И на ней куется Lisp — язык, на котором 30 лет после этого писался весь код для разработок в области искусственного интеллекта.
Но сейчас, в октябре 58-го, один из местных разработчиков прохлаждается вместо того, чтобы кормить адскую машину перфокартами. Он углубился в чтение статьи своего профессора и по совместительству босса, Джона Маккарти. Бездельника звали Стив Рассел.
«Потом Стив подошел ко мне и сказал: «Слушай, а почему у нас нет функции eval?». Я посмеялся конечно, и отвечаю: «Слушай, не путай теорию и практику, хорошо? Eval — это теоретическое понятие»», — Джон Маккарти для симпозиума ACM 1984 года.
Маккарти хотел как лучше, отказывая Расселу в проекте. Подумайте сами: eval — это команда, которая превращает любую строку в функцию и потом еще выполняет ее. Это два действия за один перевод! Невыполнимый трюк для транслятора, который умеет отдавать процессору только одну инструкцию за раз.
Рассел нашел решение всего за пару месяцев: он создал транслятор, который запускает код построчно. Такой транслятор и называется интерпретатором. Кстати, вы используете его и на Хекслете: пишете код и тут же запускаете без компиляции, чтобы отловить ошибки.

Построчный запуск кода — непростая задача. Потребуется скомпилировать код вручную много-много раз, прежде чем вы сможете создать свой первый интерпретатор.
Но если вы просто будете отправлять инструкции процессору построчно, то у вас не будет интерпретатора. Он отправляет результат перевода не в процессор, а обратно в программу — это позволяет создавать интересные многоступенчатые команды вроде eval .
От транслятора зависит не только опыт программиста, но и опыт пользователя. Как запустить код на любой операционной системе? Какой транслятор работает быстрее? Ответ в следующем разделе статьи.
Транслятор влияет на опыт пользователя
Представьте, что вы проходите уроки по циклам и решаете там задачи. Однажды вам попадается интересный ответ другого студента, поэтому вы копируете его код в редактор и смотрите на вывод в консоли.
Вы, как пользователь кода, запустили программу через интерпретатор. Так как это программа от студента и для студента, то здорово, что код не скомпилирован в исполняемый файл: вы можете посмотреть и отредактировать его.

Еще нам неважно, что у другого студента MacOS, а у вас — Windows: интерпретатор берет всю работу по совместимости на себя, для работы кода важно, чтобы у всех стоял интерпретатор.
Интерпретация идеальна для распространения небольших программ, но для больших проектов не подойдет.
Для крупных проектов выбирают компиляцию: компиляция быстрее и безопаснее, хотя времени на этот процесс может уйти очень много. Только вот придется озаботиться проблемами совместимости, хотя мы уже привыкли устанавливать только подходящие нашему железу и софту программы.

Компилятор и интерпретатор делают одну и ту же работу, так почему компилятор быстрее?
Компиляция работает быстрее интерпретации, потому что компилятор запускается только один раз: делает перевод и отдает его процессору. Интерпретатор же запускается на каждой строке кода и нужен при каждом запуске программы. Кроме того, программный код в компиляторе уже переведен в машинный, поэтому требуется намного меньше времени для его исполнения.
За последние десять минут мы прошли путь, который занял у программистов двенадцать лет, но оно стоило того: мы научили машины говорить с нами на одном языке.
Бесплатные курсы по программированию в Хекслете
- Освойте азы современных языков программирования
- Изучите работу с Git и командной строкой
- Выберите себе профессию или улучшите навыки
Какая разница между Интерпретацией и Компиляцией в обработке?
В чём суть разницы этих подходов?
Про интерпретацию читал, что это мгновенное выполнение, без превращения её в машинный код, но она же должна обработаться процесером, который понимает только машинный код? Как она тогда работает?
А Компиляция уже более понятно к логике, что преобразует код в машинный, а там уже процессор мутит свои дела и мы получаем результат.
По логике что выходит, на каком языке у нас получится продуктивнее сервер, Java или php?
- Вопрос задан более трёх лет назад
- 3538 просмотров
Комментировать
Решения вопроса 2

finishhim.ru
Компиляция — это один раз преобразуем наш код в машинный и пользуем потом всегда.
Интерпретация — каждый раз преобразуем код в машинный, там просто цепочка длиннее.
Конечно скомпилированные программы обычно быстрее работают, но раньше компиляция долго шла сама по себе, например 30 минут. Сейчас появлением, например, golang программа может и компилироваться за секунду, это позволяет вносить изменения в большой проект очень часто.
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать

Вы никогда не писали калькулятор с простейшим парсингом арифметических выражений?
var str = "5+3"; if (str.Contains('+')) < var result = Int(str.Split('+')[0]) + Int(str.Split('+')[1]); >else if (str.Contains('-'))
Это ведь уже простейший интерпретатор, хоть в нем и нет нормальной реализации ни лексического, ни синтаксического анализатора, но даже такого г..нокода достаточно, чтобы понимать, как работает интерпретатор, и как так получается, что если во входной строке знак «+» то в итоге процессор складывает значения, а если «-» то вычитает.
А вы, видимо, даже до такого г..нокода не можете додуматься, а хотите делать какие-то глобальные выводы про продуктивность Java и PHP.
Не нужно вам лезть в такие дебри, теория без практики — мертва, она превращается в лженауку.
Лучше попробуйте написать сайт на PHP, а затем на Java, пользы будет в десятки раз больше, чем от пространных рассуждений «хелловорлдщика».
Ответ написан более трёх лет назад
Нравится 1 8 комментариев

Ingernirated @Ingernirated Автор вопроса
Видимо вы не можете простой текст прочитать, что пишите такие опрометчивые ответы.
Я всего лишь задал вопрос, никому ничего не навязывая.

Ingernirated: Ошибаетесь. Могу. А вот вы не можете понять ответ, и вообще в голове каша, поскольку нет практического опыта, а лишь обрывки теории.
Я прокомментировал вот этот абзац:
Про интерпретацию читал, что это мгновенное выполнение, без превращения её в машинный код, но она же должна обработаться процесером, который понимает только машинный код?
Я объяснил, как работает интерпретация, привел исходный код простейшего интерпретатора.
Было еще два абзаца — «какая разница между интерпретацией и компиляцией», и про продуктивность Java vs PHP.
Но понимание разницы автоматически вытекает из понимания интерпретации, а насчет продуктивности, я и ответил, что это бред, связывать ее с тем, интерпретируемый ли ЯП или JIT-компилируемый. С таким же успехом можно по форме черепа создателя ЯП определять его продуктивность, и задавать вопросы, основанные на этом ложном тезисе.
Я всего лишь задал вопрос, никому ничего не навязывая.
Мне, извините, до фени, навязываете вы что-то или просто заблуждаетесь, задали вопрос — я на него ответил, а если не хотите меня слушать, а вместо этого лезете в залнарываетесь на конфликт, то это ваше право, но я могу вас запомнить, вот пройдет полгода, зададите потом реальный вопрос а не «диванно-теоретический» — а я вспомнив вашу неадекватность не захочу на него отвечать, а я порой на такое отвечаю, что если не я, то фиг кто еще, и останется ваш вопрос без ответа.