Важная информация

User Tag List

Показано с 1 по 8 из 8

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

  1. #1

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,765
    Спасибо Благодарностей отдано 
    2,737
    Спасибо Благодарностей получено 
    173
    Поблагодарили
    133 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

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

    Просто оставлю это здесь
    Цитата Сообщение от GROK
    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.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,536
    Спасибо Благодарностей отдано 
    346
    Спасибо Благодарностей получено 
    718
    Поблагодарили
    600 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    был бы у нас "фирменный" "идеальный" язык для 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;

  4. #3

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,765
    Спасибо Благодарностей отдано 
    2,737
    Спасибо Благодарностей получено 
    173
    Поблагодарили
    133 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Идеальный не в плане красоты синтаксиса, а по качеству кода.

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

  5. #4

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,536
    Спасибо Благодарностей отдано 
    346
    Спасибо Благодарностей получено 
    718
    Поблагодарили
    600 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

    Этот пользователь поблагодарил Hunta за это полезное сообщение:

    jerri(11.01.2026)

  6. #5

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,765
    Спасибо Благодарностей отдано 
    2,737
    Спасибо Благодарностей получено 
    173
    Поблагодарили
    133 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну транслятор BLISS ведь есть. И даже не один, кажется. На GitHub. Только, увы, не для PDP-11.

  7. #6

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,536
    Спасибо Благодарностей отдано 
    346
    Спасибо Благодарностей получено 
    718
    Поблагодарили
    600 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Ну транслятор BLISS ведь есть. И даже не один, кажется. На GitHub. Только, увы, не для PDP-11.
    И на хуа они? Если не для PDP-11. Учитывая, что тема называется
    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    "Утерянный" язык BLISS: идеальная кодогенерация для PDP-11
    - - - Добавлено - - -

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

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

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

    Этот пользователь поблагодарил Hunta за это полезное сообщение:

    jerri(11.01.2026)

  8. #7

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,765
    Спасибо Благодарностей отдано 
    2,737
    Спасибо Благодарностей получено 
    173
    Поблагодарили
    133 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

  9. #8

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,536
    Спасибо Благодарностей отдано 
    346
    Спасибо Благодарностей получено 
    718
    Поблагодарили
    600 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Техническая литература: Язык программирования "Бейсик"
    от Viktor2312 в разделе Техническая литература
    Ответов: 18
    Последнее: 22.09.2025, 14:21
  2. "MS-DOS" (ну.. не совсем конечно) на PDP-11 :)
    от Hunta в разделе ДВК, УКНЦ
    Ответов: 7
    Последнее: 10.02.2024, 17:26
  3. Ответов: 87
    Последнее: 13.07.2022, 21:19
  4. Ответов: 206
    Последнее: 19.08.2020, 10:36

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •