OberonCore https://forum.oberoncore.ru/ |
|
Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x86 https://forum.oberoncore.ru/viewtopic.php?f=30&t=6344 |
Страница 15 из 17 |
Автор: | Oleg N. Cher [ Понедельник, 17 Январь, 2022 00:24 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
GameHunter писал(а): Для связи с Windows Api хорошо работает такая конструкция: Как-то BlackBox больше приучил к POINTER TO ARRAY [untagged], но почему бы и не просто ARRAY [untagged]?Код: PROCEDURE -GetModuleHandleA * (IN [nil] lpModuleName:ARRAY [untagged] OF SHORTCHAR): HMODULE "GetModuleHandleA(lpModuleName)"; GameHunter писал(а): В чём может быть причина? Со старой версией ofront+'а программа успешно линкуется и исполняется. Посмотрите в сторону ключика GCC -Wl,-e_WinMain@16 (для Win32) или -Wl,-eWinMain (для Win64). И возьмите обновлённый crt1.c
|
Автор: | Oleg N. Cher [ Понедельник, 17 Январь, 2022 00:54 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
GameHunter писал(а): Код: PROCEDURE -GetModuleHandleA * (IN [nil] lpModuleName:ARRAY [untagged] OF SHORTCHAR): HMODULE "GetModuleHandleA(lpModuleName)"; В Ofront'е+ в дополнение к этому есть и другой способ (смотрите модуль WinApi): Код: MODULE [foreign] MyExternLib; PROCEDURE Proc * (parameter: Typ); (* Здесь не нужно никакого тела *) PROCEDURE ОберонИмя * ["СиИмя"] (parameter: Typ); END MyExternLib. Здесь уже сгенерируется прототип __EXTERN MyExternLib_Proc (Typ parameter); И #include <библиотека.h> не нужно, точки входа подставит сам линкер. То есть, в случае способа 1 Вы используете готовые сишные хидеры библиотек, а при способе 2 Ofront+ генерит свой собственный хидер. |
Автор: | Oleg N. Cher [ Понедельник, 17 Январь, 2022 05:16 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Теперь по поводу этой проблемы: Вы объявляете PROCEDURE -GetModuleHandleA, а такая процедура разворачивается в макрос, имеющий имя Module_GetModuleHandleA, а не просто GetModuleHandleA. В Ofront'е+ есть более удобный механизм определения прототипа внешней процедуры. Про это читайте постом выше. А макрос немного для других, менее тривиальных применений. И раз Вы описываете процедуру так, как описываете, то у Вас генерится такой Си-код: Код: #define Win_GetModuleHandleA(lpModuleName) GetModuleHandleA(lpModuleName) Здесь у меня нет никаких идей, кроме такой: GetModuleHandleA считается необъявленной функцией. А в Си такая необъявленная функция работает по умолчанию с параметрами типа int. И наверное с результатом типа int. Вот поэтому Вы и имеете сравнение результата неявного типа int с явным NIL, который описан в SYSTEM.oh как ((void*)0)
static void Win_Example (void) { if (Win_GetModuleHandleA(NIL) == NIL) { } } |
Автор: | GameHunter [ Понедельник, 17 Январь, 2022 20:14 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Получилось слинковать и запустить программу. Надо было, как вы и советовали, использовать и crt1.c, и ключ линкеру gcc. Необходимость включать в проект ваш crt1.c вызывает вопрос - зачем, собственно, так сделано? Ведь наверное не все компиляторы си содержат по умолчанию ваш crt1.c (например моя версия gcc ? Если это необходимо, то, наверное, имеет смысл включить этот файл в oFront+? |
Автор: | GameHunter [ Понедельник, 17 Январь, 2022 20:58 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Поправка. По своей рассеянности я раньше не замечал, что crt1.c уже включён в oFront+. По этому мои предыдущие замечания снимаются. В старых версиях oFront+'а я успешно компилировал свой проект без этого файла. В последней версии oFront+'а файл crt1.c необходимо сключать в проект. При этом, если использовать crt1.c из oFront+'а, то программа не завершается. А если использовать обновлённый crt1.cб то - завершается. |
Автор: | Oleg N. Cher [ Понедельник, 17 Январь, 2022 23:15 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
GameHunter писал(а): Необходимость включать в проект ваш crt1.c вызывает вопрос - зачем, собственно, так сделано? Издавна ещё со времён ретро-платформ у меня есть привычка добиваться компактности. Создайте в GCC пустой исполняемый файл и посмотрите зависимости. Он потянет из msvcrt.dll целую кучу функций, в т.ч. нужных для поддержки C++ (которая нам не нужна). И посмотрите размер. Он будет > 20-30 Кб в зависимости от версии GCC.В сети есть советы как уменьшить размер исполняемого файла путём вырезания из него этих зависимостей. Так мы можем получить .exe размером 1-1,5 Кб для пустой программы. Но если есть желание избавиться от crt1.c, просто уберите опции, заданные в StripExe: Цитата: SET StripExe=-nostartfiles ..\..\..\Mod\Lib\crt1.c -Wl,-e_WinMain@16 GameHunter писал(а): При этом, если использовать crt1.c из oFront+'а, то программа не завершается. А если использовать обновлённый crt1.cб то - завершается. Обновите Ofront+, уже добавлен новый crt1.c, всё протестировано и работает. Просто я изменил механизм работы с командной строкой под Windows, отсюда побочкой возникла эти проблема.
|
Автор: | GameHunter [ Среда, 19 Январь, 2022 07:31 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Следующая ошибка. Этот модуль транслируется в си, но при дальнейшей компиляции вылаёт ошибку. Код: MODULE Ex;
TYPE R0 = EXTENSIBLE RECORD x:REAL; END; R1 = EXTENSIBLE RECORD (R0) y:REAL; END; R2 = R1; R3 = EXTENSIBLE RECORD (R2) z:REAL; END; PROCEDURE Example (VAR r:R0); BEGIN WITH r:R1 DO r.y:=0 | r:R2 DO r.y:=0 | r:R3 DO r.z:=0 ELSE r.x:=0 END; END Example; END Ex. |
Автор: | Oleg N. Cher [ Среда, 19 Январь, 2022 18:57 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Это унаследованная проблема, она есть также в Ofront, voc и CPfront. И в МультиОбероне. Пока думаю. |
Автор: | Oleg N. Cher [ Четверг, 20 Январь, 2022 18:59 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Выкатил исправление. GameHunter, благодарю! Судя по всему, Вы кодите что-то нетривиальное на Обероне, раз вскрываете такие редкие ошибки, которые не возникли даже при трансляции в Си модулей BlackBox. |
Автор: | GameHunter [ Вторник, 01 Февраль, 2022 02:13 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Следующая ошибка. Этот модуль успешно транстируется в си, но потом выдаёт ошибку компиляции gcc: Код: MODULE Test;
TYPE Arr = ARRAY OF ARRAY 4 OF INTEGER; PROCEDURE Ex ( VAR a: Arr ); BEGIN a[0,1]:= -1 END Ex; END Test. |
Автор: | Oleg N. Cher [ Среда, 02 Февраль, 2022 04:38 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Есть исправление. Кстати, ошибка унаследованная — присутствует в Ofront и CPfront. И, видимо, в Мульти-Обероне тоже. |
Автор: | GameHunter [ Четверг, 03 Февраль, 2022 19:27 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Следующее замечание. Данный модуль успешно транслируется в си и затем успещно компилируется, но с какими-то подозрительными предупреждениями. Посмотрите пожалуйста, всё ли в порядке. Код: MODULE Ex; TYPE FixedArr = ARRAY 5 OF INTEGER; PROCEDURE Ex0 ( VAR a: INTEGER ); END Ex0; PROCEDURE Ex3 ( VAR a: ARRAY OF FixedArr ); BEGIN Ex0 ( a[ 0, 0 ] ); END Ex3; END Ex. Вложение:
|
Автор: | GameHunter [ Четверг, 03 Февраль, 2022 19:32 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Следующая ошибка. Этот модкль успешно транслируется в си, но при дальнейшей клмпиляции происходит ошибка. Код: MODULE Ex;
TYPE FixedArray = ARRAY 5 OF INTEGER; PROCEDURE Ex3 ( VAR a: ARRAY OF FixedArray ); BEGIN a[ 0, 0 ] := a[ 0, 0 ] + 1; END Ex3; END Ex. |
Автор: | Oleg N. Cher [ Пятница, 04 Февраль, 2022 05:06 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Похоже, что я предыдущим фиксом сломал вообще работу индексов. Новое исправление. Протестируйте, пожалуйста, его хорошенько с многомерными массивами. Я прогнал некоторые тесты для двухмерных массивов, вроде всё работает. К моему большому сожалению, Йозеф Темпл совсем забросил Ofront, а он понимает его многие тонкости куда лучше меня. |
Автор: | Oleg N. Cher [ Пятница, 04 Февраль, 2022 07:12 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Так, с фиксом не получилось, на этот раз сломалась работа со статическими массивами. Я всё откатил, думаю дальше. |
Автор: | GameHunter [ Понедельник, 07 Февраль, 2022 03:39 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
В офронте можно объявлять строковые константы в каком-нибудь юникоде? Нидеприведённый модуль, если использовать utf-8, компилируется, но выводит на экран кракозябрв вместо русских и немецких букв. Код: MODULE Ex;
IMPORT Console; BEGIN Console.String('asdf йцук üöäß'); Console.Ln; Console.Flush; END Ex. |
Автор: | Oleg N. Cher [ Понедельник, 07 Февраль, 2022 08:06 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Можно. Ключик -w (wide) включает перекодировку исходника из UTF-8 в UCS-2 (двухбайтовую кодировку широких символов в Windows). Насчёт проблемы - обдумываем с Йозефом. Вернее, Йозеф думает, я жду |
Автор: | Oleg N. Cher [ Среда, 23 Февраль, 2022 17:40 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Ну что ж, Йозеф совсем зашился, придётся самим. Осторожно выкатываю решение для замеченной проблемы. В принципе, не должен бы что-то сломать, но тестируйте. |
Автор: | GameHunter [ Суббота, 12 Март, 2022 00:59 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Следующя ошибка. Данный модуль транстируется в си, но в дальнейшем имеем ошибки компиляции. Цитата: MODULE Test;
TYPE Rec0 * = RECORD END; Arr0 = ARRAY 4 OF Rec0; PROCEDURE (VAR r:Rec0) Ex (VAR a:Arr0), NEW; BEGIN END Ex; END Test. |
Автор: | Oleg N. Cher [ Воскресенье, 13 Март, 2022 20:09 ] |
Заголовок сообщения: | Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8 |
Эта проблема связана с тем, что на момент определения массива Arr0 тип записи Rec0 ещё недоопределён. Если поменять порядок определений, будет та же самая проблема: Код: TYPE Arr0 = ARRAY 4 OF Rec0; Rec0 * = RECORD END; Эта ошибка также присутствует в CPfront и в Мульти-Обероне. В Ofront и voc её нет, там такой код просто вызовет ошибку рекурсивного определения. Я прошу помощи у Дмитрия Викторовича Дагаева, если ему ещё интересна доработка Мульти-Оберона. Тем более, что он уже патчил код, связанный с рекурсивным определением типов. |
Страница 15 из 17 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |