Зачем нужны системы программирования?
Трансляторы
Состав системы программирования
Основа любой системы программирования — транслятор.
Транслятор — это программа, которая переводит в машинные коды тексты программ, написанных на языке высокого уровня.
Существуют два типа трансляторов: интерпретаторы и компиляторы.
Интерпретатор анализирует текст программы по частям. Разобрав очередной фрагмент, он немедленно выполняет описанные в нем действия и переходит к обработке следующего фрагмента.
Достоинства интерпретаторов:
• программы переносимы (программа будет работать в любой системе, где установлена программа-интерпретатор);
• удобно отлаживать программу.
Есть и существенные недостатки.
• программу невозможно выполнить, если не установлен интерпретатор;
• программы выполняются медленно (в цикле из 100 шагов каждая строчка 100 раз «разбирается» интерпретатором);
• в тех частях программы, которые не выполнялись во время отладки, могут оставаться синтаксические ошибки.
Второй тип трансляторов — компиляторы. Они, в отличие от интерпретаторов, сразу переводят всю программу в машинный код и строят исполняемый файл, готовый к запуску.
Достоинства компиляторов:
• чтобы запустить программу, не нужно устанавливать транслятор;
• поскольку программа уже переведена в машинные коды, она выполняется значительно быстрее, чем при использовании интерпретатора.
Недостатки тоже есть:
• при любом изменении нужно ждать окончания компиляции (перевода в коды); это несколько затрудняет отладку;
• готовая программа будет выполняться только в той операционной системе, для которой она была создана1.
1 Многие программы, разработанные для ОС Windows, могут быть запущены в Linux с помощью программы-оболочки Wine (www.winehq.org).
Чтобы как-то совместить достоинства интерпретаторов и компиляторов, была предложена идея компиляции программы в некоторый промежуточный исполняемый код (псевдокод, P-код), а не сразу в команды конкретного процессора. Для выполнения такого псевдокода нужна специальная среда — виртуальная машина, которую в принципе можно разработать для любого процессора и любой операционной системы.
Программа сначала обрабатывается компилятором, который строит псевдокод, а потом этот псевдокод выполняется интерпретатором.
Таким образом,
• при компиляции в псевдокод проверяются все синтаксические ошибки, поэтому при выполнении такую проверку делать не нужно; это значительно ускоряет работу программ в сравнении с интерпретацией;
• обеспечивается переносимость программ — можно выполнять программу (псевдокод) на любом компьютере, где есть виртуальная машина.
Байт-код — это разновидность псевдокода, в котором команда занимает 1 байт, а далее следуют её аргументы (или их адреса). Современные версии интерпретируемых языков Perl, РНР, Python используют компиляцию в байт-код для ускорения выполнения программы.
Готовые программы на Java распространяются в виде байт-кода, поэтому для их выполнения необходимо установить виртуальную Java-машину. При этом для ускорения работы часто используется JIT-компиляция (англ. JIT — just-in-time — в это самое время), при которой байт-код «на лету» преобразуется в команды конкретного процессора. Тогда при повторном выполнении команды трансляция уже не нужна.
Аналогичный подход применяется в среде .NET, которую разработала фирма Microsoft. Одна из основных идей среды .NET — объединение программ, написанных на разных языках. В частности, разные части программы могут быть написаны на С#, J#, VB.NET, Delphi.NET, все они в конечном счёте транслируются в байт-код на промежуточном языке IL (англ. Intermediate Language), который потом выполняется виртуальной машиной.
Следующая страница Состав системы программирования