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/ |