vak: (Default)
[personal profile] vak posting in [community profile] besm6
Сегодня мы со [personal profile] spamsink совершили рывок и совместными усилиями довели паскалевский тест до состояния компилируемости без ошибок. Список обнаруженных проблем:

1. Не поддерживается тип "set of char", и даже "set of 'a'..'z'".

2. Не работает тип "set of 1..100". Максимальный размер для множества целых чисел - "set of 0..47".

3. Не поддерживается массив файлов, то есть тип 'array of text'.

4. Примитивы succ() и pred() не работают с целыми аргументами.

5. Экспонента плавающих чисел ограничена диапазоном -18..18.

6. Процедура dispose() не принимает выражение в качестве аргумента, только переменную.

7. Примитивы pack() и unpack() не работают с массивами с отличающимися типами индексов, например "array [integer] of ..." и "array [char] of ...".

8. Тест целиком не помещается в таблицы компилятора, пришлось разбить его на три части.

Date: 2019-05-10 06:47 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Формальные параметры-процедуры декларируются иначе, чем в стандартном языке.

Я посмотрел, какой код порождается для динамической проверки типов при передаче фактических параметров-процедур. На первый взгляд, это довольно труднопонимаемо; я рад, что сам компилятор это не использует, иначе декомпиляция сильно осложнилась бы.

Date: 2019-05-10 11:01 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Ограничение на количество деклараций следует из формата объектного модуля. Размер кода функции и количество литералов по идее должно быть можно увеличить.

Date: 2019-05-11 12:03 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Попробовал. :) Размер функции увеличивается тривиально; а вот индекс таблицы символов должен помещаться в 15 бит, поэтому максимально возможный диапазон - это 74000-77777 (было 74000-75500).
500 литералов - это не общее количество, а размер группы, в которой совпадающие объединяются. Как только набирается 500, они выталкиваются в файл и начинается формирование новой группы; из-за этого между группами могут быть повторения. Когда я увеличил размер группы (MAXLIT), то рекомпиляция компилятора перестала совпадать, так что пока для удобства оставил как есть.

Date: 2019-05-10 07:34 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
OMFG! В стандарте они порезвились на славу. Нижеследующее якобы должно работать:
   write('Control13: start ');
   i := 10;
   for i := 1 to i do write(i:3);
   writeln(' s/b start  1  2  3  4  5  6  7  8  9 10');

На БЭСМ-6 оно, довольно предсказуемо, уходит в бесконечный цикл.

Date: 2019-05-10 08:28 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Еще из замеченных ошибок:

FОR I := 15 DОWNТО 1 DО WRIТЕLN(’НЕLLО, WОRLD’: I);

не обрезает строки, когда ширина по формату меньше длины строки (аналогично с печатью TRUE/FALSE).

Печать вещественных чисел существенно отличается от стандарта.

А в остальном, более или менее, всё в порядке.

Date: 2019-05-10 10:58 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Я нативным компилятором компилировал для простоты (с минимальными правками исходников), раз они пока еще один и тот же код порождают. :)

Profile

Сообщество любителей БЭСМ-6

December 2025

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930 31   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 16th, 2026 03:14 pm
Powered by Dreamwidth Studios