Интерпретатор языка 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 раз.