Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Динамическая загрузка в Delphi   Найти похожие ветки 

 
Ермак ©   (2006-01-22 02:35) [0]

Добрый день всем!

Вот заспорил я тут с одним "знатоком", который стал утверждать что в классической Delphi (не .NET) есть динамическая модульность (т.е. загрузка и связывание на лету, по типу .NET и Оберонов, например). Он, видите ли, увидел когда-то, как в среду без перезапуска добавляются новые компоненты.

Все мои попытки объяснить человеку, что загрузка компонентов в Design-Time и динамическая подгрузка модулей в твое приложения в Run-TIme - это две большие разницы, и что в среду грузятся не сами модули, а специально подготовленные и слинкованные dpk (design packages) были безуспешны...

Вот я даже и подумал: кто из нас двоих дурак? :-) Может, я сам в Дельфе за 5 лет ничего не понимаю, а этот товарисч, пишущий исключительно на плюсах, ее великий знаток?

Разъясните, плиз.
Вот, кстати, ветка нашего спора целиком:
http://blackbox.metasystems.ru/forum/viewtopic.php?t=105&postdays=0&postorder=asc&start=20


 
SPeller ©   (2006-01-22 06:13) [1]

По-моему, в любой среде можно загрузить длл динамически и выполнить её код.

Ермак ©   (22.01.06 2:35)
видите ли, увидел когда-то, как в среду без перезапуска добавляются новые компоненты

LMD :-)) Всё до банальности просто. Загрузили длл, вызвали нужные функции, которые и добавили кнопочек на тулбар. Может, он припишет к динамической загрузке как в .NET добавление кнопок на тулбар без перезагрузки среды? :)


 
TUser ©   (2006-01-22 08:25) [2]

еще он bpl мог иметь в виду - вполне себе динамическая модульность


 
GuAV ©   (2006-01-22 15:14) [3]


> загрузка и связывание на лету,


http://delphimaster.net/view/10-1137243244/ [1] ?


 
tesseract ©   (2006-01-22 18:41) [4]


> Вот заспорил я тут с одним "знатоком", который стал утверждать
> что в классической Delphi (не .NET) есть динамическая модульность
> (т.е. загрузка и связывание на лету, по типу .NET и Оберонов,
>  например). Он, видите ли, увидел когда-то, как в среду
> без перезапуска добавляются новые компоненты.

RTTI такое в лёгком принципе позволяет. А ты как думаешь её IDE Delphi работает?
bpl - своеобразная версия библиотек.

В делфи реально можно создавать  объекты знакомых типов. Но компилировать и создвать в  рантайм новые классы и процедуры ни один язык не может. Я не знаток .Net но если они только освоили трюки Delphi 5 летней давности (может даже раньше. OWL появилось раньше MFC).

Можно в перл/python накатать новый файл и запустить на исполнение - это другое.


 
tesseract ©   (2006-01-22 18:42) [5]


> Вот заспорил я тут с одним "знатоком", который стал утверждать
> что в классической Delphi (не .NET) есть динамическая модульность
> (т.е. загрузка и связывание на лету, по типу .NET и Оберонов,
>  например). Он, видите ли, увидел когда-то, как в среду
> без перезапуска добавляются новые компоненты.

RTTI такое в лёгком принципе позволяет. А ты как думаешь её IDE Delphi работает?
bpl - своеобразная версия библиотек.

В делфи реально можно создавать  объекты знакомых типов. Но компилировать и создвать в  рантайм новые классы и процедуры ни один язык не может. Я не знаток .Net но если они только освоили трюки Delphi 5 летней давности (может даже раньше. OWL появилось раньше MFC).

Можно в перл/python накатать новый файл и запустить на исполнение - это другое.


 
DiamondShark ©   (2006-01-23 00:19) [6]


> есть динамическая модульность (т.е. загрузка и связывание
> на лету, по типу .NET и Оберонов, например).

Есть. С тем лишь исключением, что единица загрузки не модуль, а пакет.


> Он, видите ли, увидел когда-то, как в среду без перезапуска
> добавляются новые компоненты.

IDE дельфи написана на дельфи.
Всё то же самое реализуемо и в любом другом Дельфи-приложении.


> Все мои попытки объяснить человеку, что загрузка компонентов
> в Design-Time и динамическая подгрузка модулей в твое приложения
> в Run-TIme - это две большие разницы

Никакой разницы.


> и что в среду грузятся не сами модули, а специально подготовленные
> и слинкованные dpk (design packages)

Вообще-то, dpl, но не суть.
Грузить и исполнять вообще можно только специально подготовленное и слинкованное нечто.


> были безуспешны...

Ну и слава Тваштару.


 
jack128 ©   (2006-01-23 00:23) [7]

DiamondShark ©   (23.01.06 0:19) [6]
Хе. Разделал человека, как бог черепаху :-))


 
DiamondShark ©   (2006-01-23 00:38) [8]


> Вот, кстати, ветка нашего спора целиком:
> http://blackbox.metasystems.ru/forum/viewtopic.php?t=105&postdays=0&postorder=asc&start=20

Мне оттуда понравились слова "со всеми их типами" (это про модули-расширения).

Расскажите, какой от этого прок, и как удаётся работать с типами, неизвестными на момент компиляции ядра?
(кроме классов, разумеется. с ними как раз всё понятно)


 
Ермак ©   (2006-01-23 01:22) [9]

Нда... Загрузка bpl в Дельфе есть. Но так как приложений, использующих эту вещь, очень мало, а вот публикаций типа того "Как сделать на Дельфи программу с dll-плагинами" - много, я не могу не заподозрить, что что-то здесь не так гладко и удобно...

>Расскажите, какой от этого прок, и как удаётся работать с типами, >неизвестными на момент компиляции ядра?

Кстати, удается и очень просто: благодаря типу ANYREC и ANYPTR.
Я могу разобрать "по косточкам" любой модуль, загрузить его, создать экземпляры любых его типов. А что делать дальше?
Ну, например, процедура
PROCEDURE Proc(rec: ANYPTR)
сможет принять указатель на абсолютно любой тип, с помощью рефлексии разобраться, какие в нем есть поля, прочитать/записать их значения, создать еще один экземпляр и т.п.

Например, тип Table модуля Sql имеет метод Read(row: INTEGER; VAR rec: ANYREC), который работает с записями, про которые во время своей компиляции ничего не знал, автоматически раскидывая поля таблицы по полям  соответствующих типов языка.


 
ZeroDivide ©   (2006-01-23 08:41) [10]


> Нда... Загрузка bpl в Дельфе есть. Но так как приложений,
>  использующих эту вещь, очень мало, а вот публикаций типа
> того "Как сделать на Дельфи программу с dll-плагинами" -
>  много, я не могу не заподозрить, что что-то здесь не так
> гладко и удобно...


Как раз наоборот.

Что касается темы:
Да все можно, не от языка это зависит, а от программиста.

Я могу разобрать "по косточкам" любой модуль, загрузить его, создать экземпляры любых его типов
Имеется в виду dcu файл? Как это?


 
iZEN ©   (2006-01-23 11:45) [11]

>tesseract ©   (22.01.06 18:41) [4]
>Но компилировать и создвать в  рантайм новые классы и процедуры ни один язык не может. Я не знаток .Net но если они только освоили трюки Delphi 5 летней давности (может даже раньше. OWL появилось раньше MFC).

Скажем так, насчёт ни один язык не может это вы сильно погорячились.


 
DiamondShark ©   (2006-01-23 12:07) [12]


> Нда... Загрузка bpl в Дельфе есть. Но так как приложений,
>  использующих эту вещь, очень мало, а вот публикаций типа
> того "Как сделать на Дельфи программу с dll-плагинами" -
>  много, я не могу не заподозрить, что что-то здесь не так
> гладко и удобно...

Например, инерция мышления.
Не забывайте, что Дельфи со своими идеями ворвалась в виндоуз-программирование -- область со своими глубоко укоренившимися страдициями и стереотипами.
Я сам видел сколько угодно программистов, которые совершенно искренне делали круглые глаза, узнав подробности про bpl.

Конечно, негладкости есть. Самая неприятная -- зависимость от версии компилятора.


 
Alex Konshin ©   (2006-01-23 12:23) [13]

tesseract ©   (22.01.06 18:41) [4]
В делфи реально можно создавать  объекты знакомых типов. Но компилировать и создвать в  рантайм новые классы и процедуры ни один язык не может.

Ну почему? В Java можно. А при наличии Java SDK и компилировать можно. Tomcat так и работает.


 
jack128 ©   (2006-01-23 12:49) [14]

Alex Konshin ©   (23.01.06 12:23) [13]
А при наличии Java SDK и компилировать можно

При наличии компилятора и на дельфи можно динамически нарисовать класс, скомпилировать пакет или dll, подгрузить её в программу и использовать как хочешь ;-)


 
Alex Konshin ©   (2006-01-23 13:26) [15]

Отличие в том, что в Java компилятор входит в один из редистрибутов. А какой редистрибут Delphi входит компилятор? У Sunовской Java есть два варианта JRE и JDK (SDK). Второй включает в себя компилятор, который даже можно вызвать прямо из приложения. Причем оба варианта бесплатные и могут поставляться в составе твоих продуктов.
Кстати, это только второй способ. А упомянут еще и первый - в Java действительно можно создать класс и определить его методы динамически. Можно даже модифицировать существующие, причем это даже не хак, а поддерживаемая технология.


 
ZeroDivide ©   (2006-01-23 13:53) [16]


> А упомянут еще и первый - в Java действительно можно создать
> класс и определить его методы динамически. Можно даже модифицировать
> существующие, причем это даже не хак, а поддерживаемая технология.
>


Использование которой, несомненно хороший стиль программирования :)


 
Ермак ©   (2006-01-23 14:41) [17]


> Я могу разобрать "по косточкам" любой модуль, загрузить
> его, создать экземпляры любых его типов
> Имеется в виду dcu файл? Как это?


Прошу прощения, мой пост остался непонятым... Просто речь шла о споре в ветке другого форума по BlackBox&ComponentPascal, и пост мой был именно про эту среду. У нас в Оберонах динамически загружается именно модуль как единица языка, со всеми языковыми объектами (типами, связанными процедурами (методами), эскпортированными переменными и прочим). Директива IMPORT (аналог uses) по умолчанию осуществляет именно динамическую загрузку-связывание ocf (Oberon Code File) - это как раз аналог dcu. Статическое связывание вообще применяется очень редко. Но самая мощь в том, что можно во время выполнения подгружать и разбирать любой незнакомый модуль именно "по косточкам" - до  полей типов записей и типов аргументов процедур, а затем создавать и работать с переменными неизвестных при компиляции типов, и т.п. BlackBox использует свой формат динамических модулей и свои механизмы для загрузки.

А дельфовый bpl (хотя, как я сейчас на него посмотрел попристальней, и неплох) использует механизмы DLL. Поэтому полной гибкости нет - как я понимаю, знать интерфейсы модулей, которые будут грузится динамически, надо еще на этапе компиляции. Кроме того, загрузчик Windows не обеспечивает должной надежности, например, проверку соответствия параметров процедур...


 
DiamondShark ©   (2006-01-23 15:01) [18]


> А дельфовый bpl (хотя, как я сейчас на него посмотрел попристальней,
>  и неплох) использует механизмы DLL. Поэтому полной гибкости
> нет

Полной гибкости нет не потому что используется механизм ДЛЛ, а потому что Борланд реализовал ограниченное подмножество рефлексии. Только и всего.


> как я понимаю, знать интерфейсы модулей, которые будут грузится
> динамически, надо еще на этапе компиляции

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


 
Ермак ©   (2006-01-23 15:17) [19]

>Вас смущает механизм рефлексии?

Он меня как раз не смущает, в BlackBox весь Framework на нем стоит. Например, связывание контролов с переменными и обработчиками идет по строковому имени. Передавать процедурную переменную из модуля в модуль вообще считается плохим стилем передается строка "Модуль.Процедура", а сама процедурная переменная в момент вызова получается через метамеханизм (так принято в том числе из-за того, что модуль, с которым взаимодейтсвуем, может быть выгружен, и в один прекрасный миг вызов даст TRAP - аналог exception).

>Конечно. Точно так же как в оберонах и .НЕТ.
Если используем импорт на этапе компиляции и автоматическую загрузку при инициализации импортирующего модуля, то естественно. А если программа ведет загрузку через метамеханизм, то она может собрать всю требуемую информацию об интерфейсе модуля и уже на основе ее принять решение, что с модулем делать дальше. Ясен пень, что должны быть какие-то договоренности о том, какую фнукциональность для конкретной программы должны предоставлять создаваемые для нее "плагины", но это уже зависимость чисто логическая, а не формальная.


 
DiamondShark ©   (2006-01-23 15:40) [20]


> так принято в том числе из-за того, что модуль, с которым
> взаимодейтсвуем, может быть выгружен

Может быть выгружен модуль, на который есть живая ссылка?!
Какие ужасы вы рассказываете...
;)


> Если используем импорт на этапе компиляции и автоматическую
> загрузку при инициализации импортирующего модуля, то естественно.
>  А если программа ведет загрузку через метамеханизм, то
> она может собрать всю требуемую информацию об интерфейсе
> модуля и уже на основе ее принять решение, что с модулем
> делать дальше.

Метамеханизм -- это и есть тот самый стандартный интерфейс, который известен до компиляции. предоставляется он на уровне среды исполнения, или встраивается в каждый модуль -- не принципиально.
То, что в дельфи этот механизм скуден -- не есть следствие использования механизмов виндоус, или чего-то ещё. Это просто волевое решение разработчиков.

Вот о чем речь.


 
Alex Konshin ©   (2006-01-24 12:10) [21]

ZeroDivide ©   (23.01.06 13:53) [16]
> А упомянут еще и первый - в Java действительно можно создать
> класс и определить его методы динамически. Можно даже модифицировать
> существующие, причем это даже не хак, а поддерживаемая технология.
>
Использование которой, несомненно хороший стиль программирования :)

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


 
wicked ©   (2006-01-24 13:35) [22]


> Он меня как раз не смущает, в BlackBox весь Framework на
> нем стоит. Например, связывание контролов с переменными
> и обработчиками идет по строковому имени. Передавать процедурную
> переменную из модуля в модуль вообще считается плохим стилем
> передается строка "Модуль.Процедура", а сама процедурная
> переменная в момент вызова получается через метамеханизм

интересно, а на сколько при таком подходе падает быстродействие программы?... механизм рефлексии настолько быстр и легок?...

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


 
DiamondShark ©   (2006-01-24 14:11) [23]


> интересно, а на сколько при таком подходе падает быстродействие
> программы?...

Да нинасколько.
В дельфи ведь тоже при загрузке DFM методы ищутся по имени.
Правда, потом хранятся, всё-таки, процедурные переменные :)

Сомневаюсь я что-то, что в ББ методы ищутся по имени _при каждом_ вызове.
Надо будет дома в исходниках поковыряться...


 
Ермак ©   (2006-01-24 17:08) [24]


> ну или вопрос более общего характера - насколько универсальной
> является BB, как среда разработки/исполнения?.... или позволяются
> только бизнес-аппликации и "игрушечные" примеры?....


То, что по мощности ББ аналогичен Дельфи, я говорю смело . Сам перешел на него, не задумываясь и не жалея. При этом концепции его мне кажутся гораздо более стройными и изящными, чем Дельфовские. (Не потому, что Дельфа плохая, просто, ИМХО, она всегда являлась системой переходного поколения, а Обероны - технологии одной "эпохи" (самые первые как раз) с Java, C# и в целом .NET). Как и Дельфа, написан полностью сам на себе. Можно перекомпилировать легким щелчком мышки по командеру, даже ядро (которое обычно включает в себя Kernel со сборкой мусора и рефлексией - 1980 строк кода, модуль работы с файловой системой и динамический загрузчик - всего ядро весит 80 Кб, хотя если нужно, можно статически скомпоновать в exe только один или несколько модуль, без всякого RTL - будет весить столько, сколько напишете - хотя для выделения памяти придется юзать вызовы к ОС).


> или позволяются
> > только бизнес-аппликации и "игрушечные" примеры?....


Ну, бизнес-апликации на нем дейтсвительно архиудобно писать - особенно ориентированные на работу с текстами и СУБД.
А касательно живых примеров... Oberon Microsystems писала на своем BlackBox JIT-компилятор Java по заказу Borland. Создана ОС жесткого реального времени Portos (не путать с PortOS). Потом отпочковалась компания Esmertec, которая распространяет Portos под названием JBed - это ОС используется для встроенных систем с Java-приложениями (в т.ч. в мобильных телефонах), хотя написана целиком на Component Pascal.
Если интересно - вот презентация о ББ от его ведущего разработчика К.Пфистера:
http://blackbox.metasystems.ru/download/bb_present.pdf

Там в конце как раз рассказывается про один из "игрушечных примеров" - комплекс мониторинга для крупнейшей ГЭС планеты (на Амазонке, в Бразилии), работающем на UNIX-64.

Прошу не бить ногами за "пиарр", просто действительно замечательная вещь, хочется рассказать :-)



Страницы: 1 вся ветка

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.126 c
1-1136987305
Samum
2006-01-11 16:48
2006.02.12
Не работает Debug.


1-1137354346
2Wish
2006-01-15 22:45
2006.02.12
List Index out of bounds


1-1137453095
-matrix-
2006-01-17 02:11
2006.02.12
Непонятки с выводом


2-1138036171
Norm Iridium
2006-01-23 20:09
2006.02.12
Поиск и изменение текста в RichEdit


3-1134659156
Виталий Панасенко
2005-12-15 18:05
2006.02.12
Портирование кода с BDE на ADO