Проведенные эксперименты и результаты
Для сравнения между собой были выбраны:
Python модули Tokenizer (лексический анализатор) и AST (синтаксический анализатор).
Анализаторы, сгенерированные при помощи flex и bison.
Модули lexer и parser представленного компилятора.
Сравнение времени работы лексических анализаторов
|
Количество лексем |
100000 | 1000000 | 2000000 | 3000000 | 4000000 | 5000000 | |
|
Лексические анализаторы |
Tokenizer (ms) |
254 |
2791 |
5657 |
8587 |
11717 |
14103 |
|
flex (ms) |
15 |
155 |
296 |
437 |
632 |
752 |
|
|
lexer (ms) |
12 |
123 |
265 |
401 |
479 |
607 |
|
Сравнение времени работы синтаксических анализаторов
|
Количество функций |
100 |
1000 |
10000 |
100000 |
200000 |
|
|
Синтаксические анализаторы |
python AST (ms) |
22 |
174 |
2663 |
17934 |
26901 |
|
bison (ms) |
8 |
28 |
236 |
1726 |
2589 |
|
|
parser (ms) |
2 |
25 |
175 |
1458 |
2187 |
|
Выводы
Из таблиц видно, что реализации модулей python сильно медленнее в сравнении с остальными, в то время как остальные модули близки друг к другу. Отметим, что:
Часть операций для Tokenizer и AST выполняется интерпретатором Python, другая часть выполняется Cи библиотекой.
Модули Tokenizer и AST поддерживают большее количество языковых конструкций.
Модуль AST также сохраняет большее количество второстепенной информации, которая используется следующими модулями компилятора.