Автор Тема: Сириус - обероноподобный язык и компилятор  (Прочитано 75141 раз)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
По просьбе камрадов попробую описать отличия от оберонов и ответить на вопросы по поводу языка Сириус и компилятора.
Учитывая, что я не Вирт, строгого и понятного изложения не получится.
Что качается самого компилятора, то планируется сделать его общедоступным и открыть исходники, но это будет не раньше осени и только после удаления ряда зависимостей. в паблик пойдёт только компилятор с рантаймом и несколько пакетов, всё остальное, включая среду разработки раскрывать мы не имеем права, а то нас закроют )))
Поддерживаются бакэнды для 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;
« Последнее редактирование: Май 04, 2012, 04:02:54 pm от Kemet »

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Наибольший интерес (для нас) представлял именно объектный тип и механизмы связанные с расширением типов.
Реализованный подход (абстрактные типы ОБЪЕКТ и ЗАПИСЬ, возможность уточнения типов аргументов и результата в наследниках, пример выше) позволяет легко строить иерархию типов и, частично, освобождает от необходимости иметь дженерики, которые мы пытались реализовать, но, впоследствии, по некоторым причинам, от них отказались.

Конструкторы начинаются с ключевого слова CONSTRUCTOR и всегда общедоступны.
И объекты и модули, наряду с секцией BEGIN, имеют секцию CLOSE, которая вызывается при финализации объекта/модуля.
BEGIN
  Init;
CLOSE
  Done;
END

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
мы не имеем права, а то нас закроют )))
А можно сразу не скромный вопрос? Вас -- это кого? Расскажите о создателях Сириуса, целях его создания и т.п...

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
А чем ОБЪЕКТ отличается от ЗАПИСИ?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Блок GUARD списокпеременных DO ... END; занимается охраной экземпляров, все изменения указателей на защищаемые переменные замораживается.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
А чем ОБЪЕКТ отличается от ЗАПИСИ?
ОБЪЕКТ (OBJECT) это ссылочный тип, в остальном он подобен POINTER TO RECORD (у нас эапись также может иметь конструктор), за исключением делегатов.
А вообще концепция ОБЪЕКТА здесь ближе к концепции МОДУЛЯ, это так сказать, логически, модули в модуле ) и синтаксис у них практически идентичен, планировалось сделать в объекте секцию импорт где указывать  классы, по отношению к которым объект будет считаться "дружественным" и иметь доступ к приватным членам, но отказались от этого, а также секцию, для определения общих, связанных с типом переменных, но также это не реализовано.

DIzer

  • Гость
Так и думал... TYPECAST - значит эквивалент Паскалевского WITH или нет?  выглядит как охрана по синтакису.... а что разнотипные формальные параметры в процедурах у вас отделяются запятыми?
« Последнее редактирование: Май 04, 2012, 05:18:46 pm от DIzer »

DIzer

  • Гость
нет не соответствует... - вопрос, чем по смыслу (не по синтаксису) отличается от Оберонного  WITH - кроме наличия мультикаста?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Так и думал... TYPECAST - значит эквивалент Паскалевского WITH или нет?  выглядит как охрана по синтакису....
SAFE - перед приведением выполняется проверка типа как во время компиляции (если возможно), так и во время исполнения (одноразово, при входе в блок), UNSAFE режим похож на SYSTEM.VAL - ничего не контролируется при приведении.
Это очень простой каст - сама переменная остается неизменна, т.е. это растянутая в пространстве трактовка типа.
Для преобразования же типов у объектов могут быть соответствующие операторы для конвертации.

а что разнотипные формальные параметры в процедурах у вас отделяются запятыми?
Нет, это мой косяк - там сначала пример был без рекордов, с двумя объектами, а потом я его скопировал чтоб не писать и накопипастил бездумно. Надо бы поправить

DIzer

  • Гость
SAFE - перед приведением выполняется проверка типа как во время компиляции (если возможно), так и во время исполнения (одноразово, при входе в блок), UNSAFE режим похож на SYSTEM.VAL - ничего не контролируется при приведении.
Это очень простой каст - сама переменная остается неизменна, т.е. это растянутая в пространстве трактовка типа.
Для преобразования же типов у объектов могут быть соответствующие операторы для конвертации.

Таки уточните - правильно ли я понял, что TYPECAST с модификатором SAFE делает тоже что фактический (обращаю внимание фактический - не декларированный) WITH в Обероне? - если так, то зачем это нужно? логичнее было бы добавить модификаторы и возможность мультикаста в WITH?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Таки уточните - правильно ли я понял, что TYPECAST с модификатором SAFE делает тоже что фактический (обращаю внимание фактический - не декларированный) WITH в Обероне? - если так, то зачем это нужно? логичнее было бы добавить модификаторы и возможность мультикаста в WITH?
Изначально у нас не было ни WITH, ни TYPECAST, у нас был GUARD, который только замораживал возможность подмены экземпляра, перераспределения памяти и т.п.
На базе этого механизма был сделан WITH - во-первых, как мы его поняли, во-вторых с наименьшими затратами. Ведь WITH в нашей реализации, как я уже писал, основан на механизме GUARD (для защиты типа переменной) и, в тоже время работает с динамическим типом как со статическим, т.е. после входа в WITH уже никаких разыменований указателей не происходит, поскольку WITH получает конкретный адрес переменной и в блоке оперирует уже им.
Т.е., после эпилога, в котором осуществляется настройка, код идентичен тому, как если бы мы смогли определить в блоке статическую запись и работать с ней.

А TYPECAST это просто трактовка типа и ничего более. Да, он проверяет , в сэйврежиме, допустимость приведения, но и только, динамический тип оным и останется.
« Последнее редактирование: Май 04, 2012, 06:16:56 pm от Kemet »

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Т.е., после эпилога, в котором осуществляется настройка, код идентичен тому, как если бы мы смогли определить в блоке статическую запись и работать с ней.
Таки нет, код не совсем идентичен, это не принципиально, да и идентичным его можно сделать, но главное в другом - динамика как статика. И синтаксически и физически.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
А какая логика у TYPECAST UNSAFE если приведение невозможно? Как в додиезовском "as" NIL возвращается?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Вижу.. SYSTEM.VAL
Т.е. реально UNSAFE....
А модули содержащие unsafe код помечаются как-то?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
...динамический тип оным и останется.
Остается каким? Каким был до TYPECAST SAFE?
Если так то DIzer правильно заметил, что это в точности WITH получается