OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 24 Июль, 2021 05:44

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Общее ПО Рантайма
СообщениеДобавлено: Суббота, 17 Август, 2019 18:52 

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: OLog вариативность логов
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 11:10 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 558
Откуда: Москва
Для портабельного лога выдвигались следующие требования:
    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).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Общее ПО Рантайма
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 11:21 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Общее ПО Рантайма
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 11:35 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Общее ПО Рантайма
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2019 11:42 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 558
Откуда: Москва
Вариант с LLVM не зависим от Log, но реализация Strings и печати Char там другая.
Код:
MODULE HostConLog;

PROCEDURE SpecChar (ch: CHAR);
    VAR tmp: INTEGER;
BEGIN
    tmp := Api.putchar(ORD(ch))
END SpecChar;


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

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


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

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


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

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