vak: (Default)
[personal profile] vak
В симуляторе dubna заработал компилятор с языка программирования Би. Подробности смотрите в списке рассылки: besm6/c/cRbp6A-dUXc/m/_al8inGlDQAJ

Чем Би может быть нам полезен? Во первых, в чисто познавательном отношении. Из его исходников многое видно и понятно. Во вторых, Би может помочь разобраться, что и как надо делать в компиляторе Си.

Стоит ли улучшать сам компилятор Би? Судя по сдержанной реакции публики, никто так и не заглянул в порождаемый ассемблерный код. Там нельзя сказать чтобы совсем ужас-ужас, но можно многое улучшить. Это одно потенциальное направление развития. Другое направление - вместо ассемблерного текста выдавать сразу бинарный объектный модуль. Но честно говоря, я не вижу, кто собирается пользоваться этим компилятором. Так что актуальность низкая.

Как улучшить качество генерируемого кода? Сейчас код выдаётся сразу непосредственно из парсера. По этой причине никакая пост-обработка невозможна. Надо вместо немедленной выдачи кода через printf (или write) складывать его в некий буфер. Это может быть массив размером, скажем на 100 машинных команд или больше, там видно будет. Для каждой команды можно хранить четыре слова:
  • номер индекс регистра
  • код машинной команды
  • тип адреса
  • значение адреса
Смысл значения адреса зависит от типа адреса. Для глобальных переменных это индекс в таблице имён. Для локальных переменных это смещение относительно базового регистра r7. Для формальных параметров функции это смещение относительно базового регистра r6. Для литералов это собственно содержимое слова-литерала. Для меток это уникальный индекс метки.

После каждого добавления машинной команды в этот буфер вызывается функция оптимизации. Она реализует набор эвристик. Смотрит на последнюю команду и на предыдущие, и при возможности заменяет их на более оптимальную последовательность. К примеру, сейчас присваивание "x = y" генерится как:
  14,VTM,X
,ITA,14
14,VTM,Y
,ITS,14
,ATI,14
14,XTA,
15,WTC,
,ATX,
Это безобразие должно преобразовываться в:
    ,XTA,Y
,ATX,X
Как выдавать бинарный модуль? У нас имеется реализация формата бэсмовского модуля на Си: stdobj.c, stdobj.h. Переписать это дело на Би и вызывать вместо печати мадленовского текста.

Придётся переделать размещение строковых литералов. Проще всего писать их на временный барабан, а в конце каждой функции добавлять в конец бинарного модуля.

Profile

Сообщество любителей БЭСМ-6

January 2026

S M T W T F S
    123
45678910
11121314151617
18192021222324
2526272829 3031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 2nd, 2026 03:27 am
Powered by Dreamwidth Studios