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. Переписать это дело на Би и вызывать вместо печати мадленовского текста.

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

Date: 2025-04-25 06:52 am (UTC)
x86128: (Default)
From: [personal profile] x86128
Мне нравится идея что Би выдает ассемблерный код, этот код можно будет как-то обработать и потом собрать в библиотеку или же слинковать вместе в бинарь. Если выдавать сразу бинарный объектник возможность как-то обработать будет утрачена.

Что касается кода выдаваемого на присваивание это очень странно, с чем это может быть связано. Видимо тут какая-то особенность того что он изначально был сделан для PDP?

Если добавлять оптимизации то боюсь что компилятор сильно распухнет и не будет self-hosted (а хотелось бы эту аутентичность сохранить)

Я как-то давно упражнялся в компиляторо-писании и делал транслятор из упрощенного Оберона в инструкции БЭСМ-6 (нашей МЭСМ-6) и ради теста запустил на таком примере:

MODULE Halt;

var a,b : integer;

begin
b := a
END Halt.


Выдает вот такой вот псевдо код (М15 стек, точно не помню, но вроде М1 - фрейм, М2 - таблица констант или глобальных переменных):

[('LABEL', 'Halt_main'),
('ALLOC', 2),
('VLOAD', -2, 'a'),
('VSTOR', -1, 'b'),
('STOP', '12345')]
TEXT:
00000: VTM 10 ,M1
00001: VTM 10 ,M15
00002: VTM 8 ,M2
00003: UJ 4
00004: Halt_main UTM 2 ,M15
00005: XTA -2 ,M1
00006: ATX -1 ,M1
00007: STOP 12345
00008: WORD 0
00009: WORD 0

CONSTANT TABLE:

PROCEDURE TABLE
Halt_main: 4

STOP at PC=7 code=12345 ir=0

у меня там крайне простой алгоритм который аккумулятор рассматривает как вершину стека и не совершает никаких оптимизационных проходов, то есть генерит код как и деды 60 лет назад

В общем, загадка Би

Date: 2025-04-25 06:55 am (UTC)
x86128: (Default)
From: [personal profile] x86128
Хочу бэкендик состряпать для Би, но пока руки не доходят. На БЭСМ вообще красиво ложится

Date: 2025-04-25 03:05 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
С учетом того, что у одного бинарного модуля весьма ограниченное количество входов, если хочется выдавать бинарные модули, то придется сильно извращаться - сохранять объявления функций где-то на барабане и рестартовать компилятор.

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. 3rd, 2026 07:37 pm
Powered by Dreamwidth Studios