Интерпретатор языка PAlpha на PascalABC.NET
Представляем вашему вниманию интерпретатор простого языка PAlpha, написанный на PascalABC.NET (менее 1200 строк кода). Скорость выполнения простой программы в 3.7 раза выше скорости аналогичной программы на промышленном языке Python 3.9.5.
Коды программ
Вот тестируемая программа на языке PAlpha:
sum = 0.0; i = 1; n = 10000000; while i<n do { sum = sum + 1/i; i = i + 1 }; Print(sum)
Вот скриншот основной программы:
Время работы составляет 982 мс
Вот аналогичная программа на Python
import time n = 10000000 start = time.time() i = 1 sum = 0 while i<n: sum = sum + 1/i i = i + 1 print(sum) print(time.time() - start)
Как видим, результат вычисления одинаков с точностью до погрешности вычислений. Однако время работы Python-программы - в 3.7 раза ниже.
Некоторые технические детали
Интерпретатор написан в рамках курса Методы разработки компиляторов, который ведется на 4 курсе направления ФИИТ мехмата ЮФУ. Его реализация не содержит ничего необычного:
- Лексический анализатор
- Парсер, написанный ручным методом рекурсивного спуска
- Таблица символов
- Таблица переменных времени выполнения
- Семантический анализатор (контроль типов переменных, контроль соответствия количества и типов формальных и фактических параметров функций и процедур, контроль того, была ли описана переменная перед использованием), написанный с помощью паттерна "Визитор".
- Узлы AST-дерева
- Интерпретатор, вшитый в узлы AST-дерева (методы Eval и Execute)
Сам язык включает типы int, double и bool. Язык статически типизирован с неявным объявлением переменных (первое присваивание является описанием). Все переменные глобальны. Язык кроме присваивания содержит условный оператор, оператор цикла while и составной оператор. Приоритет операций - как в Паскале.
Заключение. Простой интерпретатор на 1000 строк, написанный абсолютно классическими и стандартными методами в рамках основного студенческого курса, выполняет программу быстрее интерпретатора промышленного языка программирования Python примерно в 4 раза. Ничего выдающегося. Можно было бы и в 10 раз.