OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 14:22

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Пасхальное яичко в компиляторе
СообщениеДобавлено: Пятница, 04 Сентябрь, 2020 15:56 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Коллеги, я обнаружил вот такое недокументированное "пасхальное яйцо" в компиляторе ББ:
После
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?


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Наверное, это какой-то побочный эффект особенностей реализации? Если да, то не надо это специально переносить. А если также побочно перенесётся, то и пусть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Пасхальное яичко в компиляторе
СообщениеДобавлено: Пятница, 04 Сентябрь, 2020 18:39 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Так это логичная особенность поведения. VAL - трактовать последовательность байт как другой тип.


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Ну как побочный... там целая специальная ветка для этого яичка, хоть и не сложная:
Код:
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, но в этом я не разобрался).


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Спасибо, теперь понятнее, что это сознательная недокументированная реализация.

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


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 518
Откуда: Украина, Днепропетровская обл.
adimetrius писал(а):
Тем более что сформировать осмысленную строку-константу с значениями байтов меньше пробела - невозможно жеж в синтаксисе...
Ну почему жеж невозможно? А если так:
Код:
CONST MyStr = 1X + 2X + 3X;

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB