Сообщение от
Bolt
У псевдокода тоже есть свои недостатки. Попробуй добавить в кодогенератор второй, третий процессор - сразу станет ясно что не так в архитектуре компилятора.
псевдокод в данном случае - это не замена ассемблерных команд один-в-один, а каждая команда псевдокода может содержать несколько ассемблерных команд. Т.е. по сути каждая команда псевдокода описывает элементарное действие (запомнить, сложить, делить и т.д.), которое может состоять из нескольких ассемблерных команд.
Вот например, нужно компильнуть: a:=4+(2+3).
При просмотре исходника преобразуем в команды:
Код:
_LoadConst 4 -
_Push - -
_LoadConst 2 -
_Push - -
_LoadConst 3 -
_PopAdd - -
_PopAdd - -
_StoreByte 0 _A
Каждая команда содержит мнемонику, а также один числовой и один строковый параметры (прочерк '-' означает отсутствие значения).
_LoadConst на коде Асма будет ld hl,const
_Push - push hl. Приходится вталкивать в стек каждое значение, иначе заранее неизвестно, что мы с ним будем делать дальше.
_PopAdd - это в реале две команды pop de и add hl,de.
_StoreByte - это запись hl в один байт, т.е. ld a,l и ld(_A),a
Реальный код:
Код:
ld hl,4
push hl
ld hl,2
push hl
ld hl,3
pop de
add hl,de
pop de
add hl,de
ld a,l
ld (_A),a
Теперь, чтобы его оптимизировать, не нужно проводить глубокий анализ всех push-pop и прочего, а только смотрим последовательные комбинации команд и сравниваем с заданными шаблонами оптимизатора. Например, имеется шаблон - последовательность _Push, _LoadConst, _PopAdd заменить на _LoadConst2Add.
_LoadConst2Add состоит из двух команд: ld de,const и add hl,de
Код:
_LoadConst 4 -
_Push - -
_LoadConst 2 -
_LoadConst2Add 3 -
_PopAdd - -
_StoreByte 0 _A
Тогда будет:
Код:
ld hl,4
push hl
ld hl,2
ld de,3
add hl,de
pop de
add hl,de
ld a,l
ld (_A),a
Как-то так. Команды и шаблоны я сам придумываю в своем компиле