PDA

Просмотр полной версии : "Утерянный" язык BLISS: идеальная кодогенерация для PDP-11



Oleg N. Cher
11.01.2026, 19:33
Просто оставлю это здесь ;)

BLISS-11 как кодогенератор для PDP-11

BLISS-11 — это диалект языка BLISS, специально адаптированный для PDP-11, разработанный в начале 1970-х в сотрудничестве между Carnegie Mellon University (CMU) и Digital Equipment Corporation (DEC). Он был создан как кросс-компилятор: хостился на PDP-10 (где хватало памяти для компилятора), но генерировал машинный код исключительно для PDP-11. Это ключевой момент — BLISS-11 не предназначен для нативного выполнения на PDP-11 из-за ограничений 16-битной архитектуры (малый объём памяти, адресное пространство). Вместо этого он фокусировался на генерации высококачественного, оптимизированного кода для PDP-11, делая его мощным инструментом для системного программирования (например, для ОС, диагностики и компиляторов вроде PDP-11 FORTRAN IV-PLUS).

Оригинальные исходники компилятора BLISS-11 (как и бинарники для PDP-10) действительно считаются утерянными в публичном цифровом доступе. Мои поиски по веб (включая GitHub, bitsavers.org, trailing-edge.com, архивы DECUS и форумы вроде retrocomputing) не выявили полных исходников. Есть только tape images для PDP-10 (с бинарниками BLISS-36/10, но не BLISS-11), manuals и исторические описания. Однако, на основе детальных документов (в частности, статьи Ronald F. Brender из 2002, которая основана на внутренних DEC/CMU материалах), можно реконструировать, как BLISS-11 устроен как кодогенератор. Я опираюсь на это, чтобы описать архитектуру — это closest к вашему интересу.

Общая архитектура BLISS-11 как компилятора/кодогенератора

BLISS-11 был полностью переписан по сравнению с BLISS-10 (для PDP-10), с акцентом на оптимизацию кода для ограниченной PDP-11. Он следовал "генеративному" подходу: переводил высокоуровневый код BLISS в эффективный машинный код PDP-11 "на лету", с пост-проходами для уточнения. Компилятор был однопроходным в основном, но с элементами multi-pass для оптимизаций. Ключевые принципы:

Типлессность и низкоуровневый доступ: BLISS — типлессный язык (все данные — машинные слова), что позволяло прямой доступ к hardware PDP-11 (регистри, память). Это делало его "ассемблером высокого уровня" с фокусом на качество кода, а не на абстракциях.Оптимизация под PDP-11: PDP-11 имел 16-битные слова, 8-битные байты, отсутствие byte-pointers и ограниченную память (64KB). Компилятор минимизировал overhead: генерировал компактный код, оптимизировал под sign/unsigned (инструкции вроде MOVB с sign-extend), и полагался на программиста для глобальных оптимизаций (локальные — на компиляторе).Bootstrapping и кросс-компиляция: BLISS-11 сам был написан на BLISS-10. Для генерации кода: исходники на BLISS-11 компилировались на PDP-10 в объектный код PDP-11, затем переносились (на лентах или перфокартах) на PDP-11 для выполнения. Нет нативного self-hosting на PDP-11.
Структура компилятора (на основе описаний Brender):

Фронтенд (парсер и препроцессор):

Парсит BLISS-код: выражения (expression-oriented, без statement/expression различия), структуры (алгоритмические, как векторы/матрицы с вычисляемыми offset).Новый макро-система: lexeme-based (простые, условные, итеративные макросы). Например, итеративный макрос для повторений (INIT_LOCAL_VEC для векторов).Лексические функции (%count, %length) для compile-time вычислений, улучшающие кодогенерацию.
Средний уровень (анализ и оптимизации):

Нет сложных IR вроде CFG+SSA или Sea of Nodes — простая генерация "на лету".Локальные оптимизации: константное сворачивание, удаление мёртвого кода, оптимизация под PDP-11 регистры (8 регистров, включая PC/SP).Адаптации для hardware: переформулировка byte-операций (Y<1,1> = .X<0,1> для байтов), unsigned операторы (EQLU, LEQU), атрибуты BYTE/WORD для аллокации.Контроль потока: Добавлены labels для escape (leave label [with expr]), упрощающий циклы/ветвления по сравнению с BLISS-10.
Бэкенд (кодогенератор):

Генерирует PDP-11 машинный код напрямую: использует machop для декларации PDP-11 инструкций (например, прямой маппинг на ADD, SUB, BIS).Фокус на качестве: Минимизация инструкций для 16-бит адресации (zero-extend для subword, чтобы избежать overhead sign-extend). Нет floating-point (PDP-11 не имел hardware в ранних моделях).Пост-проходы: После базовой генерации — уточнение (peephole optimizations) для PDP-11 специфики, как оптимизация под режимы адресации (регистр, deferred, auto-increment).Вывод: Relocatable object modules (.OBJ) для линковки с PDP-11 ассемблером/linker.
Плюсы как кодогенератора для PDP-11

Эффективность: Генерировал код, близкий к ручному ассемблеру, но с читаемостью (структуры, циклы без goto). Использовался в реальных продуктах: PDP-11 FORTRAN IV-PLUS (компилятор на BLISS-11), диагностика DEC, Hydra OS в CMU.Гибкость: Typeless + machop позволяли fine-tune под PDP-11 (например, прямой доступ к регистрам как переменным).Компактность: Оптимизации под малую память — ключ для PDP-11 (например, в RT-11 или RSX-11).
Минусы

Сложность bootstrapping: Зависимость от PDP-10 для компиляции.Ограничения: Нет глобальных оптимизаций (phase ordering problem); floating-point опущен; не self-hosted.Устарелость: Для современных эмуляторов (SIMH PDP-11) можно использовать later диалекты вроде Common BLISS, но не оригинал.
Где искать дальше (если не утеряно полностью)

Tape images: На trailing-edge.com есть PDP-10 tapes с BLISS-36 (BB-J941F-BB), где могут быть .BLI файлы (BLISS sources) для BLISS-11 cross-compiler. Скачайте, монтируйте в SIMH эмулятор PDP-10, и проверьте директории /bliss/ на SIX12.BLI (упомянут как ~1779 строк для BLISS-10, но возможно части для -11). Это не чистые PDP-11 sources, но bootstrap-части.Архивы CMU/DEC: Kilthub.cmu.edu имеет manual BLISS-11 (1970s), но не код. Контакт с CMU archives или DECUS (если сохранились microfiche).Современные альтернативы: GitHub sergev/bliss-compiler (BLISS-M) — portable cross-compiler с LLVM backend, может генерировать PDP-11-like код (хотя не оригинал). Для эмуляции: используйте с SIMH PDP-11.Насчёт бэк-энда LLVM для PDP-11 Грок походу приврал, но жаль, что всё утеряно. А то был бы у нас "фирменный" "идеальный" язык для PDP-11. :)

Hunta
11.01.2026, 19:47
был бы у нас "фирменный" "идеальный" язык для PDP-11
Что бы некоторые не раскатывали губу насчёт "идеального" языка, пример парочки подпрограмм на BLISS-11:


! GENERAL PURPOSE NUMBER OUTPUT ROUTINE
! -------------------------------------

ROUTINE OUTN(N,B,RD)=
BEGIN OWN NUM,NUMNP,BASE,REQD,COUNT;
ROUTINE XN=
BEGIN REGISTER R;
IF .NUM EQL 0 THEN RETURN
(OUTM(" ",.REQD-.COUNT); IF ISON(NUMNP) THEN OUTC("-"); .VREG);
R_.NUM MOD .BASE; NUM_.NUM/.BASE; COUNT_.COUNT+1; XN(); OUTC(R_.R+"0")
END;
NUMNP_ COUNT_ (.N LSS 0);
BASE_.B; REQD_.RD;
IF (NUM _ ABS(.N) AND NOT 1^35) NEQ 0 THEN RETURN XN();
OUTM(" ",.REQD-1-.NUMNP); IF .NUMNP NEQ 0 THEN OUTC("-"); OUTC("0");
.VREG
END;

ROUTINE SDDTFA(X)=
! GIVEN A SYMBOL, SEARCH DDT SYMBOL-TABLE FOR ITS VALUE
BEGIN REGISTER R;
HLRE(R,JOBSYM); R_ -.R; R_ .R^18 + .R + .JOBSYM<RH>;
WHILE (R_.R-#2000002) GEQ 0 DO
IF .(.R)<0,32> EQL .X THEN RETURN @(.R+1);
ERROR(0)
END;

Oleg N. Cher
11.01.2026, 19:53
Идеальный не в плане красоты синтаксиса, а по качеству кода.

Синтаксис да, архаичный.

Hunta
11.01.2026, 20:08
по качеству кода
Поскольку написать, странслировать и проверить - не на чем - чего там с качеством кода - только по слухам. Ну может ещё в DRPFN.MAC покопаться, он исходно на BLISS написан. И по поводу красоты синтаксиса и качества кода - начнётся то всё с человека, а там ТАКОЙ КРАСОТЫ синтаксис, что я уже попытки четыре делал, что бы хоть как-то въехать, но.. без транслятора, всухую.. Хрен без водки разберёшься.

И ещё момент. Исходный BLISS-11 компилятор с большой долей вероятности траслировать в .MAC, а не в .OBJ

Oleg N. Cher
11.01.2026, 20:45
Ну транслятор BLISS ведь есть. И даже не один, кажется. На GitHub. Только, увы, не для PDP-11.

Hunta
11.01.2026, 21:21
Ну транслятор BLISS ведь есть. И даже не один, кажется. На GitHub. Только, увы, не для PDP-11.
И на хуа они? Если не для PDP-11. Учитывая, что тема называется

"Утерянный" язык BLISS: идеальная кодогенерация для PDP-11

- - - Добавлено - - -

В общем, повторяется история с PL/M
Главное - что-нибудь сказать. А насколько это применимо и удобно - "я же концептуальщик, а не практик"

- - - Добавлено - - -


Синтаксис да, архаичный.
Там синтаксис не архаичный, там весьма СПЕЦИФИЧНЫЕ как синтаксис, так и семантика.
И опять же - поскольку исходного компилятора нет... Писать исключительно на бумажке и восхищатьс - какой крутой кодогенератор

Oleg N. Cher
11.01.2026, 21:45
PL/M повезло больше. Компилятор отреверсили.
И хотя я бы натянул на PL/M какой-то более вменяемый синтаксис, раз уж ничего лучше по кодогенерации для 8080 у нас нет.

BLISS остаётся вещью в себе.

А почему вы с парнями не завели хотя бы какой-то компилер Модулы-2 ?

Hunta
11.01.2026, 22:40
А чего его заводить. Компилятор есть. От Вирта + компания. Исходно - под RT-11, с моей доработкой - под RSX. Но сам по себе компилятор - это не всё, нужны ещё всякие библиотеки.