В чем различие между компиляцией и интерпретацией
Перейти к содержимому

В чем различие между компиляцией и интерпретацией

  • автор:

Компиляция и интерпретация кода: что это такое и в чем разница

Компиляция и интерпретация кода: что это такое и в чем разница главное изображение

Наши компьютеры — это переключатели, для которых мы пишем инструкции. При этом для их работы мы пишем тексты на английском (ну или русском, если мы говорим про 1С) языке. Рассказываем, как наши изощренные языковые инструкции превращаются в примитивный двоичный код, при этом абсолютно не теряя смысла.

Это адаптированный перевод статьи A Deeper Inspection Into Compilation And Interpretation от разработчика Vaidehi Joshi из компании Vimeo. Повествование ведется от имени автора.

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

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

Когда одна программистка из Гарварда научила компьютер понимать инструкции, которые похожи на человеческую речь, ее открытием просто никто не воспользовался — люди не понимали, зачем это нужно. Инженеры 50-х не могли даже представить себе мир, в котором компьютеры выполняют инструкции, а не считают формулы.

Чтобы понять упрямство людей того времени, пройдем вместе с ними этот тернистый путь, выстланный перфокартами.

Все объединяет идея языков

Машинный код в конечном итоге является языком, пусть и очень простым. Код, который пишут программисты, тоже написан на каком-то языке. Если смотреть на два этих кода — машинный и созданный разработчиками, как на два текста на разных языках, становится очевидным, что нам нужен переводчик.

Давайте на минуту представим такой переводчик. Он обязан сохранить смысл текста, но чтобы сделать это хорошо, он также должен:

  • Проверить текст на ошибки
  • Сделать лексический и синтаксический анализ
  • Сохранить результат перевода.

Теперь становится понятно, почему инженерам прошлого, которые до этого видели только калькуляторы, сложно было представить себе переводчик между языками. К счастью для нас, эти трудности не напугали парочку бунтарей — Грейс Хоппер и Стива Рассела. Они работали в разных лабораториях, но оба пошли наперекор начальству и придумали те переводчики, которыми мы пользуемся каждый день.

Чтобы познакомиться с ними, а заодно и с магией перевода, перенесемся в США прошлого века.

От цифр к словам

Преспер Эккерт и Джон Мокли делали компьютеры для военных. Сначала они работали в родном университете, но потом тот стал присваивать патенты преподавателей. Эккерту и Мокли это не понравилось, они ушли и открыли собственную фирму по продаже компьютеров.

Так они получили первый заказ от Бюро переписи населения США, но для этого им пришлось соврать по мелочи — например, занизить цену в три раза, но зато компьютер в итоге получился отличный. Еще бы, ведь над ним работали лучшие инженеры того времени.

В том числе и Грейс Хоппер.

Однажды Хоппер предложила коллегам не мучиться с машинным кодом, а говорить с компьютером на английском языке. Например, сказать ему: «Вычти подоходный налог из зарплаты». Как отреагировали ее коллеги и начальство, вы уже знаете: «Они мягко объяснили мне, что компьютеры могут решать лишь арифметические задачи и что они никогда не смогут выполнять программы», — рассказывала Хоппер в своей биографии «Grace Hopper: Navy Admiral and Computer Pioneer».

Но Грейс Хоппер не так легко сбить с толку. Эта женщина пошла на фронт добровольцем, причем исключительно благодаря напористости — ее не хотели брать из-за дефицита веса. Она закончила обучение с лучшими оценками и стала лучшим инженером штаба.

Хоппер проявила упорство и на новой работе. Она в одиночку придумала первый в мире переводчик, который позволял говорить с компьютером на английском языке. Теперь программировать могли не только математики, а кто угодно! При этом сами программы теперь можно было сделать намного более сложными.

Первым переводчиком был компилятор

Хоппер показала коллегам свой переводчик в 1952 году, и ее проигнорировали. Три года технологией никто не пользовался, пока, наконец, проект не заметили в Министерстве обороны США.

Зачем военным понадобился компьютер, который заказали в Бюро переписи населения? Зачем им нужна была технология Хоппер, на которую махнули рукой ее более авторитетные коллеги?

Дело в устройстве первого переводчика (как говорят в программировании, транслятора). Вот как работал этот транслятор:

  1. Хоппер писала инструкцию на английском языке — «Вычти подоходный налог»
  2. Компилятор переводил инструкцию в машинный код — тогда это были цифры и буквы
  3. Компьютер выполнял машинный код, не зная ничего про инструкцию на английском.

Как вы видите, транслятор Хоппер делал весь перевод текста за один подход. Транслятор, который делает весь перевод за один раз, называется компилятором. Это важный момент, потому что мы познакомимся и с другим видом трансляторов, интерпретатором, но для этого нужно подробнее изучить именно работу компиляторов.

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

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

Люди в американском правительстве считали компилятор временным решением. Однако концепция трансляторов, как и принципы языка COBOL, прочно вошли в инженерные практики на многие годы.

Но когда вы пишете код, то можете запустить его, не компилируя. Вы построчно видите выполнение кода в консоли и работаете с ошибками «на лету». Это работа интерпретатора — другого вида трансляции в машинный код.

Этот транслятор придумал другой бунтарь: его тоже отвергали авторитеты, и он тоже определил черты индустрии на многие годы. История Хоппер повторилась, но в этот раз в другом штате.

Как интерпретатор делает построчную трансляцию

На дворе идет 1958 год, компиляторы давно и успешно используются — в том числе в Массачусетском технологическом университете, где стоит IBM 704. Эта гигантская дорогая штуковина занимает всю комнату. И на ней куется Lisp — язык, на котором 30 лет после этого писался весь код для разработок в области искусственного интеллекта.

Но сейчас, в октябре 58-го, один из местных разработчиков прохлаждается вместо того, чтобы кормить адскую машину перфокартами. Он углубился в чтение статьи своего профессора и по совместительству босса, Джона Маккарти. Бездельника звали Стив Рассел.

«Потом Стив подошел ко мне и сказал: «Слушай, а почему у нас нет функции eval?». Я посмеялся конечно, и отвечаю: «Слушай, не путай теорию и практику, хорошо? Eval — это теоретическое понятие»», — Джон Маккарти для симпозиума ACM 1984 года.

Маккарти хотел как лучше, отказывая Расселу в проекте. Подумайте сами: eval — это команда, которая превращает любую строку в функцию и потом еще выполняет ее. Это два действия за один перевод! Невыполнимый трюк для транслятора, который умеет отдавать процессору только одну инструкцию за раз.

Рассел нашел решение всего за пару месяцев: он создал транслятор, который запускает код построчно. Такой транслятор и называется интерпретатором. Кстати, вы используете его и на Хекслете: пишете код и тут же запускаете без компиляции, чтобы отловить ошибки.

Построчный запуск кода — непростая задача. Потребуется скомпилировать код вручную много-много раз, прежде чем вы сможете создать свой первый интерпретатор.

Но если вы просто будете отправлять инструкции процессору построчно, то у вас не будет интерпретатора. Он отправляет результат перевода не в процессор, а обратно в программу — это позволяет создавать интересные многоступенчатые команды вроде eval .

От транслятора зависит не только опыт программиста, но и опыт пользователя. Как запустить код на любой операционной системе? Какой транслятор работает быстрее? Ответ в следующем разделе статьи.

Транслятор влияет на опыт пользователя

Представьте, что вы проходите уроки по циклам и решаете там задачи. Однажды вам попадается интересный ответ другого студента, поэтому вы копируете его код в редактор и смотрите на вывод в консоли.

Вы, как пользователь кода, запустили программу через интерпретатор. Так как это программа от студента и для студента, то здорово, что код не скомпилирован в исполняемый файл: вы можете посмотреть и отредактировать его.

Еще нам неважно, что у другого студента MacOS, а у вас — Windows: интерпретатор берет всю работу по совместимости на себя, для работы кода важно, чтобы у всех стоял интерпретатор.

Интерпретация идеальна для распространения небольших программ, но для больших проектов не подойдет.

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

Компилятор и интерпретатор делают одну и ту же работу, так почему компилятор быстрее?

Компиляция работает быстрее интерпретации, потому что компилятор запускается только один раз: делает перевод и отдает его процессору. Интерпретатор же запускается на каждой строке кода и нужен при каждом запуске программы. Кроме того, программный код в компиляторе уже переведен в машинный, поэтому требуется намного меньше времени для его исполнения.

За последние десять минут мы прошли путь, который занял у программистов двенадцать лет, но оно стоило того: мы научили машины говорить с нами на одном языке.

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

Разница между компилятором и интерпретатором

Какая разница между компилятором и интерпретатором? Может ли язык программирования иметь и компилятор и интерпретатор?

Отслеживать
11.5k 8 8 золотых знаков 43 43 серебряных знака 70 70 бронзовых знаков
задан 23 дек 2016 в 8:09
Salut Amigo Salut Amigo
530 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 компилятором, тем самым ускоряя выполнение.

Компилятор и интерпретатор в программировании: в чем разница

Lorem ipsum dolor

Компиляция — это процесс преобразования программного кода из одного языка программирования в другой. Компилятор — это программа, которая проводит компиляцию.

Компилятор использует всю программу сразу и преобразует ее в код, который сможет запуститься на устройстве. Самый простой пример — это файлы с расширением «.ехе» на Windows. То ест ь в ы пишите какую-то программу для работы под управлением Виндовс, допустим , на языке С++. Сразу запустить ее в системе не получится, потому что система ее не поймет. Поэтому вам нужно будет провести ее через компилятор, то есть скомпилировать. Сделав это , вы получ ите вашу же программу, но уже в «.exe»-файле. Если вы откроете «.exe»-файл вашей программы, тогда вы заметите, что ничего общего с исходным кодом программы на С++ там нет. В «.ехе»-файлах вы увидите непонятный набор символов, но пока еще не двоичный код.

Суть компилятора — это взять всю программу и перевести ее из высокоуровневого представления в низкоуровневое.

Интерпретация и интерпретатор — что это такое?

Интерпретация — это процесс преобразования программного кода из одного языка в другой. Интерпретатор — это программа, которая проводит интерпретацию. Несложно заметить из описания, что интерпретатор и компилятор выполняют похожие операции — они переводят код из высокоуровневого представления в низкоуровневое , о днако делают это по-разному.

Интерпретатор не преобразует всю программу сразу. Процесс преобразования у него поставлен на поток прямо во время работы программы , т о ест ь в ы запускаете программный код, написанный на интерпретируемом языке, и о н преобразуется в машинное представление прямо в процессе.

Так мы дошли до главной мысли : и нтерпретатор и компилятор, по сути, выполняют одну и ту же работу , о днако компилятор преобразует весь код программы перед ее запуском, а интерпретатор преобразует код программы в процессе ее выполнения.

Компилятор и интерпретатор: особенности подходов

Напишем

Компилятор хорош тем, что перед запуском программы он полностью ее обрабатывает. Соответственно, в процессе компиляции происходит оптимизация программного кода ; операторы, переменные, методы, функции проверяются на ошибки. Если в программном коде есть какие-то проблемы, т о компилятор сообщит об этом , и тогда разработчик сможет их исправить. По сути, компилятор как бы «моделирует» новую программу из того кода, что вы написали.

Интерпретатор не моделирует никаких програм м . Принцип его функционирования построен очень просто: он прочитал строчку кода и сразу ее выполнил. Соответственно, если в коде есть ошибка, интерпретатор либо выполнит код с ошибкой, либо не выполнит его вообще , а разработчику придется самостоятельно искать, где возникла проблема у интерпретатора и как исправить эту ошибку.

Невозможно сказать , что лучше: компилятор или интерпретатор, потому что это совершенно разные подходы, которые имеют свои особенности. В некоторых случая х и х применяют вместе, чтобы достичь максимальной производительности программы.

Отметим ряд особенностей интерпретации и компиляции:

  1. После компиляции программный код готов к исполнению на устройстве, так как уже имеет машинное представление.
  2. Скомпилированный код выполняется быстрее, чем исходный код при интерпретировании.
  3. Скомпилированный код сложно откорректировать , п оэтому тут два эффекта : с одной стороны, компиляция защищает исходный код программы от постороннего вмешательства. С другой стороны, если разработчику программы нужно внести какие-то изменения, он это делает в исходном коде, а потом нужно перекомпилировать программу.
  4. Компилятор оптимизирует и определяет наличие ошибок в коде во время компиляции.
  5. Компилятор требует больше системных ресурсов, чем интерпретатор.
  6. Интерпретатор не «грузит» систему, потому что преобразует по одной инструкции за один раз.
  7. Интерпретируемые программы легко корректировать.
  8. При интерпретации путь программы от исходного кода и до ее исполнения короче, чем при компиляции.
  9. Компилятор сохраняет результат своей работы в виде отдельного файла, а интерпретатор выполняет работу «на лету».

Интерпретируется или компилируется программа — зависит от того, на каком языке программирования она написана.

Заключение

Теперь вы знаете, что «компилятор или компиляция» и «интерпретатор или интерпретация» — это разные инструменты одного действия. Это инструменты, которые конвертируют программы, написанные на высокоуровневых языках, в код, который понимает процессор устройства.

Существует много разных мнений насчет того , какой процесс лучше: интерпретация или компиляция. Главный минус интерпретации — это маленькая скорость работы программ, потому что интерпретатору приходится построчно выполнять программу. Главный плюс — программы на интерпретируемых языках пишутся быстрее и легче поддерживаются.

Главный минус компиляции — это сложность поддержки и сложность компилируемых языков. Главный плюс — компилируемые программы работают быстрее.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

В чем отличие компиляции от интерпретации?

В мире программирования существуют два основных подхода к выполнению программ — компиляция и интерпретация. Оба эти подхода имеют свои преимущества и недостатки, и понимание их различий может помочь разработчикам принять правильное решение, выбрав подход, наиболее подходящий для конкретной ситуации.

Компиляция — это процесс преобразования исходного кода программы в машинный код, понятный для компьютера. При компиляции исходный код полностью анализируется компилятором, проверяется на ошибки и преобразуется в исполняемый файл. Этот файл может быть запущен на компьютере без необходимости продолжительного анализа и интерпретации кода во время выполнения.

Интерпретация, с другой стороны, — это подход, при котором код программы исполняется по одной инструкции за раз. Во время интерпретации исходный код анализируется и выполняется одновременно. Интерпретатор читает исходный код последовательно и непосредственно выполняет инструкции. Этот процесс обычно медленнее, поскольку требует времени на интерпретацию кода во время выполнения.

Однако существует также гибридный подход, называемый JIT-компиляцией (Just-in-Time). В этом случае код компилируется непосредственно перед его выполнением. JIT-компиляция сочетает преимущества обоих подходов — она позволяет получить быстрое выполнение кода, так как используется машинный код, но при этом она может оптимизировать код и адаптировать его к конкретным характеристикам исходной системы.

Компиляция и интерпретация: влияние на исполнение программы

В различиях между компиляцией и интерпретацией лежит основная причина разных режимов выполнения программы. В случае компиляции программы, исходный код полностью преобразуется в машинный код (обычно в виде исполняемого файла), который компьютер легко понимает и выполняет. В свою очередь, интерпретация происходит пошагово, построчно, где интерпретатор выполняет команды непосредственно из исходного текста программы.

Это приводит к разным результатам исполнения программы. Код, скомпилированный в исполняемый файл, обычно имеет более высокую производительность и эффективность, так как он уже полностью преобразован в машинный код и не требует дополнительных шагов для исполнения. Компиляция предоставляет более быстрый доступ к ресурсам компьютера и может оптимизировать код для более эффективного использования процессора и памяти. В результате, программы, скомпилированные в машинный код, часто имеют более высокую скорость выполнения.

С другой стороны, интерпретация имеет свои преимущества. Когда программу интерпретируют, её можно изменять и исполнять непосредственно во время выполнения, без необходимости перекомпиляции. Это полезно для разработки и отладки программ, так как позволяет быстро вносить изменения и наблюдать результаты. Интерпретация также обеспечивает большую гибкость в работе с аппаратными ресурсами, так как интерпретатор может адаптироваться к разным системам и условиям.

Различие между компиляцией и интерпретацией

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

Интерпретация, напротив, представляет собой процесс, при котором каждая строка исходного кода читается и выполняется непосредственно во время выполнения программы. Интерпретатор проходит по коду построчно, преобразуя его в машинный код и выполняя инструкции по мере чтения. Этот подход позволяет программисту получить обратную связь более быстро, но исполнение программы может быть медленнее, поскольку каждая инструкция должна быть интерпретирована в реальном времени.

Основное отличие между компиляцией и интерпретацией заключается в том, что компиляция требует предварительного этапа обработки кода, который обычно занимает больше времени, но позволяет достичь более быстрого выполнения программы. Интерпретация, с другой стороны, может обеспечить более гибкую разработку и отладку, но может быть медленнее при выполнении, так как требует интерпретации каждой инструкции в режиме реального времени.

В итоге, выбор между компиляцией и интерпретацией зависит от конкретных потребностей разработчика и характеристик программы. Компиляция лучше подходит для проектов с большим объемом кода и требовательных к производительности. Интерпретация может быть полезна для разработки и тестирования программ в интерактивной среде.

Как компиляция и интерпретация влияют на исполнение программы

Компиляция

Интерпретация

Код преобразуется в машинный код на этапе компиляции.

Код исполняется построчно во время выполнения.

Исходный код исполняется быстрее, так как машинный код уже сгенерирован.

Исходный код исполняется медленнее, так как каждая строка кода анализируется и интерпретируется во время выполнения.

Ошибки обнаруживаются на этапе компиляции, что позволяет их исправить до запуска программы.

Ошибки обнаруживаются во время выполнения программы, что может привести к сбоям и непредсказуемому поведению.

Программа требует меньше ресурсов при выполнении, так как машинный код уже создан.

Программа требует больше ресурсов при выполнении, так как каждая строка кода анализируется и интерпретируется во время выполнения.

Компиляция и интерпретация также влияют на портативность программного кода. Код, скомпилированный в машинный код, может быть выполнен на любом устройстве и операционной системе, поддерживающих этот машинный код. В то время как код, интерпретируемый виртуальной машиной, требует наличия этой виртуальной машины на устройстве, на котором запускается программа.

В общем, компиляция и интерпретация — это разные подходы к исполнению программного кода, каждый из которых имеет свои достоинства и недостатки. Выбор между ними зависит от требований проекта и целей программиста.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *