vak: (бэсм-6)
Serge Vakulenko ([personal profile] vak) wrote2025-05-27 01:49 pm

Трёхадресный код

Я в раздумьях. Парсер отлично генерит AST. Пора превращать его в TAC, то есть так называемый трёхадресный код. Структуры для TAC я сгенерил (tac.h). Вот их визуализация.



По сути, трехадресный код представляет собой абстрактный язык ассемблера — последовательность простых инструкций, использующих один унарный или бинарный оператор и не более трех адресов памяти: один для результата и два для аргументов. Но не такой уж абстрактный: TAC в курсе устройства оперативной памяти, а также размеров и формата чисел в хардвере. И не такой уж ассемблер: TAC имеет строгую систему типов.

После TAC следующим этапом Си-компилятора будет кодогенератор. То есть превращение в реальный ассемблерный код целевой машины. Но сначала имеет смысл отладить TAC сам по себе. Добиться получения правильного TAC из AST. Как его проверять? Неужели строить симулятор абстрактной TAC-машины. И ассемблер к ней понадобится. Чтобы писать программы на TAC непосредственно, без помощи компилятора.
juan_gandhi: (Default)

[personal profile] juan_gandhi 2025-05-28 12:08 am (UTC)(link)
Хм. Ну да, наверно. Нужна TAC-машина и что-то вроде ассемблера. Машину-то навалять дело нехитрое, хоть на каком языке. А вот ассемблер... ох, я всё бы это дело на форту написал. Думаю, и Лёня согласится. Ассемблер на форту плёвое дело навалять, а машину всё равно на чём.
spamsink: (Default)

[personal profile] spamsink 2025-05-28 12:36 am (UTC)(link)
Хохмы ради, у каждого нынче есть интерпретатор продвинутого форта в виде постскрипта (ghostscript), а он умеет выдавать текст в стандартный вывод.
juan_gandhi: (Default)

[personal profile] juan_gandhi 2025-05-28 02:15 am (UTC)(link)
Разве не всегда так было?
spamsink: (Default)

[personal profile] spamsink 2025-05-28 05:48 am (UTC)(link)
Windows subsystem for Linux была не всегда, а виндовсный ghostscript был гуёвый.
x86128: (Default)

[personal profile] x86128 2025-05-28 02:17 am (UTC)(link)
А чем обусловлен выбор именно трехадресного кода а не стекового?
Edited 2025-05-28 02:17 (UTC)
sab123: (Default)

[personal profile] sab123 2025-05-28 07:04 am (UTC)(link)
Стековый код удобно интерпретировать, но перевести его в прямые машинные инструкции будет наверное очень затруднительно.
archaicos: Шарж (Default)

[personal profile] archaicos 2025-05-28 03:23 am (UTC)(link)
Просто генери промежуточный код совместимый с MIPS. Можно с макросами для инструкций, которые не существуют в таком трёхадресном виде. А потом это можно просто в эмуляторе MIPS запустить.
archaicos: Шарж (Default)

[personal profile] archaicos 2025-05-30 01:22 pm (UTC)(link)
Если речь не совсем об этом, то дерево, описывающее выражение, можно преобразовать в текстовое представление со скобками (привет LISP'у!), а потом в тесте проверять, что получается то дерево, которое нужно сравнением с верным представлением из некоторой эталонной строки. И так делать два раза: один – с деревом сразу после разбора исходника, другой – c тем же деревом, но уже после вставки преобразований типов в нём.