OberonCore https://forum.oberoncore.ru/ |
|
Общее ПО Рантайма https://forum.oberoncore.ru/viewtopic.php?f=157&t=6428 |
Страница 1 из 1 |
Автор: | Дмитрий Дагаев [ Суббота, 17 Август, 2019 18:52 ] |
Заголовок сообщения: | Общее ПО Рантайма |
Рассмотрим самый простой пример - Hello, World Код: MODULE OmtestHelloWorld; IMPORT Runner, OLog; PROCEDURE Run*; BEGIN OLog.String("Hellow, World"); OLog.Ln; END Run; BEGIN Runner.SetRun(Run) END OmtestHelloWorld. Здесь используются новые модули Runner и OLog. OLog появился из-за необходимости отстроиться от вариантов логов в разных системах: Log, Console, Out, и т.п. OLog тут свой, для разных рантаймов он разный. Можно сравнить разные варианты, например в System/Mfwr для OFront и System/Mlwe для LLVM. Runner представляет собой привязку к процессу. Он определяет, как запущен процесс: консольное ли приложение или из среды BlackBox, и с какими опциями командной строки. Также там имеются выходы с кодами возврата и обработка трапов и сигналов. Runner разный для разных рантаймов. Kernel присутствует неявно, его импортирует Runner. В данных реализациях, наиболее близких к BlackBox, в Kernel осуществляется выделение динамической памяти и сборка мусора. Естественно, сборщики мусора для 64-битной версии отличаются от 32-битной, хотя по алгоритмам это - одно и то же. |
Автор: | Дмитрий Дагаев [ Суббота, 17 Август, 2019 19:11 ] |
Заголовок сообщения: | Соглашение об именах |
В проекте MultiOberon используются более определенные соглашения об именах. Константы обозначаются заглавными буквами с разделителями символами подчеркивания. При этом первая буква может быть строчной. Код: CONST илиvTIMES = 1; vSLASH = 2; vDIV = 3; vMOD = 4; vTHIS_RECFN = 45; vTHIS_ARRFN = 46; Код: CONST SYS_TYPE_DESC* = 1; SYS_MOD_DESC* = 2; SYS_DIR_DESC* = 3; SYS_OBJ_DESC* = 4; Глобальные переменные записываются "верблюдом" с первой строчной буквы Код: VAR setTypeForm-, setTypeSize-: SHORTINT; Остальные переменные не имеют заглавных букв. Такой текст получился, ИМХО, более читабельным, чем исходные тексты DevCompiler и OFront. |
Автор: | Дмитрий Дагаев [ Воскресенье, 22 Декабрь, 2019 11:10 ] |
Заголовок сообщения: | OLog вариативность логов |
Для портабельного лога выдвигались следующие требования:
В качестве решения я отказался от расширения типов с Type-Bound Procedures, на котором реализованы Log, StdLog. Наследование от Log наложило бы на меня обязательства по реализации всех методов (например, Log.View, Log.ParamMsg), что противоречит п.3. Для консоли печатать вьюшки не надо. Более того, с учетом того, что BlackBox разрабатывается центром, никто не застрахован от изменения интерфейсов центром, как это уже произошло с Files. В таком случае мне нужно будет тащить реализации всех интерфейсов. Основная идея была о замене наследования инкапсуляцией. Для Мультиоберона появились платформо-зависимые версии OLog, версия для BlackBox работает как обертка над Log (требование п.3). Реализация модуля OLog выполнена в виде набора указателей на функции с процедурой инсталляции. Таким образом, для новой функциональности (п.4) добавлялись указатели на функции (например, OLog.SString, OLog.Adr). |
Автор: | Дмитрий Дагаев [ Воскресенье, 22 Декабрь, 2019 11:21 ] |
Заголовок сообщения: | Re: Общее ПО Рантайма |
Версия для BlackBox в сокращенном виде Код: MODULE OLog; IMPORT Log, SYSTEM, OStrings; TYPE Proc* = PROCEDURE; StringProc* = PROCEDURE (str: ARRAY OF CHAR); SStringProc* = PROCEDURE (str: ARRAY OF SHORTCHAR); AdrProc* = PROCEDURE (x: SYSTEM.PTR); VAR Ln-: Proc; String-: StringProc; SString-: SStringProc; Adr-: AdrProc; PROCEDURE SetProcs* (...); PROCEDURE Init; BEGIN SetProcs(Log.ClearBuf, Log.FlushBuf, Log.Beep, Log.Char, StdLInt, Log.Real, Log.String, StdSString, StdUSString, Log.Bool, Log.Set, StdLIntForm, Log.RealForm, Log.Tab, Log.Ln, StdAdr) END Init; Обращение к логу стандартное OLog.String("long");OLog.String("short");OLog.Adr(pointer_to);OLog.Ln; Данная версия использует в качестве реализации функции Log.String, Log.Char, Log.Ln. |
Автор: | Дмитрий Дагаев [ Воскресенье, 22 Декабрь, 2019 11:35 ] |
Заголовок сообщения: | Re: Общее ПО Рантайма |
Версия для OFront другая, Log не использует. Код: MODULE OLog; IMPORT SYSTEM, OStrings; TYPE Proc* = PROCEDURE; StringProc* = PROCEDURE (str: ARRAY OF CHAR); SStringProc* = PROCEDURE (str: ARRAY OF SHORTCHAR); AdrProc* = PROCEDURE (x: SYSTEM.PTR); VAR Ln-: Proc; String-: StringProc; SString-: SStringProc; Adr-: AdrProc; PROCEDURE SetProcs* (...); PROCEDURE \[code\] CChar (ch: CHAR) 'putchar((int)ch)'; PROCEDURE \[code\] CLn "putchar((int)'\n')"; PROCEDURE \[code\] CFlush 'fflush(stdout)'; PROCEDURE SpecChar (ch: CHAR); BEGIN CChar(ch) END SpecChar; PROCEDURE SpecString (str: ARRAY OF CHAR); VAR j: INTEGER; BEGIN j := 0; WHILE str[j] # 0X DO Char(str[j]); INC(j) END; END SpecString; PROCEDURE SpecSString (str: ARRAY OF SHORTCHAR); VAR j: INTEGER; BEGIN j := 0; WHILE str[j] # 0X DO Char(str[j]); INC(j) END; END SpecSString; PROCEDURE Init; BEGIN SetProcs(Empty, SpecFlush, StdBeep, SpecChar, StdLInt, StdReal, SpecString, SpecSString, StdUSString, StdBool, StdSet, StdLIntForm, StdRealForm, StdTab, SpecLn, StdAdr) END Init; В качестве реализации уже другие функции SpecString, SpecSString, SpecLn. При этом подключается еще модуль реализации HostConLog, который переопределяет функцию SpecChar в смысле локализации Код: MODULE HostConLog;
PROCEDURE \[code\] CChar (ch: CHAR) 'putchar((int)ch)'; PROCEDURE \[code\] CConv (ca: ARRAY OF CHAR; sca: ARRAY OF SHORTCHAR) 'CharToOemW(ca, sca)'; PROCEDURE SpecChar (ch: CHAR); BEGIN cStr[0] := ch; scStr[1] := 0X; CConv(cStr, scStr); CChar(scStr[0]); IF scStr[1] # 0X THEN CChar(scStr[0]) END END SpecChar; |
Автор: | Дмитрий Дагаев [ Воскресенье, 22 Декабрь, 2019 11:42 ] |
Заголовок сообщения: | Re: Общее ПО Рантайма |
Вариант с LLVM не зависим от Log, но реализация Strings и печати Char там другая. Код: MODULE HostConLog;
PROCEDURE SpecChar (ch: CHAR); VAR tmp: INTEGER; BEGIN tmp := Api.putchar(ORD(ch)) END SpecChar; |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |