Усовершенствование интерпретатора Mini С++ |
Mini С++ разрабатывался так, чтобы было легко следить за его функционированием. Основной целью было создание интерпретатора, принцип действия которого можно понять без особых усилий. Он также разрабатывался с учетом возможного расширения. Поэтому интерпретатор Mini С++ не особенно быстр и эффективен, но содержит базовую структуру, производительность которой можно повысить с помощью следующих действий. Практически все коммерческие интерпретаторы расширяют роль процедуры предварительного просмотра. Весь исходный код программы переводится из удобной для чтения формы во внутренний формат. В этом формате все переменные и строки, кроме заключенных в кавычки, преобразованы в целочисленные лексемы, подобно тому, как Mini С++ преобразует ключевые слова языка С++ в целочисленные лексемы. Вы, вероятно, заметили, что Mini С++ проводит ряд сравнений строк. Например, каждый раз, когда ведется поиск той или иной функции или переменной, требуется несколько сравнений строк. Подобные сравнения занимают много времени, а если заменить строки целочисленными лексемами, можно использовать гораздо более быстрое целочисленное сравнение. В целом, преобразование кода во внутренний формат — единственное наиболее важное изменение в Mini С++, направленное на повышение его эффективности. Выигрыш в скорости будет огромным. Другая часть, которую можно улучшить, в основном существенная для больших программ, — процедуры поиска переменных и функций. Даже если вы преобразуете их в целочисленные лексемы, примененные в интерпретаторе алгоритмы используют последовательный поиск. Вы же можете применить более быстрый метод. Например, попробовать использовать контейнер тар или, может быть, хэширование либо структуру дерева. Как уже отмечалось ранее, одно из ограничений Mini С++ по сравнению с полным С++ состоит в том, что формирующие результат части управляющих операторов, таких как if, должны быть блоками кода, заключенными в фигурные скобки. В результате функция find_eob(), которая ищет конец блока кода после выполнения управляющего оператора, существенно упрощается. Ей нужно только найти закрывающую фигурную скобку, которая соответствует скобке в начале блока. Интересным упражнением может стать попытка избавиться от этого ограничения.
|