OberonCore
https://forum.oberoncore.ru/

Понятие модульности
https://forum.oberoncore.ru/viewtopic.php?f=6&t=521
Страница 1 из 2

Автор:  Vlad [ Пятница, 08 Июнь, 2007 06:15 ]
Заголовок сообщения: 

Trurl писал(а):
Некоторые ассоциации возникают


Мне сразу вспомнился флейм про "истинно модульные системы"...

Автор:  Илья Ермаков [ Пятница, 08 Июнь, 2007 13:01 ]
Заголовок сообщения: 

В чем флейм-то? :-) Ну, не использует mainstream модульных архитектур, использует только модульную декомпозицию, не более, а архитектура на чистом ООП.. Отсюда и все споры типа "а у нас тоже модули есть". Есть-то есть, да не до конца модули, и едите их не с тем, с чем мы :-)

Автор:  Vlad [ Пятница, 08 Июнь, 2007 13:34 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
В чем флейм-то? :-)


Флейм о том, что "модуль" в общепринятом понимании это нифига не "модуль". Вместо того, чтобы просто обозначить отличия "обероновских модулей" от "общепринятых".

Автор:  PGR [ Пятница, 08 Июнь, 2007 14:17 ]
Заголовок сообщения: 

Vlad писал(а):
Флейм о том, что "модуль" в общепринятом понимании это нифига не "модуль". Вместо того, чтобы просто обозначить отличия "обероновских модулей" от "общепринятых".

И называть их по-другому -- "динамические модули".

Автор:  Илья Ермаков [ Пятница, 08 Июнь, 2007 15:01 ]
Заголовок сообщения: 

Динамические - не единственное отличие. Я могу собрать Оберон-систему статически, но архитектура ее не изменится - она останется построенной на отношениях модулей как основной единицы...
И такое понятие модуля существует уже с 80-го года, со времен появления MESA, Modula, Ada (еще Cedar, кажется). А общепринятое понимание, в общем-то, сводится к древнему-древнему "модуль - это независимый кусок кода".

Автор:  Илья Ермаков [ Пятница, 08 Июнь, 2007 15:05 ]
Заголовок сообщения: 

Сам термин-то не чисто программистский, он пришел из железной инженерии. Постепенно стали пытаться "модуляризовать" и программы. По мере роста успешности этих попыток эволюционировало и понятие "модуль". И понимание модуля, принятое в модульных языках, полностью соответствует общетехническому пониманию.

Автор:  PGR [ Пятница, 08 Июнь, 2007 21:06 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Динамические - не единственное отличие. Я могу собрать Оберон-систему статически, но архитектура ее не изменится - она останется построенной на отношениях модулей как основной единицы...

Не единственное, но основное. Или обероновские модули в чём-то ещё существенно отличаются от модулей Modula-2, Ada, Delphi ?

Автор:  Илья Ермаков [ Пятница, 08 Июнь, 2007 22:27 ]
Заголовок сообщения: 

От Modula-2 и Ada - нет. От Дельфи - по совокупности средств языка, ориентированных на модульное программирование - уже отличается. Дельфа заточена на ООП-архитектуру, притянута "за уши" к С++... Хотя бы только динамическое ООП - уже накладывает свои отпечатки. Message Bus в Delphi не сделаешь...
А вообще, я и говорю об оличиях не именно и конкретно обероновских модулей, а об отличиях модулей модульных языков от всех остальных...

Автор:  PGR [ Пятница, 08 Июнь, 2007 23:01 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Дельфа заточена на ООП-архитектуру, притянута "за уши" к С++... Хотя бы только динамическое ООП - уже накладывает свои отпечатки. Message Bus в Delphi не сделаешь...

Нединамическое ООП тоже есть -- object. А что мешает реализовать Message Bus ?

Автор:  Илья Ермаков [ Пятница, 08 Июнь, 2007 23:21 ]
Заголовок сообщения: 

? Сразу и не понял, про что. object, волочащийся в "режиме совместимости" из Турбо Паскаля? А его кто-то еще всерьез использует?
Ну, а где тогда взять аналог WITH, его вообще нет ни в одном из известных языков... Просто потому, что такое использование ООП и не предполагалось.
Особенно если учесть тот тонкий момент, что WITH - это не только селектор типа, а, как мы тут недавно открыли, в общем виде- селектор пар соответствий "экземпляр-тип".

Речь не о том "можно воспроизвести или нет", речь о том - удобно ли для систематического использования... И тут в Обероне, даже применительно к той же шине - столько мелочей... IN/OUT, экспорт отдельных полей только для чтения. Еще в КП, например, интересные возможности дает LIMITED - никто, кроме модуля-объявителя, не сможет рассылать сообщения LIMITED-типа - безопасность, опять же... Ну и т.д. и т.п.

Автор:  PGR [ Суббота, 09 Июнь, 2007 00:05 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Сразу и не понял, про что. object, волочащийся в "режиме совместимости" из Турбо Паскаля? А его кто-то еще всерьез использует?

Думаю нет. Просто пример того, что в Delphi не только динамическое ООП... Или под динамическим ООП имелось в виду что-то другое?
Илья Ермаков писал(а):
Ну, а где тогда взять аналог WITH, его вообще нет ни в одном из известных языков...

Действительно удобная штука. Как его ещё не стянули в другие языки...
Илья Ермаков писал(а):
Речь не о том "можно воспроизвести или нет", речь о том - удобно ли для систематического использования...

Согласен. В Delphi удобно не получится. Но речь шла о принципиальной возможности:
Цитата:
Message Bus в Delphi не сделаешь...

Автор:  Сергей Губанов [ Суббота, 09 Июнь, 2007 10:46 ]
Заголовок сообщения: 

PGR писал(а):
Или обероновские модули в чём-то ещё существенно отличаются от модулей Modula-2, Ada, Delphi?

Не знаю как в Modula-2 и Ada, но в Delphi конструкция unit в обероновском смысле модулем не являются потому, что не являются динамически загружаемой и выгружаемой единицей исполнения. С другой стороны дельфийский unit нельзя назвать просто куском текста. Вобщем, борландовцы сочиняя unit остановились в одном шаге от полноценного модуля.

Автор:  Илья Ермаков [ Суббота, 09 Июнь, 2007 11:00 ]
Заголовок сообщения: 

Сергей, и все же нельзя считать динамическую загрузку собственным качеством самого модуля. Это - свойство реализации, которое возможно в современных компонентных модульных системах.
Я уже привел пример - "модульная архитектура". Она становится модульной еще до существования реально написанного и загружающегося модуля. Она делает возможным компонентность - т.е. динамическую загрузку. Но в итоге я могу собрать тот же Блэкбокс статически - но его архитектура от этого не изменится, она останется модульной.
Т.е. компонентность является следствием модульности.

Автор:  Илья Ермаков [ Суббота, 09 Июнь, 2007 11:06 ]
Заголовок сообщения: 

PGR писал(а):
Илья Ермаков писал(а):
Ну, а где тогда взять аналог WITH, его вообще нет ни в одном из известных языков...

Действительно удобная штука. Как его ещё не стянули в другие языки...

Не все так просто - WITH тесно завязан на рантайм и теги типов. Теговый рантайм Оберонов изначально продумывался для того, чтобы обеспечить максимально эффективный IS/WITH, который выполнялся бы за одно сравнение (для этого тег каждого типа знает свой уровень в иерархии и непосредственно индексирует тег предков).
Т.е. даже в критичном по быстродействию коде можно писать типизированные селекторы WITH, а не пытаться экономить на не-ОО варианте с явным полем типа и CASE - WITH будет выполняться практически так же, как и CASE.

Если вы в С++ напишете цепочку if с dynamic_cast, это будет шуровать гораздо медленней. Как и RTTI в Дельфи. Просто потому, в первом RTTI появился очень поздно и во многих реализациях не особо-то и развит до сих пор. А во втором ООП на динамических экземплярах, и никому и в голову не придет использовать объекты для передачи сообщений, да еще и разбор типа через RTTI... Т.е. не ввели WITH просто потому, что не готовы к его использованию.

Автор:  Сергей Губанов [ Суббота, 09 Июнь, 2007 15:32 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Сергей, и все же нельзя считать динамическую загрузку собственным качеством самого модуля.

Модуль Stores на Delphi не напишешь.

(* Я на Delphi хоть и писал его аналог, но он, разумеется, умел загружать только объекты известные на момент компиляции программы. Они в секции инициализации своих юнитов регистрировали свои конструкторы в юните Stores. *)

Автор:  Илья Ермаков [ Суббота, 09 Июнь, 2007 16:01 ]
Заголовок сообщения: 

Сергей, но ведь Stores, вообще говоря, завязан не на динамическую модульность, а на метапрограммирование... Ему безотносительно, где находится тип, экземпляр которого он считывает - в отдельно лежащем модуле, подгруженном динамически, или в статически прилинкованном модуле - главное, чтобы модуль в том или ином виде присутствовал в системе.
Поэтому стоит разделять разные понятия - модульность, компонентность, метапрограммирование... Они связаны друг с другом - и очень плотно, но модульность можно выделить из этой тройки и рассмотреть отдельно.

Автор:  Сергей Губанов [ Суббота, 09 Июнь, 2007 16:31 ]
Заголовок сообщения: 

Есть огромная разница между тем запускается ли на выполнение код инициализации всех модулей при старте программы либо только тогда когда к этому модулю кто-то обратился в первый раз. Архитектура таких систем принципиально разная.

Автор:  Илья Ермаков [ Суббота, 09 Июнь, 2007 16:49 ]
Заголовок сообщения: 

Да, есть разница между системой, "готовой к динамической компонентности", и обычной системой - это да. Но будет ли в конкретной реализации она запускаться дин-компонентно или нет - частность.
Но говорить о том, что модуль - только то, что динамически загружается - это неверно. Правильно сделанный модуль "готов загружаться динамически" - вот это будет верно. Но будет или нет - об этом он сам еще может не знать...

Автор:  PGR [ Вторник, 12 Июнь, 2007 17:05 ]
Заголовок сообщения: 

PGR писал(а):
Илья Ермаков писал(а):
Ну, а где тогда взять аналог WITH, его вообще нет ни в одном из известных языков...

Действительно удобная штука. Как его ещё не стянули в другие языки...

Есть что-то похожее:
Код:
namespace Test.With
  using System.Console

  class A
    public this() { a = 5 }
    public mutable a: int

  class B: A
    public this() { b = 3.14 }
    public mutable b: double
 
  class C: B
    public this() { c = "ccc" }
    public mutable c: string
 
  module Test
    MatchTest(a: A): void
      match (a)
        | x is C => WriteLine(x.c)
        | x is B => WriteLine(x.b)
        | x is A => WriteLine(x.a)
        | _ => ()
 
    Main(): void
      def a = B()
      MatchTest(a)

Автор:  Сергей Губанов [ Среда, 13 Июнь, 2007 10:30 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Но будет или нет - об этом он сам еще может не знать...

Ну разумеется нет! Разработчик модуля всегда точно знает должен ли его модуль быть обязательно загружен при старте системы (Host*) или его модуль можно загрузить в любое время потом, и разработчик модуля уж точно знает можно ли его модуль выгружать и заменять "на лету".

Я продолжаю настаивать на динамическом смысле модулей.

Помню в какой-то книжке про домашних животных автор допытывался: в чём разница между кошкой и собакой? Он выдвигал всякие предположения (усы, лапы и хвост,...) и тотчас же разбивал их в пух и прах. В конце концов, стало ясно, что между кошкой и собакой вообще разницы не будет заметно если собака будет небольшого размера (породы похожей на кошачью, а кошка породы похожей на собачью) и подстрижены и покрашены они будут одинаково. Введя читателя в состояние полного недоумения, после этого, автор наконец-то объяснил в чём же на самом деле заключается разница между кошкой и собакой (и она вовсе не во внешних данных). Собака - догоняет свою добычу, а кошка - подстерегает.

Вот так же и с модулями. Вы ни за что не сможете найти различия между "модулем" и "не-модулем" если не привяжетесь к динамической загрузке/выгрузке просто потому, что все остальные задачи можно решить немодульными средствами.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/