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 вариативность логов

Для портабельного лога выдвигались следующие требования:
    1. возможность работы через Log в системе BlackBox (win/lin)
    2. отсутствие зависимости от будущего возможного расширения центром интерфейса лога
    3. возможность реализации консольного лога с опусканием ненужных для консоли деталей
    4. возможность добавления новой функциональности (OLog.SString, OLog.Adr)

В качестве решения я отказался от расширения типов с 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/