Эка невидаль!
Feb. 3rd, 2023 10:07 amТак как запускать программы из Паскаля-Автокода неудобно, я решил попробовать перенести программу печати в две колонки в Паскаль-Монитор. Одна известная разница - отсутствие в П-М конструкции "var _IN type" (например, "ch _IN letters", где тип letters определён как 'A'..'Z'), но это легко решается введением функций.
А дальше случилось забавное: я впервые увидел ошибку компилятора. Тестовый пример выглядит так:
В перенесенном на С++ компиляторе падает с тем же успехом.
Если вместо диапазона просто перечисление [ord(' '), ord('/')] - работает. Надо разбираться :)
А дальше случилось забавное: я впервые увидел ошибку компилятора. Тестовый пример выглядит так:
PASCAL COMPILER 15.0 (15.02.82)
00001 1 0 PROGRAM MAIN(OUTPUT);
00001 2 1 VAR S: SET OF 0..47;
00007 3 2 BEGIN
******200 SYSTEM=200
00010 4 2 S := [ORD(’ ’)..ORD(’/’)];
***** 0
00023 5 0 END.
В перенесенном на С++ компиляторе падает с тем же успехом.
Pascal-Monitor in C++ (17.05.2019)
00001 1 0 program main(output);
00001 2 1 var s: set of 0..47;
00007 3 2 begin
Error 200: Internal error 200
00010 4 2 s := [ord(' ')..ord('/')];
^^^^^ 0
00023 5 0 end.
Если вместо диапазона просто перечисление [ord(' '), ord('/')] - работает. Надо разбираться :)
no subject
Date: 2023-02-03 07:41 pm (UTC)no subject
Date: 2023-02-03 07:55 pm (UTC)no subject
Date: 2023-02-03 07:54 pm (UTC)Однако встроенные функции с константными операндами в литералы немедленно не превращаются, и выражение [ord(' ')..ord('/')] доезжает до оптимизатора константных выражений, где и приводит к фиаско.
В Паскале-Автокоде же отдельного оптимизатора константных выражений нет, а благодаря представлению целых без порядка, оператор ord там тривиальная операция, так что у оператора построения диапазона проблем не возникает.
no subject
Date: 2023-02-03 08:01 pm (UTC)no subject
Date: 2023-02-04 12:25 am (UTC)По-хорошему нужно использовать fuzzer для нахождения dead code (там, похоже, есть сколько-то), выбросить его, и освободится некоторое количество места, чтобы гарантированно поместились оба способа.