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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Следующее отличие - возможность уточнения типов аргументов и результата у методов расширенного типа (уточнение должно расширять тип)

С результатом все понятно (в С++ это называется ковариантным возвращаемым типом). А вот с аргументами непонятно. Что происходит при вызове метода через базу с неправильными аргументами?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Что значит "неправильными"?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Что значит "неправильными"?

Аргумент является объектом базового класса или наследником по другой ветке.

Иерархия:
A -> B
A -> C

Уточняемая перегружаемая функция:
f(A) -> f(B)

Вызов через базовый класс:
f(a) -> ?
f(c) -> ?

DIzer

  • Гость
Вопрос -дырка в GK описанная в соседней ветке имеет место быть в Сириусе?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Что значит "неправильными"?

Аргумент является объектом базового класса или наследником по другой ветке.

Иерархия:
A -> B
A -> C

Уточняемая перегружаемая функция:
f(A) -> f(B)

Вызов через базовый класс:
f(a) -> ?
f(c) -> ?
В Сириусе нет перегрузки методов.
Переопределение метода с уточнением типов возможно только в плане расширения типов.
Т.е., если у нас есть:

TYPE
  X = OBJECT END X;
  Y = OBJECT (X) END Y;
  Z = OBJECT (X) END Z;

  OX = OBJECT
    PROCEDURE f (a : X );
  END O;

  OY = OBJECT
    PROCEDURE f (a : Y );
  END OY;

  OZ = OBJECT
    PROCEDURE f (a : Z );
  END OZ;
Для OY вызов f(X) недопустим - метода с такой сигнатурой у объекта OY нет - он расширен, а тип X несовместим с расширенным Y. Поэтому неоднозначности не возникает. Вызовы OY.f(Z), OZ.f(X) невозможны по причине несовместимости Y и Z.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Вопрос -дырка в GK описанная в соседней ветке имеет место быть в Сириусе?
Какая именно дырка?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Т.к. отсутствует возможность отредактировать сообщение, вышеприведенный код следует читать так:
  OX = OBJECT

  OY = OBJECT (OX)

  OZ = OBJECT (OX)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Всё ж таки прошу модератора внести исправления

DIzer

  • Гость
Вопрос -дырка в GK описанная в соседней ветке имеет место быть в Сириусе?
Какая именно дырка?
http://oberspace.dyndns.org/index.php/topic,229.msg5688.html#msg5688

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Вопрос -дырка в GK описанная в соседней ветке имеет место быть в Сириусе?
Какая именно дырка?
http://oberspace.dyndns.org/index.php/topic,229.msg5688.html#msg5688
При передаче ссылки на элемент динамического типа (элемент динамического массива, поле записи или объекта) осуществляется охрана экземпляра. Поэтому в Сириусе такой проблемы нет.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
В Сириусе нет перегрузки методов.

В смысле "PROCEDURE f" в примере - не виртуальная? А зачем такие одноименные методы вообще нужны в наследниках?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
2Vlad,
это остатки обобщенного программирования  :( :-X
Большая Комиссия решила, что обобщенное программирование нарушает Гармонию Единства формы и содержания, но были отмечены и положительные моменты, которые им хотелось бы иметь, не сильно изменяя компилятор и язык - сильно их напрягают новые ключевые слова и интеллектуальность компиляторов, да и программисту жизнь не должна малиной казаться, иначе за что им зарплату платить.
В результате получилось то, что получилось, но хоть не весь код пришлось выбросить.
В текущей реализации уточнения (расширения) методов есть два подхода:
1) Уточнить МОЖНО любой метод базового типа, при условии, что в базовом типе отсутствует вызов этого метода, что контролируется компилятором - подобный метод используется разработчиками основного заказчика и именно так было сформулировано ТЗ при исключении механизмов обобщенного программирования.

2) Основанный на модификаторе EXTENSIBLE (procedure [extensible] f(a:object). В данном случае метод, объявленный как extensible, ДОЛЖЕН быть переопределён и расширен(уточнён) в потомке или объявлен как extensible. Методы с модификатором extensible (как и методы объявленные с ключевым словом abstract (procedure f(); abstract;) являются абстрактными и их непосредственный вызов запрещён. Объекты, у которых есть абстрактные методы является абстрактным, со всеми вытекающими из этого особенностями. Тогда как при первом методе все объекты считаются реализованными.
Мы в своих разработках используем только второй подход.

К сожалению, в отличии от обобщенного программирования, никаких средств (за исключением необходимости реализовать все абстрактные и расширяемые методы) проверки полноты и целостности реализации типа(пресловутой герметичности)  нет. Но его нет и при обычном проектировании объекта - ничего, кроме здравого смысла.
Вероятно либо нужно вернуть обобщенку либо както совместить с ней.
К тому же я думаю, что первый подход нужно вообще выпилить из компилятора
« Последнее редактирование: Май 10, 2012, 09:46:12 am от Kemet »

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
В процессе портирования Sirius.Core и Sirius.Framework на ActiveOberon пришёл к выводу, что наличие механизмов обобщенного программирования в ООП вызывает атрофию мозга ))) - сильно меняет стиль мышления - т.к. практически исключает задачу декомпозиции классов, сводя её, по сути, к декомпозиции алгоритмов.
В результате - полчаса пялился в экран, пытаясь портировать с Сириуса на Активный Оберон DoubleLinkedList и производные классы, пока не понял, что наследование не выйдет и получатся самостоятельные классы и придётся копипастить кучу кода (((, а потом переписывать те участки фреймворка, где используются эти классы и подразумевается, что они совместимы сверху вниз (((

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
В Сириусе цикл WHILE имеет форму

WHILE  Condition DO
  Statements
ELSE
  Statements
CLOSE
  Statements
END;

Ну секция CLOSE ладно, но без ELSE  приходится переписывать код и логику перепроверять, в результате переписанный код, с вынесенной за пределы WHILE  секцией выглядит негармоничным

DIzer

  • Гость
В Сириусе цикл WHILE имеет форму

WHILE  Condition DO
  Statements
ELSE
  Statements
CLOSE
  Statements
END;

Ну секция CLOSE ладно, но без ELSE  приходится переписывать код и логику перепроверять, в результате переписанный код, с вынесенной за пределы WHILE  секцией выглядит негармоничным

А смысл  этой конструкции? - я не знаю языка Сириус но семантически эквивалентный вариант Оберона навскидку
.......
IF Condition THEN 
WHILE  Condition DO
...
END ElSE
WHILE ~Condition DO
...
END
END
CLOSE STATEMENTS
......
Если суть правильна... то форумчане. вопрос? насколько востребован такой сахарок - ИМХО редкий гость в практике - у меня  за 18 лет ОСОЗНАННОГО программирования ни разу. не возникала в нем потребность....
« Последнее редактирование: Май 20, 2012, 06:21:11 pm от DIzer »