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/ |