Последняя тема, рассматриваемая в данном курсе, связана с разработкой, пожалуй, самых сложных программ – трансляторов. Транслятор, как известно, преобразует текст программы, написанный на понятном человеку языке программирования (Паскаль, Delphi, C…) в последовательность кодов машинных команд, записанных в exe-файл. Трансляторы разделяются на три основные группы: ассемблеры, компиляторы и интерпретаторы.
Ассемблер- системная обслуживающая программа, которая преобразует символические конструкции в команды машинного языка. Специфической чертой ассемблеров является то, что они осуществляют дословную трансляцию одной символической команды в одну машинную. Например, команда пересылки содержимого одной из ячеек памяти в другую обозначается как MOV. Язык ассемблера предназначен для облегчения восприятия системы команд компьютера и ускорения программирования в этой системе команд. Программисту гораздо легче запомнить мнемоническое обозначение машинных команд, чем их двоичный код. Основной выигрыш достигается не за счет увеличения мощности отдельных команд, а за счет повышения эффективности их восприятия. Вместе с тем язык ассемблера, кроме аналогов машинных команд, содержит множество дополнительных директив, облегчающих, в частности, управление ресурсами компьютера, написание повторяющихся фрагментов, построение многомодульных программ. Программы на ассемблере, как правило, работают быстрее, чем программы на языках высокого уровня, поэтому во многих проектах критические по скорости выполнения места программ пишут на ассемблере.
В Паскале/Delphi есть возможность использовать команды ассемблера при помощи оператора ASM. Например, процедура очистки буфера клавиатуры (для исключения ложных срабатываний) выглядит так:
PROCEDURE clear_buffer;
BEGIN
ASM
CLI
PUSH ES
PUSH AX
SUB AX,AX
MOV ES,AX
MOV AL,ES:[41AH]
MOV ES:[41CH],AL
STI
POP AX
POP ES
END
END;
Для программирования на ассемблере надо знать обозначения команд конкретного процессора и способы адресации.
Компилятор- это программа, выполняющая трансляцию на машинный язык программы, записанной на исходном языке программирования. Также как и ассемблер, компилятор обеспечивает преобразование программы с одного языка на другой (чаще всего, в язык команд конкретного процессора). Вместе с тем, команды исходного языка значительно отличаются по организации и мощности от команд машинного языка. Существуют языки, в которых одна команда исходного языка транслируется в 7..10 машинных команд. Однако есть и такие языки, в которых каждой команде может соответствовать 100 и более машинных команд (например, Пролог). Кроме того, в исходных языках достаточно часто используется строгая типизация данных, осуществляемая через их предварительное описание. Абстрагирование языка программирования от системы команд компьютера привело к независимому созданию самых разнообразных языков, ориентированных на решение конкретных задач. Появились языки для научных расчетов, экономических расчетов, доступа к базам данных и другие. Delphi является компилятором.
Интерпретатор- программа, осуществляющая пооператорную трансляцию и выполнение исходной программы. В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее. Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы. Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким. Кроме того, отсутствие выходного машинного кода позволяет не "захламлять" внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50..100 раз медленнее программ, написанных в машинных кодах.