OberonCore
https://forum.oberoncore.ru/

Пасхальное яичко в компиляторе
https://forum.oberoncore.ru/viewtopic.php?f=23&t=6650
Страница 1 из 1

Автор:  adimetrius [ Пятница, 04 Сентябрь, 2020 15:56 ]
Заголовок сообщения:  Пасхальное яичко в компиляторе

Коллеги, я обнаружил вот такое недокументированное "пасхальное яйцо" в компиляторе ББ:
После
x := SYSTEM.VAL(INTEGER, "A")
имеем x = 65 = ORD("A"), после
x := SYSTEM.VAL(INTEGER, "12")
имеем x = 12594 = ORD("1")*256 + ORD("2")

Чтобы это работало, нужно обязательно SYSTEM.VAL(INTEGER, const), где const - строковая константа не длиннее 4 литер.

Я не нашел ни одного места, где это бы использовалось в исходниках самого ББ (правда не претендую на 100%точность поиска).

Как полагаете, нужна ли эта возможность, стоит ли ее переносить в Гершель, или похоронить в СР2?

Автор:  Иван Денисов [ Пятница, 04 Сентябрь, 2020 16:44 ]
Заголовок сообщения:  Re: Пасхальное яичко в компиляторе

Наверное, это какой-то побочный эффект особенностей реализации? Если да, то не надо это специально переносить. А если также побочно перенесётся, то и пусть.

Автор:  Илья Ермаков [ Пятница, 04 Сентябрь, 2020 18:39 ]
Заголовок сообщения:  Re: Пасхальное яичко в компиляторе

Так это логичная особенность поведения. VAL - трактовать последовательность байт как другой тип.

Автор:  adimetrius [ Пятница, 04 Сентябрь, 2020 18:56 ]
Заголовок сообщения:  Re: Пасхальное яичко в компиляторе

Ну как побочный... там целая специальная ветка для этого яичка, хоть и не сложная:
Код:
ELSIF (x.class = Nconst) & (f = String8) & (p.typ.form = Int32) & (x.conval.intval2 <= 5) THEN
   i := 0; n := 0;
   WHILE i < x.conval.intval2 - 1 DO n := 256 * n + ORD(x.conval.ext[i]); INC(i) END;
   x := NewIntConst(n)
ELSIF


Полезность не могу понять этой фичи. Тем более что сформировать осмысленную строку-константу с значениями байтов меньше пробела - невозможно жеж в синтаксисе...

Илья Ермаков писал(а):
VAL - трактовать последовательность байт как другой тип.

Как раз про последовательность байт там не указано, хотя именно так и сделано в большинстве случаев; но как видно во фрагменте, в случае со строкой-константой реализовано по-другому, и результат эквивалентен "последовательности байт" big-endian: первый байт становится старшим. Т.е. тут некая "человеческая запись" интерпретируется: в строке сначала идут самые весомые циферки.

И, кстати, передать строку длиннее 4 литер, или с не-аски литерами - ошибка компиляции. Как ни крути, выделяют этот особый случай; другие строковые литералы VAL не принимает (кроме случаев java, но в этом я не разобрался).

Автор:  Иван Денисов [ Суббота, 05 Сентябрь, 2020 03:23 ]
Заголовок сообщения:  Re: Пасхальное яичко в компиляторе

Спасибо, теперь понятнее, что это сознательная недокументированная реализация.

Из опыта работы с микроконтроллерами могу сделать предположение, что короткие строки упаковывать в INTEGER может быть нужно для управления каким-то оборудованием. Может быть какой-то драйвер принимает такие команды, и надо было сделать удобный энкодер. Но так то это рудимент, который, на мой взгляд, не надо реализовывать, раз он не документирован.

Автор:  Oleg N. Cher [ Суббота, 05 Сентябрь, 2020 23:26 ]
Заголовок сообщения:  Re: Пасхальное яичко в компиляторе

adimetrius писал(а):
Тем более что сформировать осмысленную строку-константу с значениями байтов меньше пробела - невозможно жеж в синтаксисе...
Ну почему жеж невозможно? А если так:
Код:
CONST MyStr = 1X + 2X + 3X;

adimetrius писал(а):
Как полагаете, нужна ли эта возможность, стоит ли ее переносить в Гершель, или похоронить в СР2?
Нужна, стоит.

Кстати, а как насчёт SYSTEM.VAL(LONGINT, str), где str - строка из не более восьми символов? Тоже работает?

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/