что это такое и в чем разница
Время чтения статьи ~8 минут
Наши компьютеры — это переключатели, для которых мы пишем инструкции. При этом для их работы мы пишем тексты на английском (ну или русском, если мы говорим про 1С) языке. Рассказываем, как наши изощренные языковые инструкции превращаются в примитивный двоичный код, при этом абсолютно не теряя смысла.
Это адаптированный перевод статьи A Deeper Inspection Into Compilation And Interpretation от разработчика Vaidehi Joshi из компании Vimeo. Повествование ведется от имени автора.
Если у вас нет способа говорить с компьютером на человеческом языке, то вы вынуждены писать машинный код. При этом даже после появления первых компьютеров программирование как таковое появилось не сразу: тогда вычислительные устройства весили по 13 тонн, занимали комнату, стоили миллионы долларов, а годились только для выполнения арифметических операций.
Когда одна программистка из Гарварда научила компьютер понимать инструкции, которые похожи на человеческую речь, ее открытием просто никто не воспользовался — люди не понимали, зачем это нужно.
Чтобы понять упрямство людей того времени, пройдем вместе с ними этот тернистый путь, выстланный перфокартами.
Все объединяет идея языков
Машинный код в конечном итоге является языком, пусть и очень простым. Код, который пишут программисты, тоже написан на каком-то языке. Если смотреть на два этих кода — машинный и созданный разработчиками, как на два текста на разных языках, становится очевидным, что нам нужен переводчик.
Давайте на минуту представим такой переводчик. Он обязан сохранить смысл текста, но чтобы сделать это хорошо, он также должен:
- Проверить текст на ошибки
- Сделать лексический и синтаксический анализ
- Сохранить результат перевода.
Теперь становится понятно, почему инженерам прошлого, которые до этого видели только калькуляторы, сложно было представить себе переводчик между языками. К счастью для нас, эти трудности не напугали парочку бунтарей — Грейс Хоппер и Стива Рассела. Они работали в разных лабораториях, но оба пошли наперекор начальству и придумали те переводчики, которыми мы пользуемся каждый день.
Чтобы познакомиться с ними, а заодно и с магией перевода, перенесемся в США прошлого века.
От цифр к словам
Преспер Эккерт и Джон Мокли делали компьютеры для военных. Сначала они работали в родном университете, но потом тот стал присваивать патенты преподавателей. Эккерту и Мокли это не понравилось, они ушли и открыли собственную фирму по продаже компьютеров.
Так они получили первый заказ от Бюро переписи населения США, но для этого им пришлось соврать по мелочи — например, занизить цену в три раза, но зато компьютер в итоге получился отличный. Еще бы, ведь над ним работали лучшие инженеры того времени.
В том числе и Грейс Хоппер.
Читайте также: От эксперимента до стандарта. Пионеры веба рассказывают историю появления синей гиперссылки
Однажды Хоппер предложила коллегам не мучиться с машинным кодом, а говорить с компьютером на английском языке. Например, сказать ему: «Вычти подоходный налог из зарплаты». Как отреагировали ее коллеги и начальство, вы уже знаете: «Они мягко объяснили мне, что компьютеры могут решать лишь арифметические задачи и что они никогда не смогут выполнять программы», — рассказывала Хоппер в своей биографии «Grace Hopper: Navy Admiral and Computer Pioneer».
Но Грейс Хоппер не так легко сбить с толку. Эта женщина пошла на фронт добровольцем, причем исключительно благодаря напористости — ее не хотели брать из-за дефицита веса. Она закончила обучение с лучшими оценками и стала лучшим инженером штаба.
Хоппер проявила упорство и на новой работе. Она в одиночку придумала первый в мире переводчик, который позволял говорить с компьютером на английском языке. Теперь программировать могли не только математики, а кто угодно! При этом сами программы теперь можно было сделать намного более сложными.
Первым переводчиком был компилятор
Хоппер показала коллегам свой переводчик в 1952 году, и ее проигнорировали. Три года технологией никто не пользовался, пока, наконец, проект не заметили в Министерстве обороны США.
Зачем военным понадобился компьютер, который заказали в Бюро переписи населения? Зачем им нужна была технология Хоппер, на которую махнули рукой ее более авторитетные коллеги?
Дело в устройстве первого переводчика (как говорят в программировании, транслятора). Вот как работал этот транслятор:
- Хоппер писала инструкцию на английском языке — «Вычти подоходный налог»
- Компилятор переводил инструкцию в машинный код — тогда это были цифры и буквы
- Компьютер выполнял машинный код, не зная ничего про инструкцию на английском.
Как вы видите, транслятор Хоппер делал весь перевод текста за один подход. Транслятор, который делает весь перевод за один раз, называется компилятором. Это важный момент, потому что мы познакомимся и с другим видом трансляторов, интерпретатором, но для этого нужно подробнее изучить именно работу компиляторов.
Для Хоппера было важно, что благодаря компилятору инструкции можно было писать на языке программирования, похожим на человеческий — это был прообраз COBOL. Военных интересовало другое: в результате работы компилятора пользователь мог пользоваться программой, но не мог прочитать ее исходный код.
Военные давно искали способ делиться программами так, чтобы никто не мог узнать их исходный код. В том числе по этой причине мы до сих пор пользуемся скомпилированными программами, тогда как во времена Хоппер были только перфокарты, но принцип остался тем же.
Люди в американском правительстве считали компилятор временным решением. Однако концепция трансляторов, как и принципы языка COBOL, прочно вошли в инженерные практики на многие годы.
Но когда вы пишете код, то можете запустить его, не компилируя. Вы построчно видите выполнение кода в консоли и работаете с ошибками «на лету». Это работа интерпретатора — другого вида трансляции в машинный код.
Этот транслятор придумал другой бунтарь: его тоже отвергали авторитеты, и он тоже определил черты индустрии на многие годы.
Как интерпретатор делает построчную трансляцию
На дворе идет 1958 год, компиляторы давно и успешно используются — в том числе в Массачусетском технологическом университете, где стоит IBM 704. Эта гигантская дорогая штуковина занимает всю комнату. И на ней куется Lisp — язык, на котором 30 лет после этого писался весь код для разработок в области искусственного интеллекта.
Но сейчас, в октябре 58-го, один из местных разработчиков прохлаждается вместо того, чтобы кормить адскую машину перфокартами. Он углубился в чтение статьи своего профессора и по совместительству босса, Джона Маккарти. Бездельника звали Стив Рассел.
«Потом Стив подошел ко мне и сказал: «Слушай, а почему у нас нет функции eval?». Я посмеялся конечно, и отвечаю: «Слушай, не путай теорию и практику, хорошо? Eval — это теоретическое понятие»», — Джон Маккарти для симпозиума ACM 1984 года.
Маккарти хотел как лучше, отказывая Расселу в проекте. Подумайте сами:
eval
— это команда, которая превращает любую строку в функцию и потом еще выполняет ее. Это два действия за один перевод! Невыполнимый трюк для транслятора, который умеет отдавать процессору только одну инструкцию за раз.
Рассел нашел решение всего за пару месяцев: он создал транслятор, который запускает код построчно. Такой транслятор и называется интерпретатором. Кстати, вы используете его и на Хекслете: пишете код и тут же запускаете без компиляции, чтобы отловить ошибки.
Построчный запуск кода — непростая задача. Потребуется скомпилировать код вручную много-много раз, прежде чем вы сможете создать свой первый интерпретатор.
Но если вы просто будете отправлять инструкции процессору построчно, то у вас не будет интерпретатора. Он отправляет результат перевода не в процессор, а обратно в программу — это позволяет создавать интересные многоступенчатые команды вроде
eval
.От транслятора зависит не только опыт программиста, но и опыт пользователя. Как запустить код на любой операционной системе? Какой транслятор работает быстрее? Ответ в следующем разделе статьи.
Транслятор влияет на опыт пользователя
Представьте, что вы проходите уроки по циклам и решаете там задачи. Однажды вам попадается интересный ответ другого студента, поэтому вы копируете его код в редактор и смотрите на вывод в консоли.
Вы, как пользователь кода, запустили программу через интерпретатор. Так как это программа от студента и для студента, то здорово, что код не скомпилирован в исполняемый файл: вы можете посмотреть и отредактировать его.
Еще нам неважно, что у другого студента MacOS, а у вас — Windows: интерпретатор берет всю работу по совместимости на себя, для работы кода важно, чтобы у всех стоял интерпретатор.
Интерпретация идеальна для распространения небольших программ, но для больших проектов не подойдет.
Для крупных проектов выбирают компиляцию: компиляция быстрее и безопаснее, хотя времени на этот процесс может уйти очень много. Только вот придется озаботиться проблемами совместимости, хотя мы уже привыкли устанавливать только подходящие нашему железу и софту программы.
Компилятор и интерпретатор делают одну и ту же работу, так почему компилятор быстрее?
Компиляция работает быстрее интерпретации, потому что компилятор запускается только один раз: делает перевод и отдает его процессору. Интерпретатор же запускается на каждой строке кода и нужен при каждом запуске программы. Кроме того, программный код в компиляторе уже переведен в машинный, поэтому требуется намного меньше времени для его исполнения.
За последние десять минут мы прошли путь, который занял у программистов двенадцать лет, но оно стоило того: мы научили машины говорить с нами на одном языке.
Никогда не останавливайтесь: В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях
2.

Выбирете интересующий вас раздел > Глава 2 Структура программного обеспечения > 2.3 Понятие транслятора, компилятора и интерпретатора
|
Различие между компилятором и интерпретатором
Оба компилятора и интерпретатора выполняют схожие функции. Интерпретаторы и компиляторы преобразуют исходный код (HLL) в машинный код (понятный компьютеру). Как правило, компьютерные программы существуют на языке высокого уровня, который человек может легко понять. Но компьютеры не могут понимать тот же язык высокого уровня, поэтому для компьютеров мы должны преобразовать их в машинный язык и сделать их читаемыми для компьютеров. В этой статье мы рассмотрим различия между ними.
Компилятор
Компилятор — это транслятор, который принимает ввод, т. е. язык высокого уровня, и производит вывод на языке низкого уровня, т. е. машинном языке или языке ассемблера. Работа компилятора заключается в преобразовании кодов, написанных на языке программирования, в машинный код (в формате 0 и 1), чтобы компьютеры могли его понять.
- Компилятор умнее ассемблера, он проверяет всевозможные пределы, диапазоны, ошибки и т.д.
- Но время выполнения его программы больше и занимает большую часть памяти. У него низкая скорость, потому что компилятор выполняет всю программу, а затем переводит всю программу в машинные коды.
Роль компилятора
Для преобразования кода, написанного на языке высокого уровня, в язык машинного уровня, чтобы компьютеры могли его легко понять, мы используем компилятор. Преобразования в основном преобразуют язык высокого уровня в промежуточный язык ассемблера с помощью компилятора, а затем ассемблером ассемблируют его в машинный код.
Компилятор
Преимущества компилятора
- Скомпилированный код выполняется быстрее по сравнению с интерпретируемым кодом.
- Компиляторы помогают повысить безопасность приложений.
- Поскольку компиляторы предоставляют инструменты отладки, которые помогают легко исправлять ошибки.
Недостатки компилятора
- Компилятор может ловить только синтаксические ошибки и некоторые семантические ошибки.
- Компиляция может занять больше времени в случае объемного кода.
Интерпретатор
Интерпретатор — это программа, переводящая язык программирования на понятный язык. Интерпретатор преобразует язык высокого уровня в язык-посредник. Он содержит предварительно скомпилированный код, исходный код и т. д.
- Одновременно транслирует только один оператор программы.
- Интерпретаторы чаще всего меньше компиляторов.
Роль переводчика
Простая роль переводчика заключается в переводе материала на целевой язык. Интерпретатор работает построчно над кодом. Он также преобразует язык высокого уровня в машинный язык.
Интерпретатор
Преимущества интерпретатора
- Программы, написанные на интерпретируемом языке, легче отлаживать.
- Интерпретаторы позволяют автоматически управлять памятью, что снижает риск ошибок памяти.
- Интерпретируемый язык более гибкий, чем компилируемый.
Недостатки интерпретатора
- Интерпретатор может запускать только соответствующую интерпретируемую программу.
- Интерпретируемый код работает медленнее по сравнению с скомпилированным кодом.
Разница между компилятором и интерпретатором
Компилятор | Переводчик |
---|---|
Этапы программирования:
| Шаги программирования:
|
Компилятор сохраняет машинный язык в форме машинного кода на дисках. | Интерпретатор не сохраняет машинный язык. |
Скомпилированные коды работают быстрее, чем интерпретатор. | Интерпретируемые коды работают медленнее, чем компилятор. |
Модель связывания-загрузки является базовой рабочей моделью компилятора. | Модель интерпретации — это базовая рабочая модель интерпретатора. |
Компилятор создает вывод в виде (.exe). | Интерпретатор ничего не выводит. |
Любое изменение исходной программы после компиляции требует перекомпиляции всего кода. | Любое изменение исходной программы при переводе не требует повторного перевода всего кода. |
Ошибки отображаются в компиляторе после совместной компиляции в текущее время. | Ошибки отображаются в каждой строке. |
Компилятор может видеть код заранее, что помогает выполнять код быстрее благодаря выполнению оптимизации. | Интерпретатор работает построчно, поэтому оптимизация немного медленнее по сравнению с компиляторами. |
Не требует исходного кода для последующего выполнения. | Для последующего выполнения требуется исходный код. |
Выполнение программы происходит только после компиляции всей программы. | Выполнение программы происходит после проверки или оценки каждой строки. |
Компиляторы чаще тратят большое количество времени на анализ исходного кода. | Для сравнения, интерпретаторам требуется меньше времени для анализа исходного кода. |
Использование ЦП больше в случае компилятора. | Использование ЦП меньше в случае интерпретатора. |
Использование компиляторов в основном происходит в производственной среде. | Компиляторы в основном используются в средах программирования и разработки. |
Код объекта постоянно сохраняется для использования в будущем. | Код объекта не сохраняется для использования в будущем. |
C, C++, C# и т. д. — это языки программирования, основанные на компиляторе. | Python, Ruby, Perl, SNOBOL, MATLAB и т. д. — это языки программирования, основанные на интерпретаторе. |
Часто задаваемые вопросы
1. Что лучше: интерпретатор или компилятор?
Интерпретатор полезен в случае отладки, но он медленнее, а компилятор работает с полным кодом, устранение ошибок становится сложной задачей. Следовательно, какой из них лучше, полностью зависит от того, какую работу должен выполнять пользователь.
2. Что быстрее: интерпретатор или компилятор?
При рассмотрении любого процесса интерпретатор работает быстрее, чем компилятор. Но всякий раз, когда какая-либо программа уже скомпилирована, в этом случае выполнение скомпилированной программы выполняется быстрее, чем интерпретируемой программы.
3. Перечислите типы компиляторов?
Ниже перечислены некоторые типы компиляторов:
- Кросс-компилятор
- Собственный компилятор
- Компилятор Bootstrap
- Декомпилятор
- Компиляция исходного кода iler
- Language Rewriter
- Компилятор байт-кода
- Just-in -time Compiler
4. Перечислите типы интерпретаторов?
Ниже перечислены некоторые типы переводчиков:
- Интерпретатор байт-кода
- Интерпретатор поточного кода
- Интерпретатор абстрактного синтаксического дерева
- Своевременная компиляция
Разница между компилятором и интерпретатором
900 74следующий → ← предыдущая
В основном мы пишем компьютерную программу на языках высокого уровня , понятных людям. Языки высокого уровня содержат слова и фразы из человеческих языков, например английского. Язык программирования высокого уровня также известен как 9. 0087 исходный код в компьютерной программе. Однако компьютерная машина не понимает эти языки программирования высокого уровня. Он понял только свой машинный код , то есть программу в 0 и 1 в двоичной форме для выполнения задачи соответственно.
Чтобы выполнить инструкцию, написанную на языке высокого уровня, через компьютер, нам нужно преобразовать ее в машинный язык. Для этого либо компилятор , либо интерпретатор , либо оба используются для преобразования исходного кода языка программирования в машинный код. Компилятор и интерпретатор — это программы, которые преобразуют язык высокого уровня в машинный язык (двоичную форму нулей и единиц), который компьютер может понимать и выполнять задачи в соответствии с инструкциями программы. Но есть различия в рабочем процессе и шагах компилятора и интерпретатора. Прежде чем углубиться в разницу между компилятором и интерпретатором, давайте кратко рассмотрим их обоих.
Компилятор
Компилятор — это программа, которая следует правилам синтаксиса языка программирования для преобразования исходного кода в машинный код. Он не может исправить какую-либо ошибку, если она присутствует в программе; он генерирует сообщение об ошибке, и вы должны исправить его самостоятельно в синтаксисе программы. Если написанная вами программа верна (не содержит ошибок), то компилятор преобразует весь ваш исходный код в машинный код. Компилятор сразу преобразует полный исходный код в машинный код. И, наконец, ваша программа выполняется.
Все этапы компиляции исходного кода выполняются в две фазы: Фаза анализа и Фаза синтеза .
- Фаза анализа: Эта фаза компиляции также известна как фаза переднего плана, на которой исходный код делится на основные части для проверки грамматики, синтаксиса и семантики кода; после этого генерируется промежуточный код . Этап анализа процесса компиляции включает в себя лексический анализатор, семантический анализатор и синтаксический анализатор.
- Фаза синтеза: Фаза синтеза также известна как фаза бэкенда, на которой промежуточный код (который был сгенерирован на этапе анализа) оптимизируется и генерируется в целевом машинном коде . Этап синтеза процесса компиляции включает в себя задачи оптимизатора кода и генератора кода.
Переводчик
Интерпретатор — это также программа, которая переводит исходный код на машинный язык. Однако интерпретатор преобразует язык программирования высокого уровня в машинный язык построчно при интерпретации и запуске программы.
Разница между компилятором и интерпретатором
Разные типы | Компилятор | Переводчик |
---|---|---|
Этапы программирования |
|
|
Тип перевода | Компилятор сразу переводит полный код высокоуровневого программирования в машинный код. | Интерпретатор переводит по одному оператору программного кода в машинный код. |
Преимущество | Поскольку исходный код уже преобразован в машинный код, время выполнения кода сокращается.![]() | Поскольку исходный код интерпретируется построчно, обнаружение и исправление ошибок становится проще. |
Недостаток | Если вы хотите изменить свою программу по какой-либо причине, будь то ошибка или логические изменения, вы можете сделать это, только вернувшись к исходному коду. | Интерпретируемые программы могут работать только на тех компьютерах, на которых установлен такой же интерпретатор. |
Машинный код | Сохраняет преобразованный машинный код из исходного кода вашей программы на диск. | Он никогда не сохраняет машинный код на диске. |
Время работы | Компилятору требуется огромное количество времени для анализа исходного кода. Однако в целом скомпилированный программный код выполняется быстрее, чем сжатие в интерпретаторе. | Интерпретатору требуется меньше времени для анализа исходного кода по сравнению с компилятором.![]() |
Генерация программы | Компилятор создает выходные данные программы (в виде исполняемого файла), которая может выполняться отдельно от программы с исходным кодом. | Интерпретатор не генерирует отдельный машинный код в качестве программы вывода. Таким образом, он проверяет исходный код каждый раз во время выполнения. |
Исполнение | Процесс выполнения программы происходит отдельно от процесса ее компиляции. Выполнение программы происходит только после компиляции всей программы. | Процесс выполнения программы является частью шагов интерпретации, поэтому выполняется построчно одновременно. |
Требования к памяти | Скомпилированная программа генерируется в промежуточный объектный код, и в дальнейшем требуется компоновка. Так что есть потребность в большем количестве памяти.![]() | Интерпретируемая программа не генерирует промежуточный код. Таким образом, нет необходимости в дополнительной памяти. |
Лучше всего подходит для | Скомпилированная программа привязана к конкретной целевой машине. Для выполнения требуется тот же компилятор на машине; C и C++ — самые популярные языки программирования, основанные на модели компиляции. | В веб-средах компиляция занимает относительно больше времени для запуска даже небольшого кода, который может не выполняться несколько раз. Поскольку время загрузки имеет важное значение в веб-среде, интерпретаторы лучше. JavaScript, Python, Ruby основаны на модели интерпретатора. |
Ошибка выполнения | Компилятор показывает полные сообщения об ошибках и предупреждениях во время компиляции программы. Таким образом, запустить программу без исправления программных ошибок невозможно. Выполнение отладки программы сравнительно сложно при работе с компилятором.![]() |