Бесплатные компиляторы и интерпретаторы c / c++

3) Компиляторы и интерпретаторы

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


Интерпретатор берёт очередной оператор языка из текста программы, анализирует его структуру и затем сразу исполняет (обычно после анализа оператор транслируется в некоторое промежуточное представление или даже машинный код для более эффективного дальнейшего исполнения). Только после того как текущий оператор успешно выполнен, интерпретатор перейдёт к следующему. При этом если один и тот же оператор будет выполняться в программе многократно, интерпретатор будет выполнять его так как, как будто встретил впервые. Вследствие этого программы,в которых требуется осуществить большой объём вычислений, будут выполняться медленно. Кроме того, для выполнения программы на другом компьютере там тоже должен стоять интерпретатор – ведь без него текст является просто набором символов.

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

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

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

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

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

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

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

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

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

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

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

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

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

Выбор транслятора

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

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

Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий

Это учебник по теории написания компиляторов, в котором подробно описаны принципы работы разноуровневых компиляторов (начиная от простейших однопроходных, заканчивая современным компилятором на языке Java), уделяется повышенное внимание лексическому, синтаксическому и семантическому разбору программ в исходном коде, генерации машинного кода. В.А.Серебряков, М.П.Галочкин

Основы конструирования компиляторов

В.А.Серебряков, М.П.Галочкин. Основы конструирования компиляторов

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

Графический редактор

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

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


Бесплатный аналог Photoshop. У него почти такой же, но менее проработанный функционал. Подойдет тем, кому нужен приличный редактор, но без наворотов и платной подписки.

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

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

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

Почти все знают, что языки типа 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. Введение в технологии виртуализации.

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

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

Работа с редактором Python. Общие вопросы. Интерактивный и программный режимы работы. Набор текста программы

Поиск на других ресурсах:


Интегрированная среда разработки IDLE (Integrated Development Environment) Python поддерживает 2 режима работы:

  • интерактивный режим. В этом режиме команды выполняются сразу после их вызова. Результат выполнения команд сразу выводится на экран (рисунок 1). Этот режим работы хорошо подходит для написания простых программ и тестирования работы фрагментов кода;
  • программный режим. В этом режиме сначала записывается вся программа, а потом эта программа выполняется полностью. Предварительно текст программы нужно сохранить. Программа на языке Python носит имя «сценарий»или «скрипт».

Рис. 1. Окно Python в интерактивном режиме

Рис. 2. Окно Python в программном режиме

2. Особенности интерактивного режима

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

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

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

3. Как в интерактивном режиме вводятся многострочные инструкции

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

Например.

>>> x=3
>>> y=8
>>> if x>0: # многострочная инструкция
        y=5 # здесь нужно 2 раза нажать Enter


>>>

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

4. Особенности программного режима

Программный режим позволяет сохранять программы длительное время. В программном режиме текст программы сначала записывается в файл, затем этот файл выполняется в интегрированной среде. Файлы на языке Python имеют расширение *.py и называются модулями. Модули – это простые текстовые файлы. Код модулей может выполняться сколько угодно. Интерпретатор Python выполняет весь программный код в модуле.

Файлы модулей, которые запускаются на выполнение непосредственно, еще называются сценариями.

5. Какие недостатки интерактивного режима?

Интерактивный режим имеет следующие взаимосвязанные недостатки:

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

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

File->New File

как показано на рисунке 3.

Рис. 3. Команда File->New File

В результате откроется новое окно редактора, в котором нужно ввести текст на языке Python. На рисунке 4 изображено окно файла myprog1.py с текстом программы.

Рис. 4. Окно файла myprog1.py с текстом программы на языке Python

Чтобы запустить файл myprog1.py на выполнение нужно вызвать команду Run из меню Run или нажать клавишу F5 (рисунок 5).

Рис. 5. Команда запуска программы на выполнение

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

============== RESTART: C:/Programs/Python/myprog1.py ==============
10
>>>

Представление данных в Python. Понятие объекта. Идентичность, тип, значение объекта. Функции id(), type(). Операторы is, is not

Литература

  • Интерпретация языка структурная // Энциклопедия кибернетики / Глушков В. М.. — Киев: Главная редакция УСЭ, 1974. — Т. 1. — С. 390-391. — 608 с.
  • Кнут Д. Э. 1.4.3 Программы-интерпретаторы // Искусство программирования. Том 1. Основные алгоритмы = The Art of Computer Programming. Volume 1. Fundamental Algorithms / под ред. С. Г. Тригуб (гл. 1), Ю. Г. Гордиенко (гл. 2) и И. В. Красикова (разд. 2.5 и 2.6). — 3. — Москва: Вильямс, 2002. — Т. 1. — 720 с. — ISBN 5-8459-0080-8.
  • Макконнелл С. Совершенный код. — М.: Русская редакция, 2010. — 896 с. — ISBN 9785750200641.
  • Роберт У. Себеста. 1.7.2 Чистая интерпретация // Основные концепции языков программирования. — 5-е изд. — М.: Вильямс, 2001. — С. 50-52. — 672 с. — ISBN 5845901928.
  • Michael L. Scott. Programming Language Pragmatics. — Morgan Kaufmann, 2000. — ISBN 1558604421.

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

Достоинства

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

Недостатки

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

Самые популярные программы интерпретатора

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

Современные функции компилятора:

  1. Компиляция. Сборка всех фрагментов кода.
  2. Интерпретация. Создание полумашинного кода.
  3. Линковка. Связывания частей интерпретированного кода в памяти.

Итак, из этого можно еще лучше понять, насколько интерпретатор — это мощное средство, поскольку без него программирование было бы таким же, как и в 60-х годах 20 века, то есть невероятно сложным. Теперь надо рассказать, какие же интерпретаторы (в составе компиляторов) на данный момент самые популярные:

  1. MVS. Популярный компилятор от «Майкрософт» для языка программирования С++.
  2. Xcode. Используется для создания приложений под технику Apple.
  3. MinGW. Один из самых распространенных компиляторов для языков программирования С и С++. Является прямым конкурентом MVS.

Примечания

  1. Дорот В. Л., Новикав Ф. А. // Толковый словарь современной компьютерной лексики. — 3-е изд. — СПб.: БХВ-Петербург, 2004. — С. 215. — 608 с. — ISBN 9785941574919. — ISBN 5941574916.
  2. Макарова Н. В., Волков В. Б. // Информатика: Учебник для вузов. — СПб.: Питер, 2015. — С. 557. — 576 с. — ISBN 9785496015509.
  3. Microsoft Press. interpret, interpreted language // Толковый словарь по вычислительной технике. — М.: Русская редакция, 1995. — С. 236. — 496 с. — ISBN 5750200086. — ISBN 1556155972.
  4. ↑ I.153 interpretative language // Толковый словарь по вычислительным систамам / Под ред. В. Иллингуорта и др.. — М.: Машиностроение, 1990. — С. 241-242. — 560 с. — ISBN 521700617X.
  5. Кочергин В. И. interpreter // Большой англо-русский толковый научно-технический словарь компьютерных информационных технологий и радиоэлектроники. — 2016. — ISBN 978-5-7511-2332-1.
  6. ↑ Интерпретатор, Интерпретация // Толковый словарь по информатике / Под. ред. Г.Г. Пивняка. — Днепропетровск: Национальный горный университет, 2008. — С. 327-328. — 599 с. — ISBN 978-966-350-087-4.
  7. Воройский Ф. С. // Информатика. Энциклопедический словарь-справочник. — М.: Физматлит, 2006. — С. 325. — 768 с. — ISBN 5922107178. — ISBN 9785457966338.
  8. , 25.3. Где искать жир и патоку? Интерпретируемые языки, с. 585.
  9. , 32.4. Советы по эффективному комментированию. Производительность не является разумной причиной отказа от комментирования, с. 774.
  10. ↑ .
  11. Пратт Т., Зелковиц М. 2.1.3 Трансляторы и виртуальная архитектура // Языки программирования: разработка и реализация. — СПб.: Питер, 2002. — 688 с. — ISBN 5318001890.

С этим читают