OberonCore https://forum.oberoncore.ru/ |
|
Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x86 https://forum.oberoncore.ru/viewtopic.php?f=30&t=6344 |
Страница 16 из 17 |
Автор: | Oleg N. Cher [ Понедельник, 14 Март, 2022 00:21 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Предлагаю такое исправление. |
Автор: | Дмитрий Дагаев [ Понедельник, 14 Март, 2022 19:40 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Oleg N. Cher писал(а): Эта ошибка также присутствует в CPfront и в Мульти-Обероне. В Ofront и voc её нет, там такой код просто вызовет ошибку рекурсивного определения. Я прошу помощи у Дмитрия Викторовича Дагаева, если ему ещё интересна доработка Мульти-Оберона. Тем более, что он уже патчил код, связанный с рекурсивным определением типов. Код компилируется МультиОбероном, к сожалению, в связи со сменой компа компилятора C нет. Поэтому проверить до конца не могу. В процедуре DefineType у меня есть код. Код: IF (obj # NIL) & (Undefined(obj) OR (obj^.linkadr = TEMPORARY_TYPE)) THEN ... IF (str^.form = fPOINTER) & (str^.base_typ^.comp = CF_ARRAY) THEN obj := str.base_typ.strobj; IF (obj # NIL) & (obj^.linkadr = RECURSIVE_TYPE) THEN obj^.linkadr := TEMPORARY_TYPE; DefineType(str^.base_typ); obj^.linkadr := RECURSIVE_TYPE; END END END Насколько могу судить, Вы предлагаете аналогичное решение извне DefineType. Возражений против такого не имею. |
Автор: | Oleg N. Cher [ Среда, 16 Март, 2022 00:47 ] | ||
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 | ||
Заинтересованы ли Вы в улучшении совместимости бэк-энда в Си с BlackBox? Я тут заметил, что у нас сломалась (или не работала) компиляция некоторых модулей с рекурсивным определением типов. Прикладываю эти модули, которые компилируются в BlackBox, но в Мульти-Обероне (бэк-энд в Си) их стоит проверить. Хорошо бы также проверить их компилируемость сишкой. Когда Вы зайдёте в тупик при определении типа, который ссылается сам на себя, вроде: Код: TYPE Arr = ARRAY 2 OF POINTER TO Arr; То я предлагаю в случае определения такого типа подменять тип указателя на самого себя (что не соберётся сишкой) на void*, а потом при разыменовании приводить к нужному типу (для чего детектить тип на присутствие тега RecursiveType): OPV.design Код: - ELSE OPM.Write(Deref); expr(n^.left, designPrec) + ELSE + OPM.Write(Deref); + IF (n^.typ^.strobj # NIL) & (n^.typ^.strobj^.linkadr = RecursiveType) THEN + OPM.Write("("); OPC.Ident(n^.typ^.strobj); OPM.WriteString("*)") + END; + expr(n^.left, designPrec) Если рекурсивное определение не слишком дикое (тип массив имеет элементы типа запись, где поля являются массивами этого же типа), то в рекурсивном определении в кольце обязательно есть указатель. И если его нельзя описать в Си через самого себя, то тут сам просится void*. Мне это решение кажется даже в чём-то изящным. Хотя может я что-то упустил. Дмитрий Викторович, только Вы можете навести в этом порядок. Я конечно пробую, но у меня получается пока не очень — неуклюже и корявенько. Буду пробовать ещё.
|
Автор: | Дмитрий Дагаев [ Четверг, 17 Март, 2022 20:07 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Понятно, буду смотреть ещё. |
Автор: | Дмитрий Дагаев [ Пятница, 18 Март, 2022 19:31 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Oleg N. Cher писал(а): Прикладываю эти модули, которые компилируются в BlackBox, но в Мульти-Обероне (бэк-энд в Си) их стоит проверить. Хорошо бы также проверить их компилируемость сишкой. Докладываю. Собираются с успешной компиляцией Ex, Ex3, Ex4, Ex7. Не собираются Ex2, Ex5, Ex6, Ex8. Я в один код все объединил. Код: (* Ex.cp + *) REx1Rec = RECORD END; REx1Ptr = POINTER TO ARRAY OF REx1Rec; (* Ex2.cp - *) REx2Ptr = POINTER TO ARRAY 3 OF POINTER TO ARRAY 4 OF BOOLEAN; (* Ex3.cp + *) REx3ArrPtr = POINTER TO REx3Arr; REx3Arr = ARRAY 2,3 OF REx3ArrPtr; (* Ex4.cp + *) REx4ArrPtr = POINTER TO REx4Arr; REx4Arr = ARRAY OF REx4ArrPtr; (* Ex5.cp - *) REx5Arr = ARRAY 2 OF POINTER TO REx5Arr; (* Ex6.cp - *) REx6ArrPtr = POINTER TO ARRAY OF REx6ArrPtr; (* Ex7.cp + *) REx7Elem = POINTER TO RECORD next: REx7Elem; pos: INTEGER; END; REx7CaseTable = ARRAY 1 OF RECORD low, high: INTEGER END; (* Ex8.cp - *) REx8Rec0 * = RECORD END; REx8Arr0 = ARRAY 4 OF REx8Rec0; PROCEDURE RExRun; VAR a: REx3Arr; p: REx3ArrPtr; (*a5: REx5Arr; p5: POINTER TO REx5Arr;*) BEGIN a := p^; END RExRun; PROCEDURE (VAR r: REx8Rec0) Ex (VAR a: REx8Arr0), NEW; BEGIN END Ex; Тесты хорошие. Надо думать над устранением. |
Автор: | Дмитрий Дагаев [ Среда, 23 Март, 2022 08:32 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Устранено Ex6. Процедура OmfOPC.DefineType. Старый код закомментирован с пометкой [Ex6]. Код: IF obj # NIL THEN (* check for cycles *)
IF obj^.linkadr = PROCESSING_TYPE THEN IF (str^.form # fPOINTER) OR (str.base_typ.strobj = NIL) (*[Ex6] str^.form # fPOINTER*) THEN obj^.linkadr := RECURSIVE_TYPE END ELSE obj^.linkadr := PROCESSING_TYPE END END ; |
Автор: | GameHunter [ Пятница, 01 Апрель, 2022 00:16 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Следующая ошибка. Код: MODULE Test; (этот модуль отличается от предыдущего ошибочного модуля только тем, что процедура Rec0.Ex экспортируется)TYPE Rec0 * = RECORD END; Arr0 = ARRAY 4 OF Rec0; PROCEDURE (VAR r:Rec0) Ex * (VAR a:Arr0), NEW; BEGIN END Ex; END Test. Код: MODULE Main; IMPORT Test; END Main. Транслируется в си, но затем не компилируется. |
Автор: | Oleg N. Cher [ Вторник, 05 Апрель, 2022 18:32 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Дмитрий Дагаев писал(а): Устранено Ex6. Процедура OmfOPC.DefineType. Старый код закомментирован с пометкой [Ex6]. Хорошая правка, устраняет зацикливание. Внёс в Ofront+.Код: IF (str^.form # fPOINTER) OR (str.base_typ.strobj = NIL) (*[Ex6] str^.form # fPOINTER*) THEN Сейчас пытаюсь разобраться с Ex5 и вклинить определение рекурсивного типа в OPC.DefineType, пока не очень понятно как там всё устроено. |
Автор: | Oleg N. Cher [ Понедельник, 27 Июнь, 2022 15:56 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Торжественно сообщаю, что Ofront+ опять перешёл в статус "все критичные проблемы исправлены". На сей раз серьёзно поправлена обработка определений циклических типов, которая потребовала немало времени, чтобы с этим разобраться. Дмитрий Викторович, мы с Вами называли такие определения рекурсивными, но по терминологии разработчиков ETH Oberon и BlackBox они называются циклическими. А рекурсивными называются определения вида: Код: TYPE Typ = Typ; (* error 58: recursive type definition *) Получается, что рекурсивные определения типов не имеют смысла, а циклические согласно описания языка Компонентный Паскаль допустимы: Цитата: A declaration of a type T containing references to another type T1 may occur at a point where Здесь прямо не говорится о циклических определениях, но они и не запрещены.T1 is still unknown. The declaration of T1 must follow in the same block to which T is local. В связи с чем я изменил константу OPC.RecursiveType на CyclicType. Итак, сейчас Ofront+ успешно транслирует все примеры, о которых были посты выше, плюс даже такой: Код: MODULE Ex111; TYPE Proc = PROCEDURE (b: Proc); VAR p: Proc; PROCEDURE Abc (b: Proc); END Abc; BEGIN p := Abc END Ex111. А вот если результатом процедуры типа Proc будет Proc, то на таком коде Ofront+ просто выдаст ошибку "not yet implemented": Код: TYPE Вопрос дискуссионный, но я не знаю как это транслировать в Си. Мы обсудили это в группе по Ofront+ в Telegram и единодушно решили, что польза от этих циклических определений весьма сомнительна.Proc = PROCEDURE (): Proc; Да, циклические определения разрешены в Ofront+ только для Компонентного Паскаля. P.S. Могу посодействовать исправлению этих моментов в МультиОбероне. Напрямую брать моё решение в лоб вряд ли нужно — в Ofront+ работа с массивами устроена несколько иначе, чем в CPfront. Но пока в моей голове свежи все эти моменты, можем заняться, если конечно есть интерес. |
Автор: | Дмитрий Дагаев [ Понедельник, 27 Июнь, 2022 21:41 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Да, Вы правы, RecursiveType оказалось неудачным определением. Очень хорошо, что в Ofront+ эти вопросы закрыты. Циклические определения типов точно нужны, а процедуры через процедуры - экзотика. Надо внимательно все посмотреть. |
Автор: | Oleg N. Cher [ Среда, 07 Сентябрь, 2022 01:45 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Реализовал поддержку типов ANYPTR и ANYREC: Пробую собирать модуль Services из BlackBox, в котором есть такой код: Код: TYPE Action* = POINTER TO ABSTRACT RECORD notBefore: LONGINT; next: Action (* next element in linear list *) END; (** Action **) PROCEDURE (a: Action) Do- (), NEW, ABSTRACT; Может ли кто-нибудь объяснить этот модификатор Do- ? |
Автор: | Александр Ильин [ Вторник, 20 Сентябрь, 2022 18:07 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Oleg N. Cher писал(а): Код: TYPE Action* = POINTER TO ABSTRACT RECORD notBefore: LONGINT; next: Action (* next element in linear list *) END; (** Action **) PROCEDURE (a: Action) Do- (), NEW, ABSTRACT; Может ли кто-нибудь объяснить этот модификатор Do- ? Если я правильно помню, экспорт метода "только для чтения" с помощью минуса означает, что другие модули могут реализовывать этот метод в расширенных типах, но никто кроме первоначального модуля не может этот метод вызывать. Таким образом гарантируется, что все реализации этого метода будут иметь некоторый контекст выполнения, заданный базовым модулем Services. Ни в каком другом модуле нельзя написать "VAR a: Services.Action; BEGIN a.Do();", будет ошибка компиляции. |
Автор: | Oleg N. Cher [ Среда, 22 Март, 2023 16:31 ] | ||
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 | ||
Коллеги, я вынужден сделать пост уже в "своей" теме. Не в продолжение срачика, а в защиту своего кода. Может arisu и запудрил кое-кому мозги, кто не в теме, но в BlackBox нет AST анализатора. Так что моё решение вполне корректно. Оно корректно не "в общем", не в "идеальной рабочей среде, где может быть всё", а в конкретно взятом OP2, где много кода, работающего с mnolev и vis подобным образом. Сделайте поиск в Dev по "mnolev := -128". Переменную r/o для цикла FOR я внедрил в диалект О3. Там есть ещё одно решение, предложенное Олегом Комлевым, до которого не додумался arisu. Это требование для переменной цикла быть как можно наиболее локальной. Это нужно, чтобы предотвратить использование в качестве счётчика цикла глобальной переменной. Т.е.:
|
Автор: | Дмитрий Дагаев [ Среда, 22 Март, 2023 18:19 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Вполне разумное решение. К тому же ясно сформировано: для чего сделано, что сделано и как. |
Автор: | GameHunter [ Понедельник, 10 Апрель, 2023 05:41 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Ещё одна ошибка при трансляции данного модуля в си: Ex.cp translating Ex 6:28 err 200 not yet implemented Код: MODULE Ex;
TYPE Arr = ARRAY 4 OF LONGINT; PROCEDURE ExProc ( z: ARRAY 4 OF LONGINT ); BEGIN END ExProc; END Ex. |
Автор: | Oleg N. Cher [ Понедельник, 10 Апрель, 2023 16:51 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Давненько Вы ошибок не постили Данная ошибка присутствует в оригинальном Ofront, но исправлена в CPfront. Есть фикс. P. S. А вообще для Оберона-2 это даже и не ошибка, потому что такое объявление параметра не будет совместимо ни с чем, поэтому ничего удивительного нет в том, что Йозеф Темпл не реализовал такое. Это один из спорных моментов КП, где строгость проверки совместимости массивов ослаблена. Непонятно зачем. Структурное совпадение массивов не обязательно обозначает необходимость их совместимости. Меня лично не напрягает объявить их для совместимости вместе под одним алиасом. |
Автор: | GameHunter [ Понедельник, 01 Май, 2023 00:16 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
В нижеприведённом модуле намеренно сделана ошибка: индекс массива выходит за его пределы. По умолчанию включена проверка индексов. Однако, программа завершается, ничего не выводя на экран. А если отключить проверку индексов параметром -x, то, как и ожидалось, выводится 'Finish'. Вопрос: это проверка индекса глючит, или она работает втихую? В последнем случае надо бы как-нибудь сообщать об этом... Код: MODULE Ex;
IMPORT C:=Console; PROCEDURE TestCheckIndex (); VAR x:ARRAY 3 OF LONGINT; i,j:LONGINT; BEGIN i:=4; j:=x[i] END TestCheckIndex; BEGIN TestCheckIndex(); C.String('Finish'); C.Ln; C.Flush; END Ex. |
Автор: | Oleg N. Cher [ Понедельник, 01 Май, 2023 02:51 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Проверка индекса не глючит. Втихую - было решено, чтобы простая программа не тянула за собой сам принцип консольного вывода, поэтому по умолчанию программа только возвращает в ОС код ошибки. Чтобы получить консольное сообщение, сделайте хотя бы из одного модуля IMPORT Kernel |
Автор: | GameHunter [ Пятница, 08 Март, 2024 02:42 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Здравствуйте. Нашёл ещё одну ошибку Ofront+. В этом модуле на экран должно выводиться 5, а выводится неправильное число. Код: MODULE Ex;
IMPORT C:=Console; VAR arr: ARRAY 3, 5 OF CHAR; PROCEDURE Example ( VAR b:ARRAY OF ARRAY OF CHAR ); PROCEDURE Example1 (); BEGIN C.Int( LEN( b, 1 ), 0 ); END Example1; BEGIN Example1() END Example; BEGIN Example( arr ); C.Flush; END Ex. |
Страница 16 из 17 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |