По просьбе камрадов попробую описать отличия от оберонов и ответить на вопросы по поводу языка Сириус и компилятора.
Учитывая, что я не Вирт, строгого и понятного изложения не получится.
Что качается самого компилятора, то планируется сделать его общедоступным и открыть исходники, но это будет не раньше осени и только после удаления ряда зависимостей. в паблик пойдёт только компилятор с рантаймом и несколько пакетов, всё остальное, включая среду разработки раскрывать мы не имеем права, а то нас закроют )))
Поддерживаются бакэнды для i386, ARM, Alpha, VAX-11, PDP-11, PPC, AVR32. В паблике будет только i386 и, возможно, ARM и AVR.
Сразу необходимо отметить, что язык и компилятор постоянно развиваются и за 7 лет эксплуатации претерпели значительные изменения.
Никаких оснований для полной совместимости с Оберонами у нас не было и нет, но стандартный Оберон-2 компилируется.
Из отличий - наличие делегатов, специальный объектный тип OBJECT, специальный строковой тип STRING, типы CHAR, WIDECHAR, LONGCHAR,
ключи или модификаторы, которые могут менять поведение некоторых механизмов в блоке, синтаксис и семантика IMPORT заимствована из OO2C, есть SYSTEM.DISPOSE, защищаемые переменные, оператор TYPECAST для приведения типов, модификатор [SAFE/UNSAFE] обеспечивает безопасное или любое приведение типов (по умолчанию безопасное - safe). Синтаксис его соответствует одноветочному WITH со списком приведения:
TYPECAST a:T1, b:T2 DO ... END;
WITH - многоветочный, описан в другой ветке.
Подобный механизм (typecast) очень сильно облегчил нам работу, т.к. в таком блоке нет необходимости в принудительном трехэтажном кастовании при каждом обращении к переменной расширенного типа.
Следующее отличие - возможность уточнения типов аргументов и результата у методов расширенного типа (уточнение должно расширять тип), также в наследниках допустимо уточнение абстрактных типов RECORD и OBJECT, т.е. корректны определения:
R0 = RECORD END;
R1 = RECORD (R0) END;
O0 = OBJECT
PROCEDURE P(a:OBJECT, CONST b:RECORD): OBJECT;
END O0;
O1 = OBJECT (O0)
PROCEDURE P(a:O1, CONST b:R0): O1; //здесь может быть любое уточнение для абстрактных OBJECT и RECORD
END O1;
O2 = OBJECT (O1)
PROCEDURE P(a:O2, CONST b:R1): O2; //здесь уже может быть уточнение только расширения типа
END O2;