|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов ДенисCOM за пределами Windows нет. AriochНапример MS-COM и XPCOM Кроме того, Firebird-типа-COM тоже не было за пределами Windows, но сверх того не было и в пределах. Впрочем, я не просто так написл "например". Были и SOM и много ещё чего. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 16:57 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovВ UDR эта возможность тоже сильно ограничена. Фактически - до одного-единственного кода isc_random. Но это намного лучше, чем возвращать спецзначение из UDF. Dimitry SibiryakovСтруктуры указателей на обычные функции с дополнительным параметром он генерирует. ну это не к тебе вопрос был. Ты то по поводу клопа в своё время Адриано плешь проел. А вот Arioch толком не смотрел, но рассуждает. Arioch, UDR кажутся сложными только на первый взгляд. Вся сложность там только в том что необходим повторяющийся кода для фабрик процедур/функций/триггеров. В C++ хитро выкрутились через boost с шаблонами. Правда понимание кода стразу падает, ибо подробности скрыты. В Delphi такое не прокатывает и надо писать ручками. Хотя часть вещей тоже можно упростить, например фабрики сделать тоже через шаблоны. Но вот структуры для маппинга входных и выходных сообщений всё-таки писать придётся в любом случае, если ты конечно не самурай который оперирует смещениями указателей. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 17:03 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов ДенисТы хоть смотрел что этот самый CLOOP генерирует? Ты не поверишь, но смотрел. Хотел в UIB добавить, ещё до того, как Анри зашевелился. Симонов ДенисВ Delphi такое не прокатывает и надо писать ручками. РЖУ, в голос. Т.е. было: [*]стандартный COM, который относительно неплохо встроен в компиляторы Delphi и FPC, включая ARC (подсчёт ссылок). [*]автоматическая генерация заглушек из MS IDL (если надо) или TLB [*]ручной перевод методов COM-интерфейсом с деклараций на C++ в Delphi (не так весело, но опыт наработан сотнями человекомесяцев и процесс хотя и зануден, но понятен) Вместо этого сделали [*]нестандартный COM, который экономит циклы процессора отказом от автоматического подсчёта ссылок. Который в принципе на многопроцессорных системах может действительно замедлять присвоение НОВЫХ переменных, но едва ли тестировалось насколько это ускорение актуально для клиентских приложений. [*]свой тёплый ламповый IDL и свой CLOOP вместо какого-нибудь стандартного IDL-процессора [*]и поверх этого торта такая вишенка, что выхлоп этого CLOOP "в Delphi не прокатывает и надо писать ручками". Вот как раз умилённо "повтыкав" в это "немножечко доработайте напильничком" я и восхитился новым клиентским API, в каковом состоянии до сих пор прeбываю. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 17:17 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Ariochтребуется сразу решать, на каких языках будут писаться плагины? C++ ? тогда не надо городить как-бы-COM-но-не-совсем. Делайте обычные абстрактные классы C++ Симонов Денис>> Делайте обычные абстрактные классы C++ Изначально так и сделали, но на FPC что-то пошло не так. Кроме того, есть ещё C. тоже забавно, ты берешь мой тезис, строго заявленный как C++-only, и начинаешь к нему добавлять другие языки когда я именно про это и говорил, что нельзя грести в две стороны сразу ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 17:22 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов ДенисИзначально так и сделали, но на FPC что-то пошло не так. Симонов ДенисВ Delphi такое не прокатывает и надо писать ручками. Зато теперь ТАК пошло! Ну прости, ну в самом деле, но вот КАК тут можно не ржать??? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 17:24 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
AriochВ Delphi такое не прокатывает и надо писать ручками. Эта фраза относится исключительно к написанию UDR. И никаким стандартным COM здесь ничего не исправить. Потому что при написании UDR надо: 1. Создать структуры для маппинга входных и выходных параметров. Это можно и не делать, но тогда надо самому оперировать смещениями через IMessageMetadata. Что медленней. Впрочем можно написать и свою прослойку. 2. Написать класс процедуры/функции/триггера 3. Для селективной процедуры ещё написать класс для возврата результат. Ибо дельфи не поддерживает yield. Впрочем в UDF это вообще нельзя сделать. 4. Написать фабрику для создания экземпляра процедуры/функции/триггера 5. Зарегистрировать эту фабрику По сути написание фабрик очень простое занятие, но напрягает. Можно автоматизировать, если конечно не заниматься в фабриках проверкой декларации UDR или другими вещами кроме самого создания. На C++ есть ещё хелперы для структур входных и выходных сообщений. Симонов ДенисИзначально так и сделали, но на FPC что-то пошло не так. А пошло не так именно с обычными VMT ибо баги в FPC. DS должен прекрасно это помнить. Ariochнестандартный COM, который экономит циклы процессора отказом от автоматического подсчёта ссылок. вообще-то целью было не отказ от подсчёта ссылок. Не понравилось наличие в IUnknown метода QueryInterface. Впрочем меня по этому поводу лучше не терзать. Не я сиё решение принимал. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 18:00 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов Денисвообще-то целью было не отказ от подсчёта ссылок. Не понравилось наличие в IUnknown метода QueryInterface. Впрочем меня по этому поводу лучше не терзать. Не я сиё решение принимал. может быть и так, давно это было, подробности не помню уже ну я тогда долго пытался прочитать "почему же не COM" и меня просветление не хватило. Не дорос... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 18:07 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов ДенисА пошло не так именно с обычными VMT ибо баги в FPC. DS должен прекрасно это помнить. Я помню это лучше, чем хотелось бы. Не было никакого "бага с VMT в FPC". Был общий для Delphi и FPC баг, не позволяющий работать функциям вида Код: pascal 1.
Они обои хотели исключительно Код: pascal 1.
И у разработчиков таки был выбор: переделать весь API на такой способ возврата интерфейсов или стоять на своём. Они решили стоять. Симонов ДенисНе понравилось наличие в IUnknown метода QueryInterface. Что, как я и писал в своё время, отлично решалось заглушкой во всё равно используемом template, всегда возвращающей "interface not supported". Да, возможно от этого отвалились бы дельфийские is и as, но это легко решалось бы потом (при необходимости) одной дополнительной строчкой в этой же заглушке. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 18:14 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Arioch, я надеюсь ты понял к чему я сказал про авторВ Delphi такое не прокатывает и надо писать ручками. не надо меня перевирать, а то мало ли кто прочтёт. Ещё Влад с Димой придёт и дадут мне по шапке за враньё. Оно никак не относилось к вопросу почему не COM. Тем более что внятно объяснить почему не COM я не смогу. Это не моё решение и я даже не участвовал в тех обсуждениях. Говорю что по факту есть сейчас. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2018, 18:15 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovИ у разработчиков таки был выбор: переделать весь API на такой способ возврата интерфейсов или стоять на своём. Они решили стоять. Был еще третий вариант - bridge. Сделать например DLL специально под FreePascal/Delphi, который бы переводил одно в другой. В любом случае, если "они решили стоять" и игнорировать ограничения FPC/D, то тем самым они решили убрать многоязычность из задач интерфейса, т.е. сделать интерфейс на C++ - и тогда добавленная абстракция/косвенность через FB-IDL и CLOOP становится уже 5-м колесом телеги. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 13:53 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Arioch, рука-лицо. Вот тебе не всё ли равно как там внутри выглядит сгенерированый файл для работы через API. Важно что он есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 14:29 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов ДенисВажно что он есть. Симонов ДенисВ Delphi такое не прокатывает и надо писать ручками. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 16:06 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов ДенисПравда понимание кода стразу падает, ибо подробности скрыты. Вот это, кстати, тоже. Как-то так довольно получается со всеми "автоматическими идиотами", что часто эти "скрытые подробности" вылезают боком и приходится таки дебажить ручками ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 16:07 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
AriochСимонов Денис В Delphi такое не прокатывает и надо писать ручками. Как же ты достал приводить эту мою фразу. Ещё раз для тех кто не понял моего предыдущего объяснения. Берём пример написания внешней процедуры на C++. текст на С++ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
Речь идёт о макросах FB_UDR_BEGIN_PROCEDURE, FB_UDR_MESSAGE, FB_UDR_EXECUTE_PROCEDURE, FB_UDR_FETCH_PROCEDURE, FB_UDR_END_PROCEDURE. Ну не напишешь ты такое на Delphi хоть весь интерфейс трижды будет реализован на стандартном COM. Не ужели это не ясно? А внутри все эти макросы раскрываются примерно в то же самое что и на Delphi, естественно с учётом специфики С++. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 16:19 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов ДенисРечь идёт о макросах FB_UDR_BEGIN_PROCEDURE, FB_UDR_MESSAGE, FB_UDR_EXECUTE_PROCEDURE, FB_UDR_FETCH_PROCEDURE, FB_UDR_END_PROCEDURE. Ну не напишешь ты такое на Delphi хоть весь интерфейс трижды будет реализован на стандартном COM. Если интерфейс написан на стандартном СОМ, то эти макросы напрочь не нужны, ибо всё, что они делают, это объявляют обёртки. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 16:35 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
AriochКак-то так довольно получается со всеми "автоматическими идиотами" никаких автоматических идиотов нет. Просто для программеров на C++ написаны хелперы, позволяющие сократить портянки кода. Если немного покумекать, то и для дельфийского кода тоже кое-что можно подсократить. Но не до такой степени как на C++. И сюрпрайз для Java и C# код может быть ещё короче. Но тебе я вижу лишь бы поворчать не вникая в суть проблемы. В отличие от Дмитрия ты даже не пытался понять что к чему. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 16:38 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, ну да, ну да. Статическую структуру сообщений через COM не построишь. Всё что ты говоришь относится исключительно к автопойнтерам, но ни как не к автогенерации классов и структур. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 16:44 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов ДенисИ сюрпрайз для Java и C# код может быть ещё короче. Это вряд ли. Клоп не позволяет наследование, тем более множественное. Поэтому единственный способ реюзать код это копи-паста с помощью макросов, а макросов сишного уровня, позволяющих одну строчку развернуть в портянку на два экрана, в них, насколько я знаю, нет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 16:45 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, я смотрел демку реализации у Иржи. Так вот он там хитро для процедур вывернулся через оператор yield, вместо создания класса ResultSet ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 16:54 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов Денис, поясню мы говорим об объёме кода который необходимо написать конечному пользователю, а не о том сколько промежуточных слоёв наделали за тебя. Тут и без лупы видно что код на C# и Java будет работать в разы медленней. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 16:59 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов ДенисСтатическую структуру сообщений через COM не построишь. Вообще-то вполне можно было бы, если бы не фиксированный формат буфера, который вынуждает структуру подгонять под IMessageMetadata, а не наоборот. Это как раз первое, что я попытался сделать, увидев новое API: создать дельфийский класс, который по заданной record заполняет наследника от IMessageMetadata. Разочарование было жестоким, когда я понял, что весь код Firebird игнорирует значения, возвращаемые getOffset() и getNullOffset(). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 17:11 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, а какой в этом смысл, если входные и выходные сообщения всё равно должны полностью соответствовать входным и выходным параметрам объявленным в PSQL для UDR? Или ты про триггеры? Я их даже не щупал ещё. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 17:29 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Симонов Дениса какой в этом смысл, если входные и выходные сообщения всё равно должны полностью соответствовать входным и выходным параметрам объявленным в PSQL для UDR? Не должны, но могут. Более того, UDR могут сами себя регистрировать и описывать свои параметры, не требуя явного их создания с помощью SQL. Но взадсовместимость требует, чтобы список параметров был доступен через select from где-то, а перековать таблицу RDB$FUNCTION_ARGUMENTS во вьюху, объединяющую параметры всех трёх видов функций, видимо, показалось слишком большой работой. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 17:36 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovигнорирует значения, возвращаемые getOffset() и getNullOffset(). ....ну если даже QueryInterface слишком медленный оказался, то тут тем более. М.б. внутрь буфера надо было сначала положить вектор смещений/указателей, а потом уже вектор данных. Тогда библиотека в конечном ЯВУ могла бы "препарить" первый вектор раз и насовсем и много раз потом копировать/заполнять только данные ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 17:37 |
|
Internal и external function с одинаковым названием
|
|||
---|---|---|---|
#18+
Arioch, это и ежу понятно. Фигачить такие вызовы каждый раз да ещё и с проверкой статуса на фиг не надо. Это можно сделать единожды при создании экземпляра процедуры/функции. В любом случае получение указателей по смещениям будет медленней чем через фиксированную структуру. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 17:45 |
|
|
start [/forum/topic.php?fid=40&msg=39697304&tid=1560985]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
131ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 242ms |
0 / 0 |