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

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

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

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

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

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

AMD x86 Open64 Compiler Suite

Это версия набора компиляторов Open64 (описанного ниже), которая была настроена для процессоров AMD и имеет дополнительные исправления ошибок. Компилятор C / C++ соответствует стандартам ANSI C99 и ISO C++ 98, поддерживает межъязыковые вызовы (так как он включает в себя компилятор Fortran), 32-битный и 64-битный код x86, векторную и скалярную генерацию кода SSE / SSE2 / SSE3, OpenMP 2.5 для моделей с разделяемой памятью, MPICH2 для моделей с распределенной и разделяемой памятью; содержит оптимизатор, поддерживающий огромное количество оптимизаций (глобальную, цикл-узел, межпроцедурный анализ, обратную связь) и многое другое. Набор поставляется с оптимизированной AMD Core Math Library и документацией. Для этого набора компиляторов требуется Linux.

Типы интерпретаторов

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

Интерпретатор компилирующего типа — это система из компилятора, переводящего исходный код программы в промежуточное представление, например, в байт-код или p-код, и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина). Достоинством таких систем является большее быстродействие выполнения программ (за счёт выноса анализа исходного кода в отдельный, разовый проход, и минимизации этого анализа в интерпретаторе). Недостатки — большее требование к ресурсам и требование на корректность исходного кода. Применяется в таких языках, как Java, PHP, Tcl, Perl, REXX (сохраняется результат парсинга исходного кода), а также в различных СУБД.

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

Некоторые интерпретаторы (например, для языков Лисп, Scheme, Python, Бейсик и других) могут работать в режиме диалога или так называемого цикла чтения-вычисления-печати (англ. read-eval-print loop, REPL). В таком режиме интерпретатор считывает законченную конструкцию языка (например, s-expression в языке Лисп), выполняет её, печатает результаты, после чего переходит к ожиданию ввода пользователем следующей конструкции.

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

Следует также отметить, что режимы интерпретации можно найти не только в программном, но и аппаратном обеспечении. Так, многие микропроцессоры интерпретируют машинный код с помощью встроенных микропрограмм, а процессоры семейства x86, начиная с Pentium (например, на архитектуре Intel P6), во время исполнения машинного кода предварительно транслируют его во внутренний формат (в последовательность микроопераций).

Компилятор

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

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

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

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

Лексер — превращаем язык в ключевые слова

Мы дошли одновременно до практически самой простой и самой муторной части. Простая она, потому что всего лишь описывает превращение слов языка в наши токены. А муторная, потому что лексеры (а может, только окамловский лексер) плохо рассчитаны на работу с русским языком, поэтому работать с русскими символами можно только как со строками. Так как я хотел сделать ключевые слова языка регистро-независимыми, это добавило кучу геморроя — вместо простого написания «дай» надо было расписывать вариант написания каждой буквы. В общем, смотрите сами, файл yobaLexer.mll:

{
        open YobaParser
        exception Eof
}
rule token = parse
        ("и"|"И") ("д"|"Д") ("и"|"И") (' ')+
        ("н"|"Н") ("а"|"А") ("х"|"Х") ("у"|"У") ("й"|"Й") { FUCKOFF }
      | ("б"|"Б") ("а"|"А") ("л"|"Л") ("а"|"А")
        ("н"|"Н") ("с"|"С") (' ')+
        ("н"|"Н") ("а"|"А") ("х"|"Х")                     { STATS }
      | ' ' '\t' '\n' '\r'                              { token lexbuf }
      | '0'-'9'+                                        { INT(int_of_string(Lexing.lexeme lexbuf)) }
      | ("д"|"Д") ("а"|"А") ("й"|"Й")                     { GIVE }
      | ("н"|"Н") ("а"|"А")                               { TAKE }
      | ("ч"|"Ч") ("о"|"О")                               { WASSUP }
      | ("й"|"Й") ("о"|"О") ("б"|"Б") ("а"|"А")           { DAMN }
      | ("л"|"Л") ("ю"|"Ю") ("б"|"Б") ("л"|"Л") ("ю"|"Ю") { RULEZ }
      | ("е"|"Е") ("с"|"С") ("т"|"Т") ("ь"|"Ь")           { CONTAINS }
      | ("т"|"Т") ("а"|"А") ("д"|"Д") ("а"|"А")           { THEN }
      | ("и"|"И") ("л"|"Л") ("и"|"И")                     { ELSE }
      | ("у"|"У") ("с"|"С") ("е"|"Е") ("к"|"К") ("и"|"И") { MEMORIZE }
      | ("э"|"Э") ("т"|"Т") ("о"|"О")                     { IS }
      | ("х"|"Х") ("у"|"У") ("й"|"Й") ("н"|"Н") ("и"|"И") { CALL }
      |
      ("а"|"б"|"в"|"г"|"д"|"е"|"ё"|"ж"
       |"з"|"и"|"й"|"к"|"л"|"м"|"н"|"о"
       |"п"|"р"|"с"|"т"|"у"|"ф"|"х"|"ц"
       |"ч"|"ш"|"щ"|"ъ"|"ы"|"ь"|"э"|"ю"|"я")+             { ID(Lexing.lexeme lexbuf) }
      | eof                                               { raise Eof }

C & C++ компиляторы Mingw32

Эта система поставляется с компилятором GNU C / C++, который можно использовать для создания исполняемых файлов Win32. Она содержит собственный <windows.h>, который находится в открытом доступе. Предполагается, что приложения, созданные с использованием этой системы, будут быстрее, чем, те которые созданы с помощью Cygwin32, и они не ограничиваются положениями лицензии GNU. Mingw32 поставляется с инструментами для обработки текста (sed, grep), генератором лексического анализатора (flex), генератором парсеров (bison) и т. д. Mingw32 также поставляется с компилятором ресурсов Windows.

Типы интерпретаторов

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

Интерпретатор компилирующего типа — это система из компилятора, переводящего исходный код программы в промежуточное представление, например, в байт-код или p-код, и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина). Достоинством таких систем является большее быстродействие выполнения программ (за счёт выноса анализа исходного кода в отдельный, разовый проход, и минимизации этого анализа в интерпретаторе). Недостатки — большее требование к ресурсам и требование на корректность исходного кода. Применяется в таких языках, как Java, PHP, Tcl, Perl, REXX (сохраняется результат парсинга исходного кода), а также в различных СУБД.

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

Некоторые интерпретаторы (например, для языков Лисп, Scheme, Python, Бейсик и других) могут работать в режиме диалога или так называемого цикла чтения-вычисления-печати (англ. read-eval-print loop, REPL). В таком режиме интерпретатор считывает законченную конструкцию языка (например, s-expression в языке Лисп), выполняет её, печатает результаты, после чего переходит к ожиданию ввода пользователем следующей конструкции.

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

Следует также отметить, что режимы интерпретации можно найти не только в программном, но и аппаратном обеспечении. Так, многие микропроцессоры интерпретируют машинный код с помощью встроенных микропрограмм, а процессоры семейства x86, начиная с Pentium (например, на архитектуре Intel P6), во время исполнения машинного кода предварительно транслируют его во внутренний формат (в последовательность микроопераций).

Microsoft Visual Studio Community

Для индивидуальных или начинающих программистов Microsoft Visual Studio Community включает в себя много важных инструментов из коммерческих версий проекта. Вы получите в свое распоряжение IDE, отладчик, оптимизирующий компилятор, редактор, средства отладки и профилирования. С помощью этого пакета можно разрабатывать программы для настольных и мобильных версий Windows, а также Android. Компилятор C++ поддерживает большинство функций ISO C++ 11, некоторые из ISO C++ 14 и C++ 17. В то же время компилятор C уже безнадежно устарел и не имеет даже надлежащей поддержки C99.

Программное обеспечение также поставляется с поддержкой построения программ на C#, Visual Basic, F# и Python. В то время, когда я писал эту статью, на сайте проекта утверждалось, что Visual Studio Community 2015 «бесплатный инструмент для индивидуальных разработчиков, проектов с открытым исходным кодом, научных исследований, образовательных проектов и небольших профессиональных групп».

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

Что такое интерпретатор?

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

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

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

Роль переводчика

  • Интерпретатор преобразует исходный код построчно во время RUN Time.
  • Interpret полностью переводит программу, написанную на языке высокого уровня, на язык машинного уровня.
  • Интерпретатор позволяет оценивать и изменять программу во время ее выполнения.
  • Относительно меньше времени, затрачиваемого на анализ и обработку программы
  • Выполнение программы относительно медленное по сравнению с компилятором

ЯЗЫКИ ВЫСОКОГО УРОВНЯ

Языки высокого уровня, такие как C, C ++, JAVA и т. Д., Очень близки к английскому. Это упрощает процесс программирования. Однако перед выполнением его необходимо перевести на машинный язык. Этот процесс перевода выполняется либо компилятором, либо интерпретатором. Также известен как исходный код.

МАШИННЫЙ КОД

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

КОД ОБЪЕКТА

При компиляции исходного кода машинный код, сгенерированный для разных процессоров, таких как Intel, AMD, ARM, отличается. tЧтобы сделать код переносимым, исходный код сначала преобразуется в объектный код. Это промежуточный код (похожий на машинный код), который не поймет ни один процессор. Во время выполнения объектный код преобразуется в машинный код базовой платформы.

Java компилируется и интерпретируется.

Чтобы использовать относительные преимущества компиляторов, интерпретаторы некоторых языков программирования, таких как Java, компилируются и интерпретируются. Сам код Java компилируется в объектный код. Во время выполнения JVM интерпретирует объектный код в машинный код целевого компьютера.

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

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

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

Примечания

  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.

Работа с памятью

Почти все знают, что языки типа Java/Python очень удобные, т.к. автоматизируют сборку мусора. Это значит, что если вы выделите память под объект (например, массив), а затем этот объект станет вам не нужен — то виртуальная машина сама освободит память. Например, в следующей программе при вызове функции создается новый объект , который после завершения работы функции становится недоступен — это и есть мусор. В языке C++ такие объекты уничтожаются в момент выхода из функции, а в Java, Python и многих других интерпретируемых языках — они живут до тех пор, пока свободная память не кончится:

public class Main {
    public static void say(String name) {
        String text = "hello " + name;
        System.out.println(text);  
    }
 
    public static void main(String[] args) {
        say("Bob");
    }
}

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

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

  • выделением памяти — так, чтобы избежать фрагментации;
  • запросом новых страниц памяти у операционной системы и возвратом освобожденных;
  • обнаружением мусора (объектов, которые можно удалить). При этом используется анализ доступности (подсчет ссылок в многопоточной среде не работает).

Вся эта дополнительная работа выполняется неявно в момент выполнения вашей программы и, естественно, тормозит. Обычно для сборки памяти необходима полная остановка вашей программы (всех потоков), поэтому когда память кончится — программа «зависнет» пока не закончит сборку. Память требуется не только для объектов в вашей программе, но и для работы самой JVM, в частности, объектами являются и потребляют память: загруженные классы; код, скомпилированный с помощью JIT; оптимизированный код.

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

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

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

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

String bad = new String("Slower");
String good = "Faster";

Дополнительная литература по теме:

  1. Тюнинг JVM на примере одного проекта. URL: https://habr.com/en/company/luxoft/blog/174231/
  2. Java Bytecode Fundamentals. URL: https://habr.com/ru/post/111456/
  3. PGO: уход и кормление. URL: https://vk.com/for_programmer?w=wall-105242702_801
  4. Как работает JS: о внутреннем устройстве V8 и оптимизации кода. URL: https://habr.com/ru/company/ruvds/blog/337460/
  5. Martinsen, J. K., Grahn, H. (2010). An alternative optimization technique for JavaScript engines. Presented at the Third Swedish Workshop on Multi-Core Computing (MCC-10), Göteborg: Chalmers University of Technology. Retrieved from http://urn.kb.se/resolve?urn=urn:nbn:se:bth-7688
  6. Введение в технологии виртуализации.

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

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

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

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

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

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

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

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

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

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

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

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

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

В каких языках используются интерпретаторы?

В современном мире программирования чаще всего используют только самые популярные языки программирования, ведь именно они развиваются наиболее быстро, что позволяет воплотить весь потенциал программистов. Примером таких языков могут стать Java и С\С++. Веб-языки не стоит относить сюда, потому что реализации их кода не требуются дополнительные приспособления, кроме рабочей станции и приложения, способного запустить код. Многие программисты считают лучшим интерпретатором Windows именно MVS, поскольку он разработан исключительно только для работы с операционной системной Windows.

Достоинства и недостатки интерпретаторов

Достоинства

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

Недостатки

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

Трансляторы

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

Существует три вида трансляторов: интерпретаторы, компиляторы и ассемблеры.

Интерпретатором называется транслятор, производящий пооператорную (покомандную) обработку и выполнение исходной программы.

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

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

Любой транслятор решает следующие основные задачи:

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

• генерирует выходную программу (ее часто называют объектной или рабочей) на языке команд ЭВМ (в некоторых случаях транслятор генерирует выходную программу на промежуточном языке, например, на языке ассемблера);

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

составление

Для написания программы необходимо выполнить следующие действия:

  1. Редактировать программу
  2. Скомпилируйте программу в файлы машинного кода.
  3. Свяжите файлы машинного кода в работающую программу (также известную как exe).
  4. Отладка или запуск программы

Для некоторых языков, таких как Turbo Pascal и Delphi, шаги 2 и 3 объединены.

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

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

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

Вывод

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

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

Вывод

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

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

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

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

Adblock
detector