vak: (Default)
[personal profile] vak posting in [community profile] besm6
В симуляторе 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. Переписать это дело на Би и вызывать вместо печати мадленовского текста.

Придётся переделать размещение строковых литералов. Проще всего писать их на временный барабан, а в конце каждой функции добавлять в конец бинарного модуля.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

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

January 2026

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

Most Popular Tags

Style Credit

Expand Cut Tags

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