OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 18 Январь, 2020 08:33

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




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

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

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

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

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

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


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

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


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

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


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 993
Откуда: Киев
Результаты разных сборок одного кода.
Код:
$ 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
Сообщения: 4391
Откуда: Россия, Орёл
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
Сообщения: 993
Откуда: Киев
Интересно посмотреть на результат выполнения 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
Сообщения: 413
Откуда: Москва
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
Сообщения: 993
Откуда: Киев
Но сохраняется проблема для остатка от деления и деления 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
Сообщения: 413
Откуда: Москва
И Ваш вариант был принят без
Код:
} else if (x >= -INTEGER_MAX || y != -1) {
?


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

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


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

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


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

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


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

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