OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 18:03

Часовой пояс: UTC + 3 часа




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

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
МультиОберон для OFront содержит в себе бэкенд OFront в виде адаптированной к новой структуре версии CPFront https://blackbox.obertone.ru/extension/CPfront.

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

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

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

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


Вложения:
QuickStartOmf_ru.pdf [279.1 КБ]
Скачиваний: 324
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Omf - МультиОберон для OFront
СообщениеДобавлено: Суббота, 17 Август, 2019 13:58 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Если совсем просто, то после установки можно запустить команду 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.


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

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


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

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Данная часть CPFront'a не менялась. Спасибо.


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Результаты разных сборок одного кода.
Код:
$ 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Omf - МультиОберон для OFront
СообщениеДобавлено: Суббота, 17 Август, 2019 22:55 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
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:


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Omf - МультиОберон для OFront
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 15:09 

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

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


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Но сохраняется проблема для остатка от деления и деления 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;
}
Если применять транслятор для надёжных решений, лучше не оставлять даже наименьших дыр.
Код я написал чисто умозрительно и не тестировал


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Omf - МультиОберон для OFront
СообщениеДобавлено: Понедельник, 09 Декабрь, 2019 21:09 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
И Ваш вариант был принят без
Код:
} else if (x >= -INTEGER_MAX || y != -1) {
?


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Верно. Плюс косметические изменения, вроде множества return.


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Omf - МультиОберон для OFront
СообщениеДобавлено: Среда, 02 Декабрь, 2020 10:59 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
В 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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB