OberonCore https://forum.oberoncore.ru/ |
|
Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x86 https://forum.oberoncore.ru/viewtopic.php?f=30&t=6344 |
Страница 13 из 17 |
Автор: | Илья Ермаков [ Пятница, 20 Август, 2021 11:43 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Ну и в отношении ^ (разыменование указателя) уже есть пример от Вирта такой же необязательности. |
Автор: | budden [ Пятница, 20 Август, 2021 12:42 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Нет уж, не дикси. Подали мячик - принимайте теперь ответ. Я не понял, что Вы хотели сказать этими шпаргалками. Шпаргалки - для тех, кто уже знаком с темой. А для новичков это просто китайская грамота. Я единственное, что понял (если правильно) - это что точка смотрится чище, чем ; , поэтому и ставить её разделителем не так больно. Если так, то это здорово, но в тех языках, к которым относится оберон, точка отделяет член от организма, к которому этот член относится (гусары, молчать!). Но что такое Код: { -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) } ? Предлагаю переместиться с этим обсуждением в тему про точки с запятой, потому что здесь тема про Ofront+, а необязательные точки с запятой, как выяснилось, сначала придумали в AO/A2, потом некий многомудрый швейцарец (забыл его имя) перенёс его в свой "oberon+", и только потом Олег это позаимствовал. Во всяком случае, мне так показалось по сумме того, что было сказано и найдено. Можно даже и правило в Го пытаться вывести из АО, но это больше похоже на натяжку пока что, тем более, что в Го правило другое. |
Автор: | GameHunter [ Пятница, 20 Август, 2021 17:58 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Следующая ошибка. Эта программа, по идее, должна выводить на экран число 2, но не выводит ничего - какой-то тихий крэш? Если закомментировать вызов процедуры IncProc, то, как и одидается, на экран выводится число 0. Код: MODULE Ex;
IMPORT Console; TYPE IncRec = EXTENSIBLE RECORD END; IncRec1 = RECORD ( IncRec ) END; VAR i:INTEGER; r:IncRec1; PROCEDURE ( VAR r: IncRec ) Inc ( VAR i: INTEGER ), NEW, EXTENSIBLE; BEGIN i := i + 1 END Inc; PROCEDURE IncProc ( VAR r_param: IncRec; VAR i: INTEGER ); VAR r: IncRec; BEGIN r := r_param; r.Inc ( i ); r_param := r END IncProc; PROCEDURE ( VAR r: IncRec1 ) Inc ( VAR i: INTEGER ), EXTENSIBLE; BEGIN i := i + 2 END Inc; BEGIN i := 0; IncProc ( r, i ); Console.LongInt(i,0); Console.Flush; END Ex. |
Автор: | GameHunter [ Суббота, 21 Август, 2021 00:04 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Пардон, ошибся, по идее, программа должна выводить на экран число 1 (но не выводит). |
Автор: | GameHunter [ Суббота, 21 Август, 2021 21:54 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Ещё одна ошибка. Этот модуль успешно компилируется в BlackBox, а при компиляции oFront+'ом происходит ошибка со следующим сообщением: OfrontOPV 610:50 Terminated by Halt(-4). CASE statement: no matching label and no ELSE. Код: MODULE Ex;
TYPE Rec0 = EXTENSIBLE RECORD END; Rec1 = RECORD (Rec0) i:INTEGER; END; PROCEDURE as_Rec1 (VAR r:Rec0): POINTER TO Rec1; BEGIN RETURN NIL END as_Rec1; PROCEDURE Process (VAR r:Rec0); BEGIN as_Rec1(r)^.i:=0; END Process; END Ex. |
Автор: | Oleg N. Cher [ Воскресенье, 22 Август, 2021 07:34 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Подтверждаю: оба примера вызывают проблемы. Первый пример вообще интересный. Вы пробовали компилировать его BlackBox'ом? Находит две ошибки, почему? Попробовал в самой свежей сборке Центра. А вот Ofront+ такое компилит, но сишный код несколько подозрительный. Разбираюсь дальше. |
Автор: | Oleg N. Cher [ Понедельник, 23 Август, 2021 08:56 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
GameHunter, вуаля: убираем EXTENSIBLE и - о чудо - пример начинает компилиться. Знаете почему? Потому что две расширяемых записи, находящиеся в родстве, в КП не могут считаться совместимыми. Вдруг одна из них расширена. Тогда присваивание не имеет смысла. Я помню этот момент, когда ещё добавлял в Ofront+ атрибуты записей и процедур. Но я сделал как в Обероне-2: тут могут, тут все записи расширяемые. А в КП не могут. Так что это не ошибка. Т.е. в Ofront'е+ сейчас совместимость расширяемых записей проверяется в рантайме. И если присваивание имеет смысл, то оно происходит, а если не имеет - тогда будет трап. Ну как и в Обероне-2. И для КП я сделал так же. Возможно, здесь стоило бы сделать как в BlackBox'е. Комментарии приветствуются. |
Автор: | GameHunter [ Среда, 25 Август, 2021 00:15 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
В сообщении о компонентном паскале написано, что расширяемые записи не совместимы для присваивания. По этому надо просто на этапе компиляции выводить сообщение об ошибке, как это сделано в BB. |
Автор: | GameHunter [ Среда, 25 Август, 2021 00:23 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Следующая ошибка. Этм два модуля успешно транслируются в си, но результат при компилировании выдаёт ошибки. Код: MODULE Ex1; TYPE Rec0 * = EXTENSIBLE RECORD y * : RECORD END; END; END Ex1. Код: MODULE Ex;
IMPORT Ex1; TYPE Rec1 * = RECORD ( Ex1.Rec0 ) END; Rec2 * = RECORD ( Ex1.Rec0 ) END; END Ex. |
Автор: | Oleg N. Cher [ Среда, 25 Август, 2021 13:22 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
GameHunter, ого, Вы меня практически завалили. Буду разгребаться помаленьку. GameHunter писал(а): В сообщении о компонентном паскале написано, что расширяемые записи не совместимы для присваивания. По этому надо просто на этапе компиляции выводить сообщение об ошибке, как это сделано в BB. Дело в том, что в Обероне и Обероне-2 (а заодно и в O7) все записи по умолчанию расширяемые. И они при этом совместимы для присваивания. Поэтому используются рантайм-проверки.Кстати, в КП не решена проблема копирования расширяемых записей этим способом. Вы бы как предпочли копировать? Только поэлементно? Тут ведь приведение типа с охраной не сработает. Или же надо вводить в транслятор новую сущность "особо злая и страшная расширяемая запись КП, которую ни-ни". Но надо ещё придумать как её потом стыковать с записями на других диалектах. Вот честно, не хочется заморачиваться. P.S. GameHunter, что-то Вы, видимо, мутите хитрое - судя по коду. |
Автор: | GameHunter [ Среда, 25 Август, 2021 17:28 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Я не упомянул, что использую при компилировании опцию -C, т.е. компонентный паскаль. А раз в сообщении о нём написано, что расширяемые записи нельзя друг другу присваисать, значит, так и должно быть. |
Автор: | Oleg N. Cher [ Четверг, 26 Август, 2021 11:54 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
По этой ошибке выяснилось: GameHunter писал(а): Эта программа, по идее, должна выводить на экран число 2, но не выводит ничего - какой-то тихий крэш? Программа аварийно завершается по защите типа:Т.е. то, что BlackBox находит явно в процессе проверки синтаксиса, Ofront+ делает в рантайме. Мне пришло в голову, что мы всё-таки можем сделать "как в BlackBox". Для чего я просто буду проверять текущий диалект, и если это КП, то генерить ошибку. Правильно ли я понимаю, что для исправления этой проблемы достаточно сделать проверку на присваивание расширяемых записей в момент компиляции? GameHunter, маленький хинт: если импортировать Kernel, то будет консольный вывод ошибок. А если нет, тогда только код возврата в ОС. |
Автор: | Oleg N. Cher [ Четверг, 26 Август, 2021 12:49 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Проверил в онлайн-Обероне-07, такое присваивание тоже компилится: Получается, что в диалектах, где все записи расширяемые без акцента на этом (потому что они могут быть и не расширены), такое присваивание проверяется в рантайме. А в КП специально ввели тег EXTENSIВLE, чтобы ограничить использование записей, в т.ч. и по присваиванию. Я предлагаю вот такую правку, реализующую поведение в режиме -C согласно описания языка, для остальных же режимов будет проверка в рантайме. Если этого недостаточно, дайте знать. Побочным эффектом будет то, что при смешанной разработке на разных диалектах записи остальных диалектов будут считаться расширяемыми, со всеми вытекающими. Т.е. их можно будет присваивать в режиме -2 с проверкой в рантайме, а в режиме -C будет ошибка времени компиляции. |
Автор: | Oleg N. Cher [ Четверг, 26 Август, 2021 13:40 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
По второй проблеме (слева Online Oberon-07, справа Ofront 1.4 for BlackBox): Как видим, данный случай мог бы быть обработан в этих трансляторах, но он всё равно не реализован. |
Автор: | Oleg N. Cher [ Четверг, 26 Август, 2021 16:17 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Влад Фольц утверждает, что описание языка Oberon-07/16 прямо запрещает такое использование вызова: Vlad Folts писал(а): Это грамматика такая. Точнее там неоднозначность с охраной типа, поэтому оно проверяется не на уровне синтаксиса, а уже при проверке семантики. Т.е. репорт явно запрещает такую конструкцию. Тогда вопрос: разрешить только для КП, запретив для остальных диалектов? |
Автор: | Oleg N. Cher [ Четверг, 26 Август, 2021 16:49 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
По третьей проблеме советуюсь с Йозефом Темплом. |
Автор: | GameHunter [ Четверг, 26 Август, 2021 18:30 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Как мне кажется, раз вы реализуете (среди прочего) компонентный паскаль, по спорным вопросам надо просто обращаться к сообщению о нём. Соответственно, - да, проверка на присваивание в рантайме. |
Автор: | GameHunter [ Четверг, 26 Август, 2021 18:31 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Тьфу, опечатался. Правильно - соответственно, проверка на присваивание во время компиляции. |
Автор: | Oleg N. Cher [ Суббота, 28 Август, 2021 15:20 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Закрыл вторую проблему: Сейчас разыменование результата процедуры разрешено в диалектах КП и O3. Побочным эффектом добавил в O3 косвенный вызов процедуры вида: Код: MODULE Test; Как у Влада реализовано в Eberon. Как оказалось, OP2 синтаксически поддерживает эту конструкцию, только надо было поправить один вызов (OPV.design на expr, кто в теме).TYPE Proc = PROCEDURE; PROCEDURE proc; END proc; PROCEDURE getProc(): Proc; BEGIN RETURN proc END getProc; BEGIN getProc()(); (* OK in Eberon, error in original oberon *) END Test. Для желающих поспорить подчеркну: такой вызов реализован только в экспериментальном диалекте O3. |
Автор: | Oleg N. Cher [ Воскресенье, 29 Август, 2021 13:54 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
По третьей проблеме: оказывается, она не решена и в CPfront. Йозеф сейчас поддерживает Ofront не шибко оперативно, это может затянуться. Так что, я думаю, нам есть смысл подключить Дмитрия Викторовича Дагаева, если у него есть интерес закрыть эту ошибку в МультиОбероне. GameHunter, когда уже явите миру свой супер-проект на Обероне? Для которого нужен такой хитрый код с вложенными записями. В исходниках BlackBox, которые я пересобирал CPfront'ом полностью, такого кода нет. Иначе бы эта проблема вскрылась раньше. |
Страница 13 из 17 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |