OberonCore https://forum.oberoncore.ru/ |
|
Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x86 https://forum.oberoncore.ru/viewtopic.php?f=30&t=6344 |
Страница 5 из 17 |
Автор: | Oleg N. Cher [ Среда, 02 Октябрь, 2019 14:18 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Новости проекта Ofront+. Я работаю над реализацией конкатенации строк. Сейчас уже компилится такой код: Код: MODULE TestConcat; IMPORT Console; CONST Str* = "String 1 "+ 0DX + 0AX + 0X + "String 2 " + '"' + "'" + 0FFX; Str2* = " ' "; Str3* = ' " '; VAR str: ARRAY 13 OF SHORTCHAR; BEGIN str := "Hello, "; str := str + "World"; Console.WriteStr(str); Console.WriteLn; Console.WriteInt(LEN(str$)); Console.WriteLn; END TestConcat. Также подправил вывод строк в браузере символьников и, на мой взгляд, он сейчас их выводит лучше, чем ББ-шный: Код: DEFINITION TestConcat; Для сравнения вот что выдаёт ББ:CONST Str = "String 1 " + 0DX + 0AX + "String 2 " + 22X + "'" + 0FFX; Str2 = " ' "; Str3 = ' " '; END TestConcat. Код: DEFINITION TestConcat; CONST Str = "String 1 " + 0DX + 0AX + "String 2 "'ÿ"; Str2 = " ' "; Str3 = " " "; END TestConcat. Ещё я оптимизировал операцию str := str + str2, которая до моей правки сводилась к двум низкоуровневым операциям: Код: MODULE TestConcat; VAR str: ARRAY 13 OF SHORTCHAR; BEGIN str := str + "World" END TestConcat. Код: __STRCOPYSS(TestConcat_str, TestConcat_str, 13); // <-- copy string into itself __STRAPNDSS("World", TestConcat_str, 13); После правки операция копирования строки саму в себя убрана. |
Автор: | Oleg N. Cher [ Среда, 02 Октябрь, 2019 14:20 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Кстати, обращаю внимание мэйнтейнеров собственных сборок BlackBox. Я не удивлюсь, если в них присутствует эта же проблема - копирование строки саму в себя при конкатенации. Похоже, что OMinc эту оптимизацию планировали, просто она у них не срабатывает по недосмотру: процедура OPV.SameExp (n1, n2: OPT.Node): BOOLEAN возвращает TRUE, если выражение одно и то же. Она-то и призвана отсечь копирование строки саму в себя. Но после псевдооперации преобразования типа "массив" к типу "строка" он уже не воспринимается этой процедурой как та же сущность, и она срабатывает некорректно. Правлю так: Код: PROCEDURE SameExp (n1, n2: OPT.Node): BOOLEAN; BEGIN + IF (n2^.class = Nderef) & (n2^.typ^.form = String) THEN n2 := n2^.left END; WHILE (n1^.class = n2^.class) & (n1^.typ = n2^.typ) DO Т.е. если последняя операция это преобразование массива к строке, то мы для сравнения её откатываем. Это работает. Ссылка на коммит: https://github.com/Oleg-N-Cher/OfrontPl ... bf834b295d Отпишитесь, пожалуйста, если удастся исправить это в какой-то сборке BlackBox. |
Автор: | GameHunter [ Четверг, 03 Октябрь, 2019 17:51 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Код: MODULE Test; TYPE Arr = ARRAY 3,4 OF REAL; PROCEDURE Do1 (): POINTER TO Arr; BEGIN RETURN NIL END Do1; END Test. Хм... Что-то по прежнему не генерируется .c-файл для этого тестового модуля |
Автор: | GameHunter [ Четверг, 03 Октябрь, 2019 18:33 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Vinovat, oshibsha. Ispol'zoval ne tot exe-shnik. |
Автор: | Oleg N. Cher [ Четверг, 03 Октябрь, 2019 18:42 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Ну вот и хорошо. Там ещё сделана маленькая правочка, связанная с этой проблемой. Перекачайте бинарь. Эх... я уже привык, что про баги пишут публично, а хвалят приватно. Наверно чтобы никто не видел. |
Автор: | Comdiv [ Воскресенье, 06 Октябрь, 2019 01:28 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Планируется ли поддержку O7 довести до возможности собирать код на О7 или как и в мультиобероне поддержка будет приблизительной? |
Автор: | Oleg N. Cher [ Воскресенье, 06 Октябрь, 2019 12:46 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Поддержка планируется, хотя смущает разброс разночтений сообщения о языке. Дело за желающими помочь на уровне "теперь сделай вот то-то". Я открыт к таким предложениям. А в мультиобероне есть поддержка O7? Она там вроде заявлена только гипотетически. |
Автор: | Comdiv [ Воскресенье, 06 Октябрь, 2019 13:05 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Oleg N. Cher писал(а): Я открыт к таким предложениям. Для того и спросил, чтобы узнать, нужны ли Вам такие предложения.Oleg N. Cher писал(а): смущает разброс разночтений Зря смущает, критических разночтений там нет. Если же имеющиеся разночтения Вы считаете критическими, то и O2, и КП должны смущать во многом. Но является ли это препятствием для чего-то?
|
Автор: | Oleg N. Cher [ Воскресенье, 06 Октябрь, 2019 17:02 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
GameHunter писал(а): Тестовый модуль в ББ компилируется: Код: MODULE Test; TYPE Arr = ARRAY 2,3 OF REAL; Ptr = POINTER TO Arr; VAR a:Arr; PROCEDURE Do (): Ptr; BEGIN RETURN NIL END Do; BEGIN a:=Do()^; END Test. Ofront+ выдаёт ошибку: 16:10 err 78 dereferenced object is not a variable Такие выражения не допускает оригинальный Ofront, но понимает их по частям: в первом выражении присвоение указателю результата вызова функции, во втором — разыменование. Исправил. Спасибо за информацию. |
Автор: | Oleg N. Cher [ Понедельник, 07 Октябрь, 2019 21:09 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Я было подумал, что будут какие-то накладки соединения вызова метода с разыменованием с синтаксисом супервызова, но попробовал и убедился, что ^ в супервызове пишется до скобок, а ^ при разыменовании — после скобок. Получается любопытный синтаксис, который работает сейчас и в Ofront'е+, и в BlackBox: Код: MODULE Test;
TYPE Arr = ARRAY 2,3 OF REAL; Ptr = POINTER TO Arr; TYPE Father = EXTENSIBLE RECORD END; Child = RECORD (Father) END; VAR a: Arr; PROCEDURE (VAR self: Father) Do (): Ptr, NEW, EXTENSIBLE; BEGIN RETURN NIL END Do; PROCEDURE (VAR self: Child) Do (): Ptr; BEGIN a := self.Do^()^; (* Супервызов с разыменованием *) RETURN NIL END Do; END Test. |
Автор: | prospero78 [ Вторник, 08 Октябрь, 2019 20:43 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Не надо так делать, Олег. Забавно и не более. Нельзя давать расползаться семантике и синтаксису. |
Автор: | Oleg N. Cher [ Среда, 09 Октябрь, 2019 14:15 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Это не я так делаю, Валера. Это OMinc так сделали. Я поддерживаю совместимость с КП, не более того. |
Автор: | GameHunter [ Вторник, 22 Октябрь, 2019 00:15 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Вот тестовый модуль: Цитата: MODULE Test; TYPE T1 = ARRAY 5 OF REAL; T2 = ARRAY 5 OF T1; PROCEDURE Do4 ( IN x:ARRAY OF ARRAY OF REAL ); BEGIN END Do4; PROCEDURE Do3 ( IN x:ARRAY OF T1 ); BEGIN Do4( x ); END Do3; END Test. Он успешно компилируется, но получившиеся c-файлы дальше не компилируются. Смотрим Test.c: Код: /* Ofront+ 1.0 -mC -88 */ #include "SYSTEM.h" typedef REAL Test_T1[5]; typedef Test_T1 Test_T2[5]; static void Test_Do3 (Test_T1 *x, INTEGER x__len); static void Test_Do4 (REAL *x, INTEGER x__len, INTEGER x__len1); /*============================================================================*/ static void Test_Do4 (REAL *x, INTEGER x__len, INTEGER x__len1) { } static void Test_Do3 (Test_T1 *x, INTEGER x__len) { Test_Do4((void*)x, x__len, x__len1); } int main(int argc, char **argv) { __INIT(argc, argv); __REGMAIN("Test", 0); /* BEGIN */ __FINI; } Вызов процедуры Do4 из процедуры Do3 находим в 25-й строке: Код: Test_Do4((void*)x, x__len, x__len1); В этом вызове присутствует необъявленная в c-файле переменная x__len1 |
Автор: | Oleg N. Cher [ Четверг, 24 Октябрь, 2019 00:23 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Спасибо за информацию. Пока только скажу, что эта ошибка также есть и в оригинальном Ofront (и в voc / Free Oberon, естественно, тоже). Так что не грех и Йозефу Темплу сообщить. А CPfront на этом же коде вместо x__len1 генерит 5. |
Автор: | Oleg N. Cher [ Вторник, 29 Октябрь, 2019 05:20 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Проблема с длиной массива исправлена, попутно найдена ещё одна некритичная ошибка, которая передаёт несовместимые параметры-указатели. Эта тоже исправлена. Ошибка передачи несовместимых указателей была и в CPfront. |
Автор: | GameHunter [ Среда, 30 Октябрь, 2019 20:36 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Вот тестовый модуль: Цитата: MODULE Test; IMPORT C:=Console; VAR x:ARRAY 3,3 OF INTEGER; i,j:INTEGER; PROCEDURE Sum (IN x:ARRAY OF INTEGER): INTEGER; (* Сумма элементов массива *) VAR result:INTEGER; j:INTEGER; BEGIN result:=0; FOR j:=0 TO LEN(x)-1 DO result:=result+x[j] END; RETURN result END Sum; PROCEDURE Sum1 (IN x:ARRAY OF ARRAY OF INTEGER): INTEGER; (* Сумма элементов подмассива x[1] *) BEGIN RETURN Sum(x[1]) END Sum1; BEGIN (* Инициализируем массив x *) FOR i:=0 TO LEN(x)-1 DO FOR j:=0 TO LEN(x,1)-1 DO x[i,j]:=i+j; END; END; (* Выводим элементы массива x на экран, чтобы убедиться, что всё в порядке *) FOR i:=0 TO LEN(x)-1 DO FOR j:=0 TO LEN(x,1)-1 DO C.Int(x[i,j],5); END; C.Ln(); END; C.Ln; C.Ln; (* Сумма элементоа подмассива x[1]. Выводится 6, - это правильный результат *) C.Int(Sum(x[1]),0); C.Ln(); C.Ln; C.Ln; (* Сумма элементоа подмассива x[1]. Выводится 4, - это неправильный результат *) C.Int(Sum1(x),0); C.Ln(); END Test. Вот что скомпилированная программа выводит на экран: 0 1 2 1 2 3 2 3 4 6 4 В главном теле программы происходит инициализация массива x, затем на экран выводятся его элементы, чтобы проверить, что всё правильно проинициализировано. Затем опретор C.Int(Sum(x[1]),0) вычисляет сумму элементов подмассива x[1] и выводит его на экран. Выводится 6, это правильно. Затем опретор C.Int(Sum1(x),0) вычисляет сумму элементов подмассива x[1] и выводит его на экран. Выводится 4, это неправильно. Похоже, процедура Sum1 компилируется с ошибкой. |
Автор: | GameHunter [ Пятница, 01 Ноябрь, 2019 21:46 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Вот тестовый модуль: Код: MODULE Test; CONST asdf = 1.000000001E+0308; END Test. При компилировании выдаётся ошибка: 4:9 err 203 number too large Если вместо 1.000000001E+0308 написать 1.0E+0308, - компилиркется. Это ошибка, т.к. asdf меньше предельнго допустимого значения для 64-битного вещественного числа, которое в десятичном представлении равно 1.79769313486231571E+0308. |
Автор: | Oleg N. Cher [ Суббота, 02 Ноябрь, 2019 20:49 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Спасибо за информацию, GameHunter. По массивам: действительно фиксирую ошибку, которая имеется в исходном Ofront'е. Кстати, пропадает, если убрать IN (а с VAR тоже присутствует). И в CPfront'е её уже нет, исправили. По поводу сверхбольших вещественных чисел: похоже, что это родовая проблема OP2, начиная ещё с ETH Oberon'а. Да, по-хорошему нужно что-то с этим сделать. |
Автор: | Oleg N. Cher [ Воскресенье, 03 Ноябрь, 2019 07:41 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Проблема с неправильным вычислением смещения при обращении к многомерному массиву исправлена. Насчёт сверхбольших вещественных чисел буду думать. |
Автор: | Oleg N. Cher [ Вторник, 05 Ноябрь, 2019 08:47 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
После сегодняшней правки Ofront+ стал понимать сверхбольшие числа на ввод. Код: MODULE Test; CONST asdf* = 1.000000001E+308; a* = 1.79769313486231571E+308; VAR r1, r2: REAL; PROCEDURE Abc; BEGIN r1 := asdf; r2 := a; END Abc; END Test. Ofront+ для BlackBox транслирует это. Результат: Код: static void Test_Abc (void) { Test_r1 = (5.000000005E+307 * 2); Test_r2 = (8.988465674311579E+307 * 2); } Версия для командной строки даже не понимает последнее присваивание. Её вывод: Код: static void Test_Abc (void) { Test_r1 = ( 5.00000000500000e+307 * 2); } Интерфейс скомпилированного ею модуля через утилиту showdef выглядит так: Код: DEFINITION Test; CONST a = NaN ; asdf = 1.00000000100000D+308; END Test. Это в дальнейшем мы будем улучшать, так что комментарии и эксперименты приветствуются. При трансляции Си-файла вывод вещественных чисел Ofront+ для командной строки осуществляет через старый ETH-овский модуль Texts, работа с вещественными числами в котором очень далека от совершенства, мягко говоря. Если сможете помочь с этим, буду признателен (процедура WriteLongReal). |
Страница 5 из 17 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |