Программирование >>  Формирование пользовательского контейнера 

1 ... 114 115 116 [ 117 ] 118 119 120 ... 156



Глава 9

Интерпретатор Mini С++

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

Для исследования элегантной модели С++ в этой главе разрабатывается программа, которая истолковывает часть языка. Существуют два типа программ, способных это делать: компиляторы и интерпретаторы. Создание компилятора не входит в задачу этой книги, а разработка интерпретатора представляется вполне осуществимой. Таким образом, в этой главе описан интерпретатор подмножества языка С++, именуемый Mini С++. Поскольку Mini С++ интерпретирует язык С++, его реализация иллюстрирует на конкретном материале обоснования и разумное объяснение синтаксиса языка С++.

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

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

в сравнении с компиляторами

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



358 (iaeas

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

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

Интерпретатор действует совершенно иначе. Он читает исходный код программы и выполняет каждый встретившийся оператор. Таким образом, интерпретатор не транслирует исходный код в выполняемый. Вместо этого он непосредственно выполняет программу. Главный недостаток интерпретации - потеря скорости выполнения. Интерпретируемая программа выполняется гораздо медленнее, чем ее скомпилированное представление.

Иногда термин интерпретатор применяется в ситуациях, отличных от только что описанной. Например, базовая виртуальная машина Java называется интерпретатором байт-кода (bytecode inteфreter). Это не тот тип интерпретатора, который разрабатывается в данной главе. В ней создается интерпретатор исходного кода, который просто выполняет программу, читая исходный код.

Несмотря на то, что скомпилированные программы работают быстрее, чем интерпретируемые, интерпретаторы все еще широко используются в программировании по следующим причинам. Во-первых, они создают действительно интерактивную среду исполнения, в которой выполнение программы может быть приостановлено и возобновлено по желанию пользователя. Подобная среда хорошо подходит, к примеру, для робототехники. Во-вторых, природа интерпретаторов языка делает их очень удобными для интерактивной отладки программ. В-третьих, интерпретаторы предпочтительней для языков сценариев (script language), таких как язык запросов для баз данных. В-четвертых, они позволяют выполнять программу на разных платформах. Только исполняющий пакет интерпретатора (inteфreters runtime package) может быть всфоен в любое новое окружение.

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



Подсистема

Имя файла

Parser (анализатор)

parser.cpp

Interpreter (интерпретатор)

minicpp.cpp

Library (библиотека)

libcpp.cpp

Mini С++ использует также заголовочный файл mccommon.h.

Определения Mini С++

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

Обзор Mini С++

Интерпретатор Mini С++ содержит большой объем кода. Прежде всего полезно разобраться, как вообще организован интерпретатор. Mini С++ содержит три основные подсистемы: синтаксический анализатор (parser) выражений, обрабатывающий числовые выражения, интерпретатор, выполняющий программу, и набор библиотечных функций.

Анализатор выражений вычисляет числовое выражение и возвращает ре-. зультат. Выражение может содержать константы, такие как 10 или 88, переменные, вызовы функций и, конечно, знаки операций. Примером выражения может быть:

X + num / 32

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

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

В табл. 9-1 перечислены файлы, содержащие названные подсистемы интерпретатора Mini С++.

Таблица 9.1. Файлы, содержащие подсистемы интерпретатора Mini С++



1 ... 114 115 116 [ 117 ] 118 119 120 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика