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 хорошо работает такая конструкция:
Код:
PROCEDURE -GetModuleHandleA * (IN [nil] lpModuleName:ARRAY [untagged] OF SHORTCHAR): HMODULE "GetModuleHandleA(lpModuleName)";
Как-то BlackBox больше приучил к POINTER TO ARRAY [untagged], но почему бы и не просто ARRAY [untagged]?

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)";
Обратите внимание, что это не единственный способ привязаться к внешней библиотеке. Модификатор PROCEDURE - (я предпочитаю писать PROCEDURE- , т.к. минус относится к типу процедуры, а не к имени) сгенерирует макрос #define Module_Proc Proc. Также Вам потребуется #include <библиотека.h>, который Вы подключаете через файл .h0, и фактически Вы просто макросом переадресовываете вызов на прототип, описанный в .h-файле библиотеки. Если в этом прототипе функции будут свои типы, характерные для Си, но несовместимые с оберонскими, то придётся делать преобразования. Иначе будут предупреждения при компиляции.

В 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)

static void Win_Example (void)
{
  if (Win_GetModuleHandleA(NIL) == NIL) {
  }
}
Здесь у меня нет никаких идей, кроме такой: GetModuleHandleA считается необъявленной функцией. А в Си такая необъявленная функция работает по умолчанию с параметрами типа int. И наверное с результатом типа int. Вот поэтому Вы и имеете сравнение результата неявного типа int с явным NIL, который описан в SYSTEM.oh как ((void*)0)

Автор:  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.


Вложение:
Image1.png
Image1.png [ 52.41 КБ | Просмотров: 4164 ]

Автор:  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/