Форум: "Прочее";
Текущий архив: 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.043 c