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.