Это первый пост про компиляцию, который я прочитал.
Нет, не потому что он хорошо написан, просто дочитал до конца от удивления, что у вас все так складно получилось.
Что вообще за язык вы творите?
У вас же из типов только int.
Как будет представлен double?
А вдруг у вас язык динамически-типизированный?
Тогда эти функции, выполняющие роль операторов, можно сразу выкинуть. Заглушка не более.
В общем получилось довольно неплохо. Если не секрет сколько строк кода это чудо в себя включает?
Хочу сравнить с интерпретатором Лиспа, который сейчас творю.
1.5к строк в интерпретаторе с оптимизацией. А у вас?
В жизни тоже забавно получается:
— приложения для Android пишутся на Java и компилируются в стековый байткод (как MSIL), потому что так проще писать компилятор
— но для того чтобы запустить программу на телефоне, её нужно перевести в другой P-код, dalvik. А там регистровая виртуальная машина!
потому что на телефоне очень туго с производительностью, а машину написали в Гугле. они там умные, им не сложно =)
3) дошло, в чём баг :)
Ну значит, вы правы: на каждом создании новой переменной стоит брать новый регистр, а оптимизатор потом соптимизирует лишние копирования.
ну с таким «распределителем регистров» 256 регистров в трубу вылетят достаточно быстро =)
у вас вообще получилось почти SSA форма с автоматической протяжкой копий «x = y;» [правда не совсем, все-таки можно потом написать x = expr;" это нарушит SSA свойство… ну и phi-функций нет..]
Компиляция. 6: промежуточный код