OberonCore https://forum.oberoncore.ru/ |
|
Отрицательные целочисленные литералы в Обероне https://forum.oberoncore.ru/viewtopic.php?f=115&t=6604 |
Страница 1 из 1 |
Автор: | kekc_leader [ Суббота, 25 Апрель, 2020 17:57 ] | ||
Заголовок сообщения: | Отрицательные целочисленные литералы в Обероне | ||
При разработке компилятора встал вопрос, можно ли написать такое: Код: PROCEDURE DWord(n: INTEGER); ... DWord(90909090H) при том, что INTEGER имеет разрядность 32 бита. Некоторые компиляторы выдают ошибку, тогда как в компиляторе Project Oberon (2013) всё работает. Это удобно, т. к. назначение DWord — записать в файл 4 байта, указанные в виде числа INTEGER (порядок байтов от младшего к старшему). Реализована, она, кстати, так (модуль Generator): Код: PROCEDURE DWord(n: INTEGER); BEGIN Files.Write(r, CHR(n MOD 100H)); Files.Write(r, CHR(n DIV 100H MOD 100H)); Files.Write(r, CHR(n DIV 10000H MOD 100H)); Files.Write(r, CHR(n DIV 1000000H)) END DWord; В сообщении о языке Оберон не указано, что литерал 90909090H следует рассматривать как ошибочную запись числа при 32-битовом INTEGER. В опыте использован онлайн-эмулятор RISC.
|
Автор: | Oleg N. Cher [ Воскресенье, 26 Апрель, 2020 01:01 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Артур, в Project Oberon и в Обероне-07 только один целочисленный тип для операций — это INTEGER. BYTE просто промежуточная форма для хранения значений. Поэтому ограничивать специально ёмкость беззнаковых шестнадцатеричных литералов и не стали, неявно приводя их к знаковым. Здесь плохо то, что знак получается скрытым. Если есть другие целые типы (LONGINT, например), то всё несколько усложняется. Я бы вынес знак из маски шестнадцатеричного числа и писал бы DWord(90909090H - 100000000H). Это будет хорошо работать в рамках модели с несколькими целочисленными типами. С интересом выслушаю, почему знак в шестнадцатеричных литералах должен быть задан разрядом. Но тебе здесь не подскажут никакого разумного ответа, зачем это надо оставить. Разве что взять заклеить себе жвачкой глаза и сделать вид, что 64-битных чисел не существует. Или сделать вид, что при существовании 64-битных чисел не существует 32-битных. Короче, молиться богу Оберона-07. P.S. Ответ "потому, что иначе самое большое шестнадцатеричное число 0FFFFFFFFFFFFFFFFH и не задашь литералом без знака" не прокатывает. Это проблема, но разумного решения у неё нет. Только в виде полумер: всё равно разрешить. А просто потому что потому. И ещё: почему задавать знак разрядом в десятичных литералах нельзя: Код: CONST a = 4294967295; (* где подразумеваем, что это 32-битная константа со знаком *) , что правильно, а в шестнадцатеричных должно быть можно? Где здесь логика?Проблема несколько смягчается, если при задании константы можно задавать и её тип. Но это усложнение и тоже полумера. Раз мы отказались от беззнаковых типов вместе с переходом на Обероны, то остаётся только этому радоваться. Упрощение жеж |
Автор: | Иван Денисов [ Воскресенье, 26 Апрель, 2020 06:33 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Шестнадцатеричная запись - это для каких-то адресов надо, например, для системных вещей. Так что это скорее внутренняя тема на уровне SYSTEM, где шаг влево вправо чреват столкновением с особенностями реализации компилятора. И надо вдумчиво понимать эти особенности. В нормальных прикладных алгоритмах не стоит использовать шестнадцатеричные, по моему скромному мнению... |
Автор: | Oleg N. Cher [ Воскресенье, 26 Апрель, 2020 07:32 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Если у нас не один целочисленный тип, то всё равно нужно как-то обозначать разрядность шестнадцатеричного числа, будь оно со знаком или без. Если не вводить для этого специальные меры типа постфикса L, а оставить всё в кристальной простоте, то приравнивать -1H к 0FFFFFFFFH всё равно нельзя. Если мы ни о чём, т.е. у нас в сферическом вакууме присутствует только один целый тип, тогда проблем вообще нет, можно лепить так, как в Project Oberon. Уверен, если бы у Артура не было сомнений, то он и тему открывать бы не стал. Так что предлагаю рассмотреть именно случай с несколькими целыми типами. Применимость же шестнадцатеричных чисел не всегда связана с системщиной. |
Автор: | Oleg N. Cher [ Воскресенье, 26 Апрель, 2020 12:08 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Dave Brown писал(а): Как в VOC, так и в Oberon 2013 целочисленные литералы анализируются в анализаторе символов (VOC: OPS.Mod или 2013: ORS.MOD) и хранятся в таблице символов в виде целочисленных значений со знаком.
Позже, во время компиляции выражений, их размер определяется величиной их целочисленного значения со знаком. Разница между Oberon 2013 и VOC - это самый большой целочисленный тип, который составляет 32 бита в Oberon 2013 и 64 бита в VOC. Специальная обработка, которая позволяет шестнадцатеричному литералу с верхним разрядным набором рассматриваться как знаковое значение, происходит в то время, когда литерал анализируется как символ, независимо от того, в каком контексте он используется. (Рассмотрим, например, 'CONST mask = 90909090H' - анализ CONST не знает, будет ли эта константа использоваться в 64-битном, 32-битном, 16-битном или другом контексте.) VOC и Oberon 2013 допускают поведение синтаксического анализа верхнего набора битов шестнадцатеричного специального случая, разница заключается в размере целочисленного литерала. Таким образом, VOC принимает myint64 := 909090909090909090H, поскольку 909090909090909090H анализируется как отрицательное 64-битное целое число со знаком. Но VOC не принимает myint32 := 90909090H, потому что 9090909090H анализируется как положительное 64-битное целое число со знаком. VOC не имеет возможности распознать 90909090H как отрицательное 32-разрядное целое число со знаком. - Я действительно хотел добавить еще одну букву суффикса, чтобы указать предполагаемый размер, но я не мог убедиться, что любое решение было достаточно простым, чтобы его было легко понять. - Обратите внимание, что это не зависит от настройки совместимости VOC -Ox: это устанавливает целочисленный размер по умолчанию, а не целочисленный размер литерала - целочисленные литералы всегда поддерживают самый большой доступный целочисленный размер, который является SYSTEM.INT64, он же HUGEINT.) -- Дейв |
Автор: | Oleg N. Cher [ Среда, 29 Апрель, 2020 06:44 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Подрезюмируя сказанное. В итоге всё сводится к вопросу: литерал 0FFFFFFFFH считать 64-битным без знака или 32-битным со знаком? У нас три решения:
Код: DWord(90909090H - 100000000H); , то Ofront+ предлагает ещё такой вариант:Код: DWord(SYSTEM.VAL(INTEGER, 90909090H)); , вполне в духе Оберон-парадигмы. И системность не должна смущать — у нас же шестнадцатеричные литералы юзаются для системщины. Так что, Артур, я предлагаю в твоём компиляторе поступить именно так.
Что я упустил? |
Автор: | Sergej Durmanov [ Среда, 29 Апрель, 2020 11:02 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Oleg N. Cher писал(а): Что я упустил? 4) Сделать типизированные константы |
Автор: | Oleg N. Cher [ Среда, 29 Апрель, 2020 20:03 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Sergej Durmanov писал(а): 4) Сделать типизированные константы Ну, на самом деле в Ofront'е+ можно описать системное приведение при определении константы:Код: CONST dword = SYSTEM.VAL(INTEGER, 90909090H); Я специально для подобных случаев реализовал. В CPfront, BlackBox, voc и Ofront такой фичи нет. Если Вы предлагаете INTEGER(90909090H) как в AO, то это уже было в Turbo Pascal. Тогда надо разрешить такое же (заметьте, несистемное) приведение и в выражениях — и понеслось. |
Автор: | hothing [ Пятница, 01 Май, 2020 09:53 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Иван Денисов писал(а): Шестнадцатеричная запись - это для каких-то адресов надо, например, для системных вещей. Так что это скорее внутренняя тема на уровне SYSTEM, где шаг влево вправо чреват столкновением с особенностями реализации компилятора. И надо вдумчиво понимать эти особенности. В нормальных прикладных алгоритмах не стоит использовать шестнадцатеричные, по моему скромному мнению... В таком случае было бы логично сделать разбор 16-тиричных числел подключаемым при импорте модуля SYSTEM. Кроме того, как быть при реализации прикладных алгоритмов где требуется манипулирование битами, а типа SET недостаточно (более 32 бит)? |
Автор: | Sergej Durmanov [ Пятница, 01 Май, 2020 19:35 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Oleg N. Cher писал(а): и понеслось. Что куда понеслось? Речь-то идёт о константных выражениях в виде литералов и т.д. Нет никакой надобности распространять это на всё и вся. |
Автор: | Oleg N. Cher [ Вторник, 05 Май, 2020 16:33 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Sergej Durmanov писал(а): Речь-то идёт о константных выражениях в виде литералов и т.д. Нет никакой надобности распространять это на всё и вся. Из единообразности: если предлагается для констант CONST a=INTEGER(123);Тогда почему не разрешить это и в выражениях? Кстати, вот так будет даже более в духе Оберона-2/КП: Код: CONST a = 123(INTEGER); P.S. Желание защитить решения, принятые в A2, понимаю, но в других Оберонах этого нет и, надеюсь, не будет. |
Автор: | hothing [ Вторник, 05 Май, 2020 21:25 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Oleg N. Cher писал(а): Из единообразности: если предлагается для констант CONST a=INTEGER(123); Тогда почему не разрешить это и в выражениях? Олег, а Оберон-дзен вроде и направляет в сторону использования сущностей явно. Если мы используем константу в обычном выражении, то мы можем однозначно задать ее тип. И вроде парсер константных выражений тот же что и обычных. А синтаксис - дело вторичное. [Offtop] Я за типизированные константы, но. Если мы позволяем быть константам элементарных типов, тогда, чтобы сохранить целостность, должны быть определяемы и структурные константы: массивы и записи. А вот с последними и совсем не ясно как и что. (Возможно я глубоко ошибаюсь) |
Автор: | Oleg N. Cher [ Среда, 06 Май, 2020 11:50 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Так правильно. Оберон и использует сущность "целое число" явно, что понятно по контексту. Это "короткое", "более короткое", "длинное" и "более длинное" целые числа уже некрасиво выпирают из абстракции, являя собой дань решению "грязных проблем системного программирования", программирования микроконтроллеров, экономии памяти и прочих подобных задач. Как мы видим, Оберон-07 для целых чисел имеет только типы BYTE (который ввёл Вирт как компромисс, до этого для представления байтов усиленно использовался CHAR) и INTEGER. В Обероне-07 проблема типизированных целых констант вообще не актуальна. Остальных коротких и длинных грязных целочисленных типов нет. И SHORT/LONG не требуются. Мне этот подход, как вы наверное поняли, не по душе. Поэтому я и считаю Оберон-07 узкоспециализированным языком. В Ofront'е+ реализованы константные массивы (в режиме -3). Насчёт записей мы тоже думали, но посомневались. Я уверен, что Вирт посчитал эту функциональность не настолько важной и положил её на алтарь простоты Оккама. |
Автор: | adimetrius [ Среда, 06 Май, 2020 12:19 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Oleg N. Cher писал(а): В Ofront'е+ реализованы константные массивы (в режиме -3). Интересно. Вот есть приложение Babel, он генерирует конечный автомат по грамматике и потом этот конечный автомат записывает в виде массива целых. Грамматика КП затягивает, если мне не изменяет память, на несколько сот килобайт. Поскольку массив-констант нет, это записывается в модуле в виде a[i] := 5971630; Компилятор Dev справляется на раз, но в памяти, получается, дважды эта информация записана, т.е. чтобы модуль загрузить, нужно вдвое больше памяти. А справится ваш компилятор с полумегабайтным массивом-константой? |
Автор: | hothing [ Среда, 06 Май, 2020 15:26 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
Oleg N. Cher писал(а): Так правильно. Оберон и использует сущность "целое число" явно, что понятно по контексту. Это "короткое", "более короткое", "длинное" и "более длинное" целые числа уже некрасиво выпирают из абстракции, являя собой дань решению "грязных проблем системного программирования", программирования микроконтроллеров, экономии памяти и прочих подобных задач. Я бы понял такой подход в языках инженерной обработки (Matlab, R, Алмир, ...). Oleg N. Cher писал(а): Поэтому я и считаю Оберон-07 узкоспециализированным языком. Да, мне кажется также, что Вирт уже создает язык(и) под задачу.
|
Автор: | Oleg N. Cher [ Среда, 06 Май, 2020 16:28 ] |
Заголовок сообщения: | Re: Отрицательные целочисленные литералы в Обероне |
adimetrius писал(а): А справится ваш компилятор с полумегабайтным массивом-константой? Должен справиться. Просто съест под данные массива большой кусок памяти при компиляции. Потом в конце освободит.
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |