Модульные системы
80 subscribers
31 photos
18 videos
9 files
110 links
Всё об истории и эволюции модульного программного обеспечения и надёжных программных систем
Download Telegram
Появился новый проект компилятора. Ожидается поддержка кросс-компиляции с языков Oberon, Oberon-2 и Active Oberon в рамках одного компилятора. Предполагается написание самого компилятора на языке Rust, а библиотеки на языке Active Oberon. Пока разработка находится в самой начальной стадии, опубликован лишь начальный код сканера для Active Oberon. Проект, теоретически, может дать хороший толчок развитию кода библиотеки системы A2. С интересом проследим за развитием данного проекта

| ОС A2 | Модульные системы | Вики |
👍6
Часто задают вопросы по установке системы A2 на компьютер.
Но самым быстрым и рекомендованным способом ознакомиться с системой будет её запуск в виде приложения под Windows / Linux. В таком варианте можно будет практически всё запускать, писать и компилировать программы, за исключением частей взаимодействующих непосредственно с оборудованием. Для этого достаточно клонировать основной репозиторий разработки себе на компьютер и из него распаковать соответствующую сборку из zip архивов на выбор: Linux32, Linux64, LinuxARM, Win32 и Win64.
После первоначального знакомства с системой можно будет из любой из этих сборок собственноручно собрать нативный образ системы в вариантах загрузки с: ISO, ISO (мини), HDD и USB.
Команды для сборки нативных образов находятся в
data/Build.Tool

Нужно просто создать папку для выходных файлов и выполнить команды по шагам: 1, 2, 3a / 3b / 3c / 3d.
Видео установки A2 ISO в QEMU

| ОС A2 | Модульные системы | Вики |
👍6
Судя по приведённому примеру для "проблемы" Java, в ней вообще всё плохо...
Похоже, разработчики Java не понимают, что такое полиморфизм.
Перепишем код на Active Oberon:
module vehicles;
type
Vehicle = object
end Vehicle;
Car = object(Vehicle)
end Car;
Bus = object(Vehicle)
end Bus;
var
c : pointer to array of Car;
v : pointer to array of Vehicle;
begin
new(c, 1);
c[0] := new Car();
(* v := c; *) (* incompatible assignment *)
new(v, 1);
v[0] := new Bus();
end vehicles.

Присвоение v := c в AO невозможно, так как v и c разных типов. Компилятор выдаст incompatible assignment.
А присвоение v[0] := new Bus() вполне законно, так как Bus является расширением типа Vehicle.
Ваша Java сломалась, несите другую 😂

PS. Как оказалось, полиморфизм тут ни при чём, а проблема в том, что Java сложно устроена "под капотом". Виновники: ковариантность массивов в Java и то, что в строчке  Vehicle[] v = c; "затёрся" изначальный тип массива.
Где сложно всё устроено, там ненадёжно

| ОС A2 | Модульные системы | Вики |
🔥3👍1
Из диссертации Питера Мюллера 2002-го года. Сравнение накладных расходов на выполнение минимального системного вызова в A2 (тогда она называлась Aos) и Linux.
В A2 системный вызов дешевле в 30 раз!

| ОС A2 | Модульные системы | Вики |
🔥3
Можно, не значит нужно...)
Я тут подумал... а зачем в дженерики прямо в параметрах, помимо типов, передавать и функции сравнения, в том числе?
Всё же можно сделать значительно проще. Параметризовать лишь типами ключа и значения (а функции сравнения и вычисления хеш кода передавать непосредственно в инициализатор конкретного контейнера).
И тогда имена параметризованных модулей становятся значительно короче, и необходимость снятия ограничений на длину имён в системе уже не будет столь критична. Во всяком случае, она уже не блокирует возможность использовать дженерики.
Тесты проходят. Думаю, в ближайшее время можно будет отправить изменения в репозиторий.
Вот, на примере теста Hash контейнера можно видеть, как будет выглядеть код с использованием дженериков:
MODULE Test;

IMPORT
Random, SizeGenerics := Generics(SIZE, SIZE);

PROCEDURE Less(l, r: SIZE): BOOLEAN;
BEGIN RETURN l < r END Less;
PROCEDURE HashCode(k: SIZE): SIZE;
BEGIN RETURN k END HashCode;

PROCEDURE Hash;
VAR
vector: SizeGenerics.Vector;
hash: SizeGenerics.Hash;
rand: Random.Generator;
i, n, key, val: SIZE;
bOk: BOOLEAN;
BEGIN
n := 100;
NEW(vector, Less);
NEW(hash, Less, HashCode);
NEW(rand);
ASSERT((vector # NIL) & (hash # NIL) & (rand # NIL));
FOR i := 0 TO n - 1 DO
key := rand.Dice(SIGNED32(10 * n));
IGNORE vector.Add(key);
IF ~hash.Contains(key) THEN
hash.Add(key, key)
END
END;
FOR i := 0 TO vector.Count() - 1 DO
vector.Get(i, key);
ASSERT(hash.Get(key, val));
ASSERT(key = val)
END
END Hash;

BEGIN
Hash
END Test.


| ОС A2 | Модульные системы | Вики |
Forwarded from BlackBox Oberon
С 13 ноября начинается онлайн конференция «Неделя Оберона».

Завтра в 20.00 (GMT+3) состоится первая сессия в формате круглого стола, где участники обсудят варианты применения Оберона для веб-разработки. Ожидаются участники: Артур Ефимов (движок для сайтов на Обероне-07), Антон Шелин (подсистема Crypto), Иван Денисов (как работает мультиязычный сайт oberon.org на Блэкбоксе).

Для участия в конференции, подключайтесь по ссылке:
https://meet.oberon.org/week

Мы рекомендуем использовать браузер Chrome или Chromium для подключения, либо специальное приложение для телефона:
https://play.google.com/store/apps/details?id=org.jitsi.meet
https://apps.apple.com/us/app/jitsi-meet/id1165103905
Solving_the_structured_control_flow_problem_once_and_for_all_by.mhtml
340.5 KB
Исходные предпосылки данной статьи напомнили один из приёмов представления ДРАКОН-схем силуэт в виде кода с циклом, внутри которого огромный case (switch). Оказывается, для оптимизации подобного кода придуман алгоритм Stackifier. Видимо, и из ДРАКОН-схем можно оптимальный код генерировать. А статьи на сайтах я, лично, люблю в mhtml сохранять, для лучшей сохранности :)

| ОС A2 | Модульные системы | Вики |
Хороший пример обобщённого LIFO стека на базе связного списка массивов фиксированной длины.
Обобщённый модуль:
MODULE Stacks(TYPE T);

TYPE
P = POINTER TO R;
R = RECORD a: ARRAY 16 OF T; next: P END;

Stack* = OBJECT
VAR
vals: P;
count: SIZE;

PROCEDURE &New*();
BEGIN
Reset()
END New;

PROCEDURE Reset*();
BEGIN
count := 0;
vals := NIL
END Reset;

PROCEDURE Count*(): SIZE;
BEGIN
RETURN count
END Count;

PROCEDURE Push*(val: T);
VAR p: P; i: SIZE;
BEGIN
i := count MOD LEN(vals.a);
INC(count);
IF i = 0 THEN
NEW(p);
p.next := vals;
vals := p
END;
vals.a[i] := val
END Push;

PROCEDURE Pop*(VAR val: T): BOOLEAN;
VAR ok: BOOLEAN; i: SIZE;
BEGIN
i := count;
ok := i > 0;
IF ok THEN
DEC(i); count := i;
i := i MOD LEN(vals.a);
val := vals.a[i];
IF i = 0 THEN
vals := vals.next
END
END;
RETURN ok
END Pop;

END Stack;

END Stacks.

Использование:
MODULE StacksUse;

IMPORT Commands, Strings,
StrStacks := Stacks(Strings.String),
IntStacks := Stacks(INTEGER);

PROCEDURE Do*;
VAR
context : Commands.Context;
strStack : StrStacks.Stack;
intStack : IntStacks.Stack;
str : Strings.String;
int : INTEGER;
BEGIN
context := Commands.GetContext();
context.out.Ln;
NEW(strStack);
strStack.Push(Strings.NewString("One"));
strStack.Push(Strings.NewString("Two"));
strStack.Push(Strings.NewString("Three"));
WHILE strStack.Pop(str) & (str # NIL) DO
context.out.String(str^);
context.out.Ln
END;
NEW(intStack);
intStack.Push(1);
intStack.Push(2);
intStack.Push(3);
WHILE intStack.Pop(int) DO
context.out.Int(int, 0);
context.out.Ln
END
END Do;

END StacksUse.

StacksUse.Do ~
System.Free StacksUse Stacks(Strings_String) Stacks(@Integer32) ~


| ОС A2 | Модульные системы | Вики |
👍4
Forwarded from BlackBox Oberon
Дорогие подписчики, напоминаю, что наш проект клуба oberon.org предполагает, что вы можете получить бесконечный домен для своего оберон-проекта, сделав единоразовое пожертвование на продление нашего основного домена в размере 1000 рублей. Каждый год напоминаю про такую возможность, когда делаю продление OBERON.ORG. По этому вопросу пишите в личку @iadenisov или на почту iadenisov@oberon.org
Отдел кибер-безопасности при Белом Доме ONCD (The White House Office of the National Cyber Director) решил поставить жирную точку в истории языков Си/Си++. Выпущен финальный отчёт, в котором данные языки признаны небезопасными. Их использование связано с серьёзными уязвимостями.

| ОС A2 | Модульные системы | Вики |
👍3
Forwarded from OberonCore
С Днём космонавтики!
🔥10
Возможный претендент на дополнение OpenGL стека в A2, в дополнение к существующим биндингам для Win/Lin/Mac
https://t.me/A2OperatingSystem/22173

| ОС A2 | Модульные системы | Вики |
This media is not supported in your browser
VIEW IN TELEGRAM
Шелия Губерман о машине Цетлина
Михаил Львович Цетлин (1924—1966) — советский математик. Крупный учёный и выдающийся инженер, много сделавший в таких разных областях, как математика, физика, биология и медицина. Открыл новое продуктивное научное направление — коллективное поведение автоматов.


| ОС A2 | Модульные системы | Вики |
👍2