Интерпретатор

Ключевые различия между компилятором и интерпретатором

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

  1. Компилятор берет программу в целом и переводит ее, а интерпретатор переводит оператор программы за оператором.
  2. Промежуточный код или целевой код создается в случае компилятора. В отличие от интерпретатора, не создает промежуточный код.
  3. Компилятор сравнительно быстрее, чем интерпретатор, поскольку компилятор берет всю программу за один раз, тогда как интерпретаторы компилируют каждую строку кода за другой.
  4. Компилятору требуется больше памяти, чем интерпретатору, из-за генерации объектного кода.
  5. Компилятор представляет все ошибки одновременно, и трудно обнаружить ошибки в контрастных ошибках отображения интерпретатора каждого оператора по очереди, и легче обнаружить ошибки.
  6. В компиляторе при возникновении ошибки в программе он останавливает ее перевод, и после устранения ошибки вся программа переводится заново. Напротив, когда в интерпретаторе возникает ошибка, он предотвращает его перевод, и после устранения ошибки перевод возобновляется.
  7. В компиляторе процесс требует двух шагов, на которых сначала исходный код транслируется в целевую программу, а затем выполняется. В интерпретаторе Это одноэтапный процесс, в котором исходный код компилируется и выполняется одновременно.
  8. Компилятор используется в таких языках программирования, как C, C ++, C #, Scala и т. Д. С другой стороны, интерпретатор используется в таких языках, как PHP, Ruby, Python и т. Д.

Что такое компиляторы и интерпретаторы?

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

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

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

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

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

Примечания

  1. Кочергин В. И. interpreter // Большой англо-русский толковый научно-технический словарь компьютерных информационных технологий и радиоэлектроники. — 2016. — ISBN 978-5-7511-2332-1.
  2. ГОСТ 19781-83; СТ ИСО 2382/7-77 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X.
  3. Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М.: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0.
  4. Борковский А. Б. Англо-русский словарь по программированию и информатике (с толкованиями). — М.: Русский язык, 1990. — 335 с. — 50 050 (доп.) экз. — ISBN 5-200-01169-3.
  5. Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М.: Машиностроение, 1990. — 560 с. — 70 000 (доп.) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания).
  6. Dave Martin. . Rexx FAQs. Дата обращения: 22 декабря 2009.
  7. Jeff Fox.  (англ.). Thoughtful Programming and Forth. UltraTechnology. Дата обращения: 25 января 2010.

За и против

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

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

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

С помощью интерпретатора проще добавить дополнительные функции, реализовать такие элементы, как сборщики мусора, а не расширять язык.

Другим преимуществом интерпретаторов является то, что их проще переписать или перекомпилировать для новых платформ.

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

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

Это проблема для конкретных real-time приложений, таких как игры с высоким разрешением и симуляцией. Некоторые интерпретаторы содержат компоненты, которые называются just-in-time компиляторами (JIT). Они компилируют программу непосредственно перед ее исполнением. Это специальные программы, вынесенные за рамки интерпретатора. Но поскольку процессоры становятся все более мощными, данная проблема становится менее актуальной.

Эффективность

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

JIT-компилятор принимает байт-код и генерирует машинный код, который исполняется не виртуальным процессором, а реальным. За счет JIT ваши программы на Java/Python могут (теоретически) выполняться также быстро, как написанные на С++. По сути, JIT выполняет ту же работу что и компилятор C++, но делает это прямо во время выполнения программы и не для всей программы, а для так называемого Common path (основного пути исполнения). Отсюда растут ноги многих статей, показывающих, что Java-программа работает также быстро как на С++.

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

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

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

  • программа на С++ не оптимизировалась вообще или не выполнялось профилирование. Так, например, инлайнить обычно надо не более 5% функций, однако чтобы найти эти функции — нужно выполнить профилирование. Многие из читающих эту статью программистов выполняют профилирование своего кода? — Думаю не более 1%.
  • программа на С++ профилировалась на одних данных, а работает — на совершенно других. В видео рассказывается как с этим столкнулась и боролась команда Яндекс.Браузер (оказалось, что пользователи работают с браузером не так как планировали разработчики);
  • программа оптимизирована под одно железо, а запущена на совершенно другом.

По приведенным выше причинам, программы на интерпретируемых языках могут иметь сносную (на фоне компилируемых) производительность. Если на этом этапе вам уже кажется что ничего такого в вашем любимом JavaScript/Python нету — посмотрите вот эту статью , также можно найти научные изыскания вплоть до автоматического распараллеливания программ на JS .

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

Как это работает?

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

Интерпретатор создает программу. Он не связывает файлы и не генерирует машинный код. Происходит построчное выполнение исходных операторов во время исполнения программы.

Обработка переменных

  • Он считывает до двух первых символов имени переменной. (Это было стандартным неудобством версий BASIC той эпохи из-за ограничений памяти.)
  • По этим двум символам он определяет индекс переменной. «A» — это переменная 0, «A0» — переменная 53, и т.д. Уравнение довольно простое, но сейчас оно нас не интересует.
  • BASIC продолжает сканирование в поисках символа типа переменной. Например, в BASIC обозначает строковую переменную. Тип переменной хранится парой битов выше в индексе переменной.
  • Затем BASIC записывает тип и индекс в выходные данные, а потом вместе с самим именем переменной записывает длину этого имени. Именно на этом мы теряем экономию пространства!

Рабочий цикл программы

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

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

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

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

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

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

Не все языки программирования учитывают это в своей концепции. Например, Java предназначался для запуска в «интерпретирующей» среде, а Python всегда должен интерпретироваться.

Список часто используемых интерпретируемых языков

  • APL

    J Вариант APL, в котором неявное определение дает некоторые преимущества компиляции

    — векторный язык с необычным набором символов.

  • BASIC (хотя исходная версия Dartmouth BASIC была скомпилирована, как и многие современные BASIC)
  • Системы обработки и решения уравнений
    • GNU Octave
    • Интерактивный язык данных (IDL)
    • TK Solver
    • Mathematica
    • MATLAB
  • Эйфория Интерпретировано или составлено.
  • Байт-код языка GameMaker после GameMaker: Studio.
  • JavaScript
  • Четвертый
  • Лава
  • Лисп

    • Логотип
    • Схема
  • Lua
  • МАМПЫ
  • PHP
  • PostScript
  • PowerShell
  • Рубин
  • REXX
  • Семя7
  • Болтовня
  • Таблицы

    Excel

  • S

    р

  • Tcl

    XOTcl

  • Оболочка Unix
  • VBScript
  • XMLmosaic — XML-файл, содержащий язык программирования C #, интерпретируемый консольным приложением, написанным на Visual Basic .NET.

Языки, обычно компилируемые в байт-код

Многие языки сначала компилируются в байт-код . Иногда байт-код также может быть скомпилирован в собственный двоичный файл с помощью компилятора AOT или выполнен в исходном виде с помощью аппаратного процессора.

  • AppleScript
  • Erlang

    Эликсир (работает на виртуальной машине Erlang)

    (скомпилирован в байт-код Erlang и интерпретируется BEAM VM)

  • Java (компилируется в байт-код Java для интерпретации JVM )

    • Clojure
    • Groovy
    • Котлин
    • Холодный синтез
    • Scala
  • Языки .NET Framework (переведенные в байт-код, называемый CIL ).

    • C ++ / CLI
    • C #
    • Visual Basic .NET
    • F #
  • Лисп
  • Lua
  • Perl
  • Щука
  • Python (скомпилирован в байт-код Python и интерпретирован CPython )
  • Писк Smalltalk
  • Visual FoxPro

Классификация трансляторов

Транслятор (англ. translator — переводчик) — это программа-переводчик. Она преобразует программу, написанную на одном из языков программирования, в бинарный файл программы, состоящей из машинных команд, либо непосредственно выполняет действия программы.

Трансляторы реализуются в виде компиляторов, интерпретаторов, препроцессоров и эмуляторов. С точки зрения выполнения работы компилятор и интерпретатор существенно различаются.

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

Интерпретатор (англ. interpreter — истолкователь, переводчик) — переводит программу построчно (по одному оператору) в машинный код (команды процессора, ОС, иной среды), выполняет переведенный оператор (строку программы), а затем переходит к следующей строке программного текста. Интерпретатор не формирует исполняемых файлов, он сам выполняет все действия, записанные в тексте исходной программы.

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

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

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

С другой стороны, Бейсик создавался как язык для начинающих программистов, для которых построчное выполнение программы имеет неоспоримые преимущества.

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

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

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

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

К эмулирующим языкам относятся такие системы, как Java, .Net, Mono, в которых на этапе создания программы производится ее компиляция в специальный байт-код и получение бинарного файла, пригодного для исполнения в любой операционной и аппаратной среде,а исполнение полученного байт-кода производится на целевой машине с помощью простого и быстрого интерпретатора (виртуальной машины).

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

к алгоритмизации   алгоритмы, струкутуры данных и программирование   СУБД   ЯиМП   3GL   4GL   5GL   технологии прогр.

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

Недостатки

Недостатки интерпретируемых языков:

  • Без статической проверки типов , которая обычно выполняется компилятором, программы могут быть менее надежными, поскольку проверка типов устраняет целый класс программных ошибок (хотя проверка типов кода может выполняться с помощью дополнительных автономных инструментов. См. TypeScript например)
  • Интерпретаторы могут быть восприимчивы к атакам внедрения кода .
  • Более медленное выполнение по сравнению с прямым выполнением машинного кода на центральном процессоре . Для повышения производительности используется метод своевременной компиляции, которая преобразует часто выполняемые последовательности интерпретируемых инструкций в машинный код хоста. JIT чаще всего сочетается с компиляцией в байтовый код, как в Java .
  • Исходный код можно читать и копировать (например, JavaScript на веб-страницах) или более легко реконструировать посредством отражения в приложениях, где интеллектуальная собственность имеет коммерческое преимущество. В некоторых случаях обфускация используется как частичная защита от этого.

Определение переводчика

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

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

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

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

Что такое компилируемый язык программирования?

#include
    int main()
    {
            printf("Hello World");
    }

Выше приведен простой пример программы, написанной на языке программирования C. Это пример компилируемого языка программирования. Чтобы выполнить код, его необходимо запустить с помощью компилятора. Для этого я использую следующую команду Linux:

gcc helloworld.c -o hello

Приведенная выше команда превращает код из формата, удобного для восприятия человеком, в машинный код, который может выполнить компьютер. gcc сам является скомпилированной программой (компилятор gnu c).

Скомпилированную программу можно выполнить, просто запустив имя программы следующим образом:

./hello

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

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

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

Ничто не идеально. Если есть программа на компилируемом языке С, скомпилированная на компьютере, работающем Linux, я не могу копировать эту скомпилированную программу на Windows и рассчитывать, что исполняемый файл будет выполнен.

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

Что такое интерпретируемый язык?

print ("hello world")

Приведенный выше код представляет собой программу на языке python, которая отображает слова «hello world».

Для выполнения кода нужно его компилировать сначала. Вместо этого я могу просто запустить следующую команду:

python helloworld.py

Приведенный выше код не нужно компилировать. Но необходимо, чтобы python был установлен на компьютере, на котором будет работать скрипт.

Интерпретатор python принимает удобный для восприятия человеком код и превращает его в промежуточное «состояние», прежде чем сформировать то, что может прочитать ПК. Все это происходит за кадром, и пользователь увидит только слова «hello world».

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

Хотя это может показаться недостатком, существует ряд причин, по которым интерпретируемые языки полезны. Одна из них состоит в том, что гораздо проще выполнить программу, написанную на Python, в Linux, Windows и OSX. Просто убедитесь, что Python установлен на компьютере, на котором вы хотите запустить скрипт.

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

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

Так какой же язык использовать?

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

Несмотря на то, что некоторые языки явно умирают, такие как COBOL, Visual Basic и ActionScript, есть и другие, которые были на грани вымирания, но резко вернулись на прежнее положение, как например, JavaScript.

В общем, мой совет заключается в том, что если вы используете Linux, вам следует изучать Java, Python или C, а если вы используете Windows, изучаете .NET и AngularJS.

Интерпретатор C / C++ Ch Embeddable (стандартная версия)

Интерпретатор C / C++, поддерживающий стандарт ISO 1990 C (C90), основные функции C99, классы C++, а также расширения к языку С, такие как вложенные функции, строковый тип и т. д. Он может быть встроен в другие приложения и аппаратные средства, использоваться в качестве языка сценариев. Код C / C++ интерпретируется напрямую без компиляции промежуточного кода. Поскольку этот интерпретатор поддерживает Linux, Windows, MacOS X, Solaris и HP-UX, созданный вами код можно перенести на любую из этих платформ. Стандартная версия бесплатна для личного, академического и коммерческого использования. Для загрузки пакета необходимо зарегистрироваться.

Компилируемые и интерпретируемые языки программирования

Теги:

  • Языки программирования
  • Технологии

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

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

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

Компилируемые языки

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

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

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

Примерами компилируемых языков являются Pascal, C, C++, Erlang, Haskell, Rust, Go, Ada.

Интерпретируемые языки

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

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

Примерами интерпретируемых языков являются PHP, Perl, Ruby, Python, JavaScript. К интерпретируемым языкам также можно отнести все скриптовые языки.

Многие языки в наши дни имеют как компилируемые, так и интерпретируемые реализации, сводя разницу между ними к минимуму. Некоторые языки, например, Java и C#, находятся между компилируемыми и интерпретируемыми. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции «на лету». Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для C# — Common Language Runtime.

Перепечатка статьи допускается только при указании активной ссылки на сайт itmentor.by

Хочешь получать новые статьи первым? Вступай в сообщества ITmentor и

Природа интерпретатора

Интерпретаторы могут создаваться по-разному. Существуют интерпретаторы, которые читают исходную программу и не выполняют дополнительной обработки. Они просто берут определенное количество строк кода за раз и выполняют его.

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

Такой код быстрее обрабатывается, и его проще написать для исполнителя (части интерпретатора, которая исполняет), который считывает байтовый код, а не код источника.

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

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

У меня есть эмулятор для игровой приставки NIntendo. Когда я загружаю ROM-файл Dragon Warrior, он форматируется в машинный код, который понимает только процессор NES. Но если я создаю виртуальный процессор, который интерпретирует байтовый код во время работы на другом процессоре, я могу запустить Dragon Warrior на любой машине с эмулятором.

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

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

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

Adblock
detector