OberonCore
https://forum.oberoncore.ru/

Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x86
https://forum.oberoncore.ru/viewtopic.php?f=30&t=6344
Страница 6 из 17

Автор:  GameHunter [ Пятница, 08 Ноябрь, 2019 23:49 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Как при помощи Ofront+'а создать неконсольное приложение?
(у меня получаются только консольные)

Автор:  Oleg N. Cher [ Суббота, 09 Ноябрь, 2019 00:19 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

В MinGW есть опция командной строки -mwindows для создания неконсольных приложений.

В проекте XDev есть подсистема WinDev, где есть несколько примеров оконных приложений:



Вложения:
GuiApps.png
GuiApps.png [ 69.49 КБ | Просмотров: 4435 ]

Автор:  Oleg N. Cher [ Суббота, 09 Ноябрь, 2019 12:19 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Ещё в качестве примера неконсольного приложения есть порт игры арканоид на библиотеке Graph (прослойка к SDL 2 от Артура Ефимова, взятая из Free Oberon):


Игра переписана с Monkey-X на Оберон-2 и компилируется при помощи XDev (через Ofront+) для Windows/Linux 32/64 бит. Думаю, для какой-нить малинки тоже соберётся.

Вложения:
Arkanoid.png
Arkanoid.png [ 42.65 КБ | Просмотров: 4420 ]

Автор:  Oleg N. Cher [ Суббота, 09 Ноябрь, 2019 12:31 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Я сейчас тестирую WriteLongReal после своих интеллигентных правок. И конечно есть расхождения с BlackBox. Например:

Код:
CONST
  _2* = MAX(REAL) / 2;
  _4* = MAX(REAL) / 4;
  _8* = MAX(REAL) / 8;
  _16* = MAX(REAL) / 16;
  a* = 1.7976931348623E+308;
  max* = MAX(REAL); min* = MIN(REAL);

BlackBox:
Код:
    _2 = 8.988465674311579E+307;
    _4 = 4.494232837155789E+307;
    _8 = 2.247116418577895E+307;
    _16 = 1.123558209288947E+307;
    a = 1.7976931348623E+308;
    max = 1.797693134862316E+308;
    min = -1.797693134862316E+308;

Ofront+
Код:
    _2 = 8.98846567431157E+307;
    _4 = 4.49423283715579E+307;
    _8 = 2.24711641857789E+307;
    _16 = 1.12355820928895E+307;
    a = 1.7976931348623E+308;
    max = 1.79769313486231E+308;
    min = -1.79769313486231E+308;

Очень плохо, что MAX(LONGINT) отличается. Но это предельное граничное число, поэтому ничего удивительного. И ещё: одинаковый код иногда по-разному считает в BlackBox и в Ofront+/GCC входящее вещественное число в сканере OPS. Это я объясняю тем, что GCC использует сопроцессор с 80-битовой вещественной арифметикой. BlackBox тоже использует его же, но GCC ещё и хранит промежуточные значения в 80-битной форме, а BlackBox нет.

Что будем с этим делать, GameHunter? Дело ещё и в мантиссе. Она при выводе числа считается сишной функцией ecvt (в Reals.ConvertL). Притом у меня нет ответа, кто более правильно считает — BlackBox или ecvt.

Ну, в общем, на днях закоммичу эти правки, хуже всё равно не стало, только лучше. Раньше эти граничные значения вообще вызывали ошибку 203 "number too large".

Автор:  GameHunter [ Воскресенье, 10 Ноябрь, 2019 03:24 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Всё в порядке, покуда разница между ББ и Офронтом в 15-м знаке после запятой.

Цитата:
Очень плохо, что MAX(LONGINT)

Вы, наверное, MAX(REAL) имели в виду?

Автор:  Oleg N. Cher [ Воскресенье, 10 Ноябрь, 2019 09:04 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Да, точно. MAX(REAL)

А погрешность-то и 14-й знак после запятой задевает. А из-за заниженного MAX(REAL) вообще боюсь, что сузится диапазон допустимых чисел для расчётов.

Автор:  Борис Рюмшин [ Воскресенье, 10 Ноябрь, 2019 10:42 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Сильно не сузится. Это границы диапазона, на них в здравом уме никто считать не будет. А проблемы с вещественными можно огрести гораздо раньше.

Автор:  luowy [ Воскресенье, 10 Ноябрь, 2019 11:27 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

The question about floating point numbers has been discussed in the center.Robert(author of Lib) is an expert,you'd better ask him if worry about it ;

Adding new features is not impossible, but we must consider whether it is really necessary, compatibility issues, the amount of code added, stability, implementation issues of other architectures... etc.

The center puts more focus on error handling than adding new features to make this product more stable .Subject to limited resources, they had to;

But the Russian community is open, there are many new ideas and projects here(Including your). I like it;

Автор:  Oleg N. Cher [ Воскресенье, 08 Декабрь, 2019 06:26 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Поправлена работа с большими вещественными числами. Устаревшая функция ecvt заменена на sprintf. При конвертации длинного вещественного в строку точность у sprintf повыше, чем это делает BlackBox. Не то чтобы я не хотел переписать конвертацию на Оберон, но это потом.

Александр Ширяев успешно собрал Ofront+ для OpenBSD x86. А сборка для FreeBSD x64 закончилась неудачей (из-за отсутствия поддержки в ней этой самой ecvt). Сейчас можно опять пробовать.

Я реструктурировал проект, теперь в нём есть папка Target, в которой размещены файлы для поддержки следующих платформ:

- Linux64
- Linux86
- LinuxArm
- Win32
- Win64

Саша, у меня такая просьба: если будет время/желание, пособирай Ofront+ для разных систем на базе BSD, чтобы добавить в Target поддержку сборки и под них.

Если у кого-то есть возможность собрать Ofront+ для macOS, будет тоже интересно.

Автор:  Oleg N. Cher [ Воскресенье, 08 Декабрь, 2019 21:01 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Для обсуждения вопросов развития Ofront+ создана группа в Телеграме:


Приглашаем пользователей и всех, кто хочет участвовать в формировании стратегии его разработки.

Автор:  Trurl [ Воскресенье, 08 Декабрь, 2019 23:06 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Oleg N. Cher писал(а):
Это я объясняю тем, что GCC использует сопроцессор с 80-битовой вещественной арифметикой. BlackBox тоже использует его же, но GCC ещё и хранит промежуточные значения в 80-битной форме, а BlackBox нет.

Насколько я помню, GCC использует арифметику с произвольной точносттью.

Автор:  GameHunter [ Воскресенье, 29 Декабрь, 2019 06:45 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Ofront+ для компонентного паскаля инициализирует указатели и переменные процедурного типа NIL'ами, как это требует компонентный паскаль (это касается и переменных, и стркутур в динамической памяти)? А то в описании опции p написано что-то невнятное...

Автор:  Oleg N. Cher [ Воскресенье, 29 Декабрь, 2019 23:09 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Инициализирует. Не сделана ещё инициализация OUT-параметров-указателей, но там немного работы, надо просто посвятить вечерок и сделать.

Опция -p очень простая: не инициализировать или инициализировать все указатели NIL'ом. По умолчанию, естественно, инициализировать.

Автор:  GameHunter [ Вторник, 31 Декабрь, 2019 23:28 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Вот модуль:
Код:
MODULE Ex;

IMPORT
  C:=Console;

(* PROCEDURE P ( VAR x : RECORD END );
  BEGIN
  END P; *)

BEGIN
  C.String('!!!'); C.Flush();
END Ex.


Он, как и положено, выводит на экран !!!. Однако, если раскомментировать процедуру P, модуль успешно компилируеися, но на экран ничего не выводится. Наверное, какая-то ошибка компилятора.

Автор:  Oleg N. Cher [ Среда, 01 Январь, 2020 16:19 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Эта ошибка исправлена. Спасибо за информацию.

Автор:  GameHunter [ Среда, 01 Январь, 2020 22:33 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Ещё раз про инициализацию переменных.

Вот такой модуль выводит на экран, что переменные ptr и proc процедуры TestStack не инициализированы NIL'ами:

Код:
MODULE Ex;

IMPORT
  C:=Console;

CONST
  NumOfPoints = 1000;

TYPE
  PlugStruct = POINTER TO RECORD
  END;

PROCEDURE PlugProc ();
  BEGIN
  END PlugProc;

PROCEDURE FillStack ();
  VAR
    ptr:ARRAY NumOfPoints OF PlugStruct;
    proc:ARRAY NumOfPoints OF PROCEDURE;
    i:INTEGER;
  BEGIN
    FOR i:=0 TO NumOfPoints-1 DO
      NEW(ptr[i]);
      proc[i]:=PlugProc;
    END;
  END FillStack;

PROCEDURE TestStack ();
  VAR
    ptr:ARRAY NumOfPoints OF PlugStruct;
    proc:ARRAY NumOfPoints OF PROCEDURE;
    i:INTEGER;
  BEGIN
    i:=0;
    WHILE (i<NumOfPoints) & (ptr[i]=NIL) DO
      INC(i);
    END;
    IF i=NumOfPoints THEN
      C.String('All pointers are NILs');
    ELSE
      C.String('Pointer No. '); C.Int(i,0); C.String(' is not NIL');
    END;
    C.Ln();

    i:=0;
    WHILE (i<NumOfPoints) & (proc[i]=NIL) DO
      INC(i);
    END;
    IF i=NumOfPoints THEN
      C.String('All procedures are NILs');
    ELSE
      C.String('Procedure No. '); C.Int(i,0); C.String(' is not NIL');
    END;
    C.Ln();
    C.Flush();
  END TestStack;

BEGIN
  FillStack();
  TestStack();
END Ex.


Этот же модуль в ББ (модифицированный, чтобы выводить результат в лог) показывает, что в ББ эти переменные инициализируются.

Автор:  Oleg N. Cher [ Понедельник, 06 Январь, 2020 17:52 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

GameHunter, а я думал, что по Ofront'у меня уже ничем не удивить. :-)

Да, это действительно такого рода ошибка, которая может породить настоящие наведённые проблемы. Оказывается, Йозеф специально не инициализировал массивы указателей для эффективности кода, Ofront же появился ещё во времена "малых" мощностей. Но сейчас он согласен, что это хорошо бы исправить.

Я взял решение из CPfront, где эта проблема была решена уже давно:


Заодно сделал поддержку OUT-параметров в Компонентном Паскале (режим -C).

И ещё некоторые внутренние изменения структуры компилятора, не очень заметные извне.

Спасибо за то, что Вы с нами, как говорится. :-) Столько уже багов исправили!

Автор:  GameHunter [ Понедельник, 06 Январь, 2020 21:57 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

В c-файлах объявление для локальных переменных процедуры выглядит так:
Код:
void (*prc)(void) = NIL;
struct Ex__2 *ptr = NIL;
void (*arr[10])(void) = {0};
,
а для глобальных переменных модуля - так:
Код:
static void (*Ex_prc)(void);
static struct Ex__1 *Ex_ptr;
static void (*Ex_arr[10])(void);
.
Отсюда вопрос: есть ли инициализация указателей и процедур, если они содержатся в глобальных переменных?

Автор:  Comdiv [ Понедельник, 06 Январь, 2020 22:05 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Да, потому что это задано стандартом Си.
Иногда рекомендуют инициализировать явно, потому что некоторые компиляторы могут нарушать стандарт.

Автор:  Oleg N. Cher [ Вторник, 07 Январь, 2020 12:51 ]
Заголовок сообщения:  Re: Ofront+: транслятор Оберон-языков в Си для ARM, x64 и x8

Да, правильно. Переменные, помеченные static, по стандарту обнуляются.

Страница 6 из 17 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/