Перепрём Паскалечку на язык родных о'Син
Dec. 31st, 2025 04:33 pm Невзирая на сильное пересечение аудиторий разных бэсмовских форумов, напишу и здесь: проект https://github.com/leobru/pas2c-metamorph посвящен переделке компилятора Паскаль-Монитор в компилятор Си.
Ограничения, вызванные спецификой архитектуры:
Ограничения, вызванные спецификой архитектуры:
- Разрядность целых - 48 бит, но работающий диапазон значений для арифметических операций - 41. Сравнение "меньше 0" проверяет не старший бит, а 41-й.
- Для unsigned более или менее эффективными полноразрядными могут быть только сложение и вычитание; желательны два режима: быстрый с использованием СЛЦ (ARX) невзирая на риск циклического переноса, и аккуратное сложение по модулю 2^48. Умножение и деление будут, соответственно, медленным и безумно медленным.
- Применение сдвигов влево к целым числам может приводить к UB (полезна будет опция явного зануления 48-42 разрядов).
- Т. к. стек растет вверх, компиляция vararg functions потребует двух frame registers.
- Объявление register будет полезно только для словных указателей и (в будущем) для "unsigned short". Регистровый unsigned short будет 15-битный.
- При раздельной компиляции для глобальных переменных linkage по умолчанию будет static. Это позволит более эффективное обращение к этим переменным с помощью базового регистра. Глобальные переменные, требующие обращения из нескольких файлов, должны будут быть объявлены как extern везде и быть одной длины (ср. фортрановский common block).
- У main (поначалу?) не будет параметров.
- Работа с файлами будет рудиментарная.
- Последовательность байтов в слове будет для совместимости - от старшего к младшему.
- Пребразование между (int*) и (char*) - номинальное. *(int*)charPtr обратится к слову, где-то в котором находится указываемый символ. Обращение *(char*)intPtr, если intPtr не был получен из char*, пойдёт в никуда (прочитается 0, запись не приведет к изменению памяти).
- Использование вложенных функций, минимизируя необходимость передавать параметры, экономит много памяти. Это, возможно, стоит сохранить.
Если что забыл, буду добавлять.
no subject
Date: 2025-03-16 09:51 am (UTC)no subject
Date: 2025-03-16 03:24 pm (UTC)Вычитание указателей превращается в сложную процедуру, но это довольно редкая операция.
no subject
Date: 2025-03-18 08:06 pm (UTC)У меня сохранился текст дипломной работы про порт PCC на Эльбрус-Б. Там описан в том числе выбор представления указателей. Надо будет переформатировать и выложить. Оказывается, groff плохо понимает кодировку UTF-8.
no subject
Date: 2025-03-16 02:15 pm (UTC)Интересно почему так?
no subject
Date: 2025-03-16 03:15 pm (UTC)no subject
Date: 2025-03-18 08:23 pm (UTC)https://github.com/besm6/pcc/blob/master/pcc-libs/csu/elbrous-b/csv.s
no subject
Date: 2025-03-18 09:38 pm (UTC)И слово в стеке экономится, и команда.
Опять же, поскольку у нас нынче строгий ANSI C, в передаче количества параметров нет необходимости, кроме как для varargs-процедур, объявленных с ...
no subject
Date: 2025-03-19 09:38 am (UTC)no subject
Date: 2025-03-19 08:51 pm (UTC)Хотя, конечно, я понимаю, что писать хоть на машинно-специфичном Паскале, хоть на столь же машинно-специфичной меняющейся каждый день безумной смеси Паскаля и Си охотников мало.
no subject
Date: 2025-03-23 10:26 pm (UTC)1. Изменяем синтаксис входного языка, чтобы стало ближе к B и дальше от BCPL.
2. Добиваемся, чтобы откомпилировался простой тест новой фичи.
3. Изменяем исходник самого компилятора, чтобы его можно было откомпилировать (самим собой).
4. Изменяем исходники рантайм библиотеки и всех остальных тестов и убеждаемся, что они проходят с новым компилятором.
И так десять тысяч вёдер. Трудоёмко получалось. В конце концов кто-то добыл и выложил родные исходники компилятора B от Томпсона. Необходимость в моих мучениях отпала.
no subject
Date: 2025-03-24 04:05 am (UTC)Пока была преимущественно дешевая косметика. Дальше надо будет выносить вычисление константных выражений из генератора кода, переписывать парсер объявления переменных и типов, и парсер выражений, приписывать генератор кода для побочных эффектов, и т. п.
Но замечу, что паскалевский синтаксический сахар с произвольными границами массивов был не просто так: он позволяет оптимизировать индексацию массивов более компактным по коду образом, чем анализировать индексные выражения на вычитание.Это я уже говорил. Просто постоянно об этом думаю, боюсь, насколько размер кода возрастёт.no subject
Date: 2025-03-19 10:10 pm (UTC)no subject
Date: 2025-03-19 10:17 pm (UTC)Кстати говоря, произвольные диапазоны у массивов в Паскале неспроста: работа с массивами гораздо проще оптимизируется, чем каждый раз смотреть в индексное выражение, а нет ли там вычитания константы.
no subject
Date: 2025-03-19 10:22 pm (UTC)no subject
Date: 2025-03-19 11:00 pm (UTC)И не сильно более того.
no subject
Date: 2025-03-19 11:20 pm (UTC)no subject
Date: 2025-03-19 11:36 pm (UTC)no subject
Date: 2025-03-24 08:19 am (UTC)С компилятором понятно какие там "вызовы" и как его можно сделать. Вот с препроцессором как-то не очень понятно, по спецификации можно сказать как оно должно быть, а вот по реализации не совсем ясно.
no subject
Date: 2025-03-24 10:04 am (UTC)https://github.com/RetroBSD/retrobsd/tree/master/src/cmd/cpp
no subject
Date: 2025-03-24 10:20 am (UTC)no subject
Date: 2025-03-25 07:52 pm (UTC)P.S. Еще про раннее упоминание препроцессора Си. Немного написано в C reference manual(Dennis Ritchie,1975) в главе 12, и в Programming in C − A Tutorial(Brian W. Kernighan). Но там, кажись, изначально было только #define и #include.
no subject
Date: 2025-03-26 06:39 am (UTC)no subject
Date: 2025-03-26 07:48 am (UTC)Цитата Mark Espie: "...(3) Весь дизайн GCC извращён настолько, что никто не может даже выделить front-end и back-end компилятора (от меня: истинная правда, помниться, как мы занимались с gcc любовью в попытках научить понимать его нерегистровые архитектуры). Он корявый, начиная с дизайна (broken by design), так как GPL'ный народ боится, что коммерческие организации смогут украсть backend или frontend и прицепить их к закрытым языкам или кодогенераторам (от меня: странный вывод, однако). Возможно, это правда. Но это не позволяет создавать интересные инструменты, такие как анализаторы промежуточного кода. И это так же не позволяет использовать backend'ы для старых архитектур c новыми компиляторами."
Начать с GCC, это путь не для человека, а для хорошо организованных групп программистов.
Путь же для человека - это проторенный путь от мэтров(Ритчи, Томпсон). Их подход, неявный, это то, что один человек может вполне освоить за разумное время все то, что они насоздавали. Это мнение.
Например, на освоение и переписывание Early C(last1120, c0) под MSDOS 16 bit вполне можно обойтись 3 месяцами. На генератор кода для выражений (с1) пока незнаю. Но посмотрим. СС(last1120) изучается за пару дней. Но все еще зависит от здоровья, психологического состояния, интеллекта, конечно.
no subject
Date: 2025-03-26 08:07 am (UTC)