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-бит. Ссылка на МультиОберон на гитхабе здесь
|
Автор: | Дмитрий Дагаев [ Суббота, 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 Какая красота! |
Автор: | 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/ |