Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

Динамическая загрузка в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.095 c
15-1137961868
Alexis
2006-01-22 23:31
2006.02.12
Книга по PHP


2-1138210666
Proxytel
2006-01-25 20:37
2006.02.12
Обработка события клавиатуры при неактивном окне программы


2-1138357305
LionMen
2006-01-27 13:21
2006.02.12
Изменение формат ячеек в Excele


2-1138369803
Glex
2006-01-27 16:50
2006.02.12
Офигеть. Слетает и даже ошибок не выдаёт!


15-1137944178
Kerk
2006-01-22 18:36
2006.02.12
650летие Самары





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский