AntKrotov / oberon-07-compiler

Oberon-07 compiler for x64 (Windows, Linux), x86 (Windows, Linux, KolibriOS), MSP430x{1,2}xx, STM32 Cortex-M3
BSD 2-Clause "Simplified" License
61 stars 5 forks source link

Алиасы типов #8

Closed prospero78 closed 5 years ago

prospero78 commented 5 years ago

При попытке создать алиас INTEGER и использовать его в присвоении -- присвоение происходит без приведения алиаса к INTEGER.

AntKrotov commented 5 years ago

Без примера кода не очень понятно. Алиас -- это точно тот же тип, только с другим названием. И это тоже следует из описания. Приведение не нужно.

prospero78 commented 5 years ago

Сомневаюсь, что поведение правильное. Алиас для килограммов/штук для того и вводится, чтобы нельзя было их свободно складывать. Если алиасы это разрешают -- зачем тогда их вообще вводить? Чтобы ослабить надёжность? Не похоже такое на Вирта.

AntKrotov commented 5 years ago

Oberon-07/16:

8.2.2. Arithmetic operators ... The operators +, −, *, and / apply to operands of numeric types. Both operands must be of the same type, which is also the type of the result. When used as unary operators, − denotes sign inversion and + denotes the identity operation.

9.1. Assignments ... The type of the expression must be the same as that of the designator. ...

Однако, что такое "Same types" в репорте не написано.

Определение есть в репорте Oberon-2:

Same types Two variables a and b with types Ta and Tb are of the same type if

Ta and Tb are both denoted by the same type identifier, or Ta is declared to equal Tb in a type declaration of the form Ta = Tb, or a and b appear in the same identifier list in a variable, record field, or formal parameter declaration and are not open arrays.

Oberon-2 -- это, конечно, другой язык, но Вирт является соавтором этого языка. Точно так же ведет себя и КП, и другие известные мне реализации Оберона-07. Я считаю, что алиасы введены только для сокращения записи, как в Обероне-2/КП. Нет оснований считать, что Оберон-07 надежнее других диалектов Оберона.

prospero78 commented 5 years ago

Оберон-07 надёжней. Хотя бы потому, что он меньше, и типов в нём меньше, и вообще он меньше)) https://docs.google.com/document/d/1qcldcIVZ0SfBPa7IS3D_Ty35mki1YeCcB2N2CXrv9Fo/edit?usp=sharing -- специально смотрел в репорт Оберон-07 -- там нет определения, что ты привёл, так что, по дефолту можно предположить, что приведённое тобой описание верно, но предполагаю, что нет.

AntKrotov commented 5 years ago

Ну, если покопаться в репорте, то можно найти немало мест, допускающих разное толкование. Если язык описать как можно полнее, то получится не 17, а 117, а может 517 страниц. Для разработчика реализации здесь возможны такие варианты:

1) спросить у Вирта 2) посмотреть реализацию от Вирта 3) посмотреть другие реализации (в том числе и других диалектов) 4) придумать свое

Для меня, наиболее доступный и удобный пункт 3. Иногда делаю по-своему (пункт 4), в тех случаях, когда я не согласен с другими реализациями. Например, проверка/охрана типа нулевого указателя:

num := list.first(Int);
WHILE num # NIL DO
    Out.Int(num.x, 0); Out.Ln;
    num := num.next(Int)
END

Здесь, в последней итерации цикла (num.next = NIL), будет трап в ББ и во многих реализациях Оберона. В моей реализации будет просто завершение цикла по условию. Такая особенность существует давно, она прошла проверку на практике и не снижает безопасность.

prospero78 commented 5 years ago

Репорт не описывает как нужно делать Оберон для конкретной машины. Это некий общий профиль, мета-модель. А детали реализации остаются на совести реализатора конкретного варианта Оберона.