PascalABC.NET
November 17, 2022

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