OberonCore
https://forum.oberoncore.ru/

Omf - МультиОберон для OFront
https://forum.oberoncore.ru/viewtopic.php?f=157&t=6425
Страница 1 из 1

Автор:  Дмитрий Дагаев [ Суббота, 17 Август, 2019 09:30 ]
Заголовок сообщения:  Omf - МультиОберон для OFront

МультиОберон для OFront содержит в себе бэкенд OFront в виде адаптированной к новой структуре версии CPFront https://blackbox.obertone.ru/extension/CPfront.

Omf предназначен для работы:
- из командной строки,
- в среде BlackBox.

Omf работает как с '.odc' файлами, так и с текстовыми файлами '.mod'.

В комплект входят модули системы выполнения (Kernel, ..), позволяющие запускаться как на 32-бит, так и на 64-бит.

Ссылка на МультиОберон на гитхабе здесь

Вложения:
QuickStartOmf_ru.pdf [279.1 КБ]
Скачиваний: 324

Автор:  Дмитрий Дагаев [ Суббота, 17 Август, 2019 13:58 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

Если совсем просто, то после установки можно запустить команду 32-битного приложения:
Код:
Bfwe\OmfSh co OmtestHelloWorld:
Команда осуществляет трансляцию Omtest/Mod/HelloWorld.mod в файл языка C - Omtest/Cfwe/HelloWorld.c.

Либо можно запустить команду 64-битного приложения:
Код:
Bfwr\OmfSh co OmtestHelloWorld:
Команда осуществляет трансляцию Omtest/Mod/HelloWorld.mod в файл языка C - Omtest/Cfwr/HelloWorld.c.

Автор:  Comdiv [ Суббота, 17 Август, 2019 19:24 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

Судя по SYSTEM.c, используется в неизменном виде частично некорректный код деления из CPFront, проблема c которым частично описывалась в теме про целочисленное деление. Например, результат выполнения SYSTEM_DIV(-2147483648, -2) может быть равен -1073741824, но это не единственный возможный результат, учитывая допущения поведения, не определённого в стандарте Си. Oleg-N-Cher сделал более корректную версию для OfrontPlus, хотя и тоже содержащее возможность работы при неопределённом поведении, которое Олег оставил из соображений эффективности и маловероятности наступления.

Автор:  Дмитрий Дагаев [ Суббота, 17 Август, 2019 19:36 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

Данная часть CPFront'a не менялась. Спасибо.

Автор:  Comdiv [ Суббота, 17 Август, 2019 19:50 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

Результаты разных сборок одного кода.
Код:
$ cat div.c

#include <stdio.h>
#include <stdlib.h>

int SYSTEM_DIV(int x, int y)
{
   if (y > 0) {
      if (x < 0) return ~(~x / y);
      else return x / y;
   } else if (y < 0) {
      if (x > 0) return ~((x - 1) / -y);
      else return -x / -y;
   } else {
      abort();
   }
}

int main(void) {
    printf("%d\n", SYSTEM_DIV(-2147483647 - 1, -2));
    return 0;
}
Код:
$ gcc div.c -o div            ; ./div
-1073741824
$ gcc div.c -o div -O2        ; ./div
1073741824
$ gcc div.c -o div -O2 -fwrapv; ./div
-1073741824
$ gcc div.c -o div     -ftrapv; ./div
Аварийный останов (стек памяти сброшен на диск)
$ gcc div.c -o div -O2 -ftrapv; ./div
1073741824

Автор:  Борис Рюмшин [ Суббота, 17 Август, 2019 22:55 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

Comdiv писал(а):
Код:
$ gcc div.c -o div            ; ./div
-1073741824
$ gcc div.c -o div -O2        ; ./div
1073741824
$ gcc div.c -o div -O2 -fwrapv; ./div
-1073741824
$ gcc div.c -o div     -ftrapv; ./div
Аварийный останов (стек памяти сброшен на диск)
$ gcc div.c -o div -O2 -ftrapv; ./div
1073741824

Какая красота! :mrgreen: :roll:

Автор:  Comdiv [ Воскресенье, 18 Август, 2019 15:11 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

Интересно посмотреть на результат выполнения Div(-2147483647 - 1, -2) в МультиОбероне при использовании LLVM с разными настройками
Код:
PROCEDURE Div(a, b: INTEGER): INTEGER;
BEGIN
    RETURN (-a) DIV -b
END Div;

Автор:  Дмитрий Дагаев [ Вторник, 19 Ноябрь, 2019 15:09 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

Comdiv писал(а):
Судя по SYSTEM.c, используется в неизменном виде частично некорректный код деления из CPFront, проблема c которым частично описывалась в теме про целочисленное деление. Например, результат выполнения SYSTEM_DIV(-2147483648, -2) может быть равен -1073741824, но это не единственный возможный результат, учитывая допущения поведения, не определённого в стандарте Си. Oleg-N-Cher сделал более корректную версию для OfrontPlus, хотя и тоже содержащее возможность работы при неопределённом поведении, которое Олег оставил из соображений эффективности и маловероятности наступления.

Привел в соответствие с данной версией, спасибо Олегу Чередниченко за правильный код и Константину Comdiv за исследование проблемы. В LLVM пока не вставлял, еще оставляю себе время подумать, когда подойдет время.

Автор:  Comdiv [ Воскресенье, 08 Декабрь, 2019 19:38 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

Но сохраняется проблема для остатка от деления и деления LONGINT.
Кроме того, вариант Олега не до конца лишён возможности работы при неопределённом поведении в случае переполнения при x=INTEGER_MIN, y=-1. Изначально я предлагал более бескомпромиссный вариант:
Код:
INTEGER SYSTEM_DIV(INTEGER x, INTEGER y) {
   INTEGER r;

   if (y > 0) {
      if (x >= 0) {
         r = x / y;
      } else {
         r = -1 - (-1 - x) / y;
      }
   } else if (y < 0) {
      if (x > 0) {
         r = -1 + (x - 1) / y;
      } else if (x >= -INTEGER_MAX || y != -1) {
         r = x / y;
      } else {
         __HALT(-5);
         r = 0;
      }
   } else {
      __HALT(-5);
      r = 0;
   }
   return r;
}
Если применять транслятор для надёжных решений, лучше не оставлять даже наименьших дыр.
Код я написал чисто умозрительно и не тестировал

Автор:  Дмитрий Дагаев [ Понедельник, 09 Декабрь, 2019 21:09 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

И Ваш вариант был принят без
Код:
} else if (x >= -INTEGER_MAX || y != -1) {
?

Автор:  Comdiv [ Вторник, 10 Декабрь, 2019 00:12 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

Верно. Плюс косметические изменения, вроде множества return.

Автор:  Дмитрий Дагаев [ Среда, 01 Апрель, 2020 10:43 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

Изменения в Omf вносились по результатам обсуждения Ofront+ https://forum.oberoncore.ru/viewtopic.php?f=30&p=111516#p110755.
Они появятся в репозитории в рамках очередной версии МультиОберона

Автор:  Дмитрий Дагаев [ Среда, 02 Декабрь, 2020 10:59 ]
Заголовок сообщения:  Re: Omf - МультиОберон для OFront

В Omf реализована динамическая загрузка объектных модулей.
Код:
Binwe\omfc co OmtestHelloWorld
Binwe\omfc build OmtestHelloWorld
Binwe\omfc run OmtestHelloWorld

Команда co через бэкенд Ofront получает .c .h
Команда build через внешний компилятор из Omf.cfg (gcc или clang) получает .o
Команда run загружает и выполняет OmtestHelloWorld.o

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