powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Internal и external function с одинаковым названием
25 сообщений из 71, страница 2 из 3
Internal и external function с одинаковым названием
    #39696359
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисCOM за пределами Windows нет.
AriochНапример MS-COM и XPCOM

Кроме того, Firebird-типа-COM тоже не было за пределами Windows, но сверх того не было и в пределах.

Впрочем, я не просто так написл "например". Были и SOM и много ещё чего.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39696365
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВ UDR эта возможность тоже сильно ограничена. Фактически - до одного-единственного кода
isc_random.

Но это намного лучше, чем возвращать спецзначение из UDF.

Dimitry SibiryakovСтруктуры указателей на обычные функции с дополнительным параметром он генерирует.

ну это не к тебе вопрос был. Ты то по поводу клопа в своё время Адриано плешь проел. А вот Arioch толком не смотрел, но рассуждает.

Arioch,

UDR кажутся сложными только на первый взгляд. Вся сложность там только в том что необходим повторяющийся кода для фабрик процедур/функций/триггеров. В C++ хитро выкрутились через boost с шаблонами. Правда понимание кода стразу падает, ибо подробности скрыты.

В Delphi такое не прокатывает и надо писать ручками. Хотя часть вещей тоже можно упростить, например фабрики сделать тоже через шаблоны. Но вот структуры для маппинга входных и выходных сообщений всё-таки писать придётся в любом случае, если ты конечно не самурай который оперирует смещениями указателей.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39696380
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисТы хоть смотрел что этот самый CLOOP генерирует?

Ты не поверишь, но смотрел. Хотел в UIB добавить, ещё до того, как Анри зашевелился.

Симонов ДенисВ Delphi такое не прокатывает и надо писать ручками.

РЖУ, в голос.

Т.е. было:

[*]стандартный COM, который относительно неплохо встроен в компиляторы Delphi и FPC, включая ARC (подсчёт ссылок).

[*]автоматическая генерация заглушек из MS IDL (если надо) или TLB

[*]ручной перевод методов COM-интерфейсом с деклараций на C++ в Delphi (не так весело, но опыт наработан сотнями человекомесяцев и процесс хотя и зануден, но понятен)

Вместо этого сделали

[*]нестандартный COM, который экономит циклы процессора отказом от автоматического подсчёта ссылок. Который в принципе на многопроцессорных системах может действительно замедлять присвоение НОВЫХ переменных, но едва ли тестировалось насколько это ускорение актуально для клиентских приложений.

[*]свой тёплый ламповый IDL и свой CLOOP вместо какого-нибудь стандартного IDL-процессора

[*]и поверх этого торта такая вишенка, что выхлоп этого CLOOP "в Delphi не прокатывает и надо писать ручками".

Вот как раз умилённо "повтыкав" в это "немножечко доработайте напильничком" я и восхитился новым клиентским API, в каковом состоянии до сих пор прeбываю.
YouTube Video
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39696383
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochтребуется сразу решать, на каких языках будут писаться плагины?

C++ ? тогда не надо городить как-бы-COM-но-не-совсем.
Делайте обычные абстрактные классы C++

Симонов Денис>> Делайте обычные абстрактные классы C++

Изначально так и сделали, но на FPC что-то пошло не так.
Кроме того, есть ещё C.

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

когда я именно про это и говорил, что нельзя грести в две стороны сразу
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39696385
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисИзначально так и сделали, но на FPC что-то пошло не так.
Симонов ДенисВ Delphi такое не прокатывает и надо писать ручками.

Зато теперь ТАК пошло!

Ну прости, ну в самом деле, но вот КАК тут можно не ржать???
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39696409
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochВ Delphi такое не прокатывает и надо писать ручками.

Эта фраза относится исключительно к написанию UDR. И никаким стандартным COM здесь ничего не исправить.

Потому что при написании UDR надо:
1. Создать структуры для маппинга входных и выходных параметров. Это можно и не делать, но тогда надо самому оперировать смещениями через IMessageMetadata. Что медленней. Впрочем можно написать и свою прослойку.
2. Написать класс процедуры/функции/триггера
3. Для селективной процедуры ещё написать класс для возврата результат. Ибо дельфи не поддерживает yield. Впрочем в UDF это вообще нельзя сделать.
4. Написать фабрику для создания экземпляра процедуры/функции/триггера
5. Зарегистрировать эту фабрику

По сути написание фабрик очень простое занятие, но напрягает. Можно автоматизировать, если конечно не заниматься в фабриках проверкой декларации UDR или другими вещами кроме самого создания.

На C++ есть ещё хелперы для структур входных и выходных сообщений.

Симонов ДенисИзначально так и сделали, но на FPC что-то пошло не так.

А пошло не так именно с обычными VMT ибо баги в FPC. DS должен прекрасно это помнить.

Ariochнестандартный COM, который экономит циклы процессора отказом от автоматического подсчёта ссылок.

вообще-то целью было не отказ от подсчёта ссылок. Не понравилось наличие в IUnknown метода QueryInterface.
Впрочем меня по этому поводу лучше не терзать. Не я сиё решение принимал.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39696413
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисвообще-то целью было не отказ от подсчёта ссылок. Не понравилось наличие в IUnknown метода QueryInterface.
Впрочем меня по этому поводу лучше не терзать. Не я сиё решение принимал.

может быть и так, давно это было, подробности не помню уже

ну я тогда долго пытался прочитать "почему же не COM" и меня просветление не хватило. Не дорос...
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39696416
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисА пошло не так именно с обычными VMT ибо баги в FPC. DS должен прекрасно это помнить.

Я помню это лучше, чем хотелось бы. Не было никакого "бага с VMT в FPC". Был общий для
Delphi и FPC баг, не позволяющий работать функциям вида
Код: pascal
1.
Function foo: interface; external; cdecl;


Они обои хотели исключительно
Код: pascal
1.
Procedure foo(var Result: interface); external; cdecl;


И у разработчиков таки был выбор: переделать весь API на такой способ возврата интерфейсов
или стоять на своём. Они решили стоять.

Симонов ДенисНе понравилось наличие в IUnknown метода QueryInterface.
Что, как я и писал в своё время, отлично решалось заглушкой во всё равно используемом
template, всегда возвращающей "interface not supported". Да, возможно от этого отвалились
бы дельфийские is и as, но это легко решалось бы потом (при необходимости) одной
дополнительной строчкой в этой же заглушке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39696417
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

я надеюсь ты понял к чему я сказал про

авторВ Delphi такое не прокатывает и надо писать ручками.

не надо меня перевирать, а то мало ли кто прочтёт. Ещё Влад с Димой придёт и дадут мне по шапке за враньё. Оно никак не относилось к вопросу почему не COM. Тем более что внятно объяснить почему не COM я не смогу. Это не моё решение и я даже не участвовал в тех обсуждениях. Говорю что по факту есть сейчас.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697183
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovИ у разработчиков таки был выбор: переделать весь API на такой способ возврата интерфейсов или стоять на своём. Они решили стоять.

Был еще третий вариант - bridge. Сделать например DLL специально под FreePascal/Delphi, который бы переводил одно в другой.

В любом случае, если "они решили стоять" и игнорировать ограничения FPC/D, то тем самым они решили убрать многоязычность из задач интерфейса, т.е. сделать интерфейс на C++ - и тогда добавленная абстракция/косвенность через FB-IDL и CLOOP становится уже 5-м колесом телеги.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697207
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

рука-лицо. Вот тебе не всё ли равно как там внутри выглядит сгенерированый файл для работы через API. Важно что он есть.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697259
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВажно что он есть.
Симонов ДенисВ Delphi такое не прокатывает и надо писать ручками.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697261
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисПравда понимание кода стразу падает, ибо подробности скрыты.

Вот это, кстати, тоже.

Как-то так довольно получается со всеми "автоматическими идиотами", что часто эти "скрытые подробности" вылезают боком и приходится таки дебажить ручками
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697265
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
/***
create procedure gen_rows2 (
    start_n integer not null,
    end_n integer not null
) returns (
    n integer not null
)
    external name 'udrcpp_example!gen_rows2'
    engine udr;
***/
FB_UDR_BEGIN_PROCEDURE(gen_rows2)
	FB_UDR_MESSAGE(InMessage,
		(FB_INTEGER, start)
		(FB_INTEGER, end)
	);

	FB_UDR_MESSAGE(OutMessage,
		(FB_INTEGER, result)
	);

	FB_UDR_EXECUTE_PROCEDURE
	{
		out->resultNull = FB_FALSE;
		out->result = in->start - 1;
	}

	FB_UDR_FETCH_PROCEDURE
	{
		return out->result++ < in->end;
	}
FB_UDR_END_PROCEDURE



Речь идёт о макросах FB_UDR_BEGIN_PROCEDURE, FB_UDR_MESSAGE, FB_UDR_EXECUTE_PROCEDURE, FB_UDR_FETCH_PROCEDURE, FB_UDR_END_PROCEDURE. Ну не напишешь ты такое на Delphi хоть весь интерфейс трижды будет реализован на стандартном COM. Не ужели это не ясно?

А внутри все эти макросы раскрываются примерно в то же самое что и на Delphi, естественно с учётом специфики С++.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697273
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисРечь идёт о макросах 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
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697274
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochКак-то так довольно получается со всеми "автоматическими идиотами"

никаких автоматических идиотов нет. Просто для программеров на C++ написаны хелперы, позволяющие сократить портянки кода.
Если немного покумекать, то и для дельфийского кода тоже кое-что можно подсократить. Но не до такой степени как на C++. И сюрпрайз для Java и C# код может быть ещё короче. Но тебе я вижу лишь бы поворчать не вникая в суть проблемы. В отличие от Дмитрия ты даже не пытался понять что к чему.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697275
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ну да, ну да. Статическую структуру сообщений через COM не построишь.
Всё что ты говоришь относится исключительно к автопойнтерам, но ни как не к автогенерации классов и структур.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697277
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисИ сюрпрайз для Java и C# код может быть ещё короче.

Это вряд ли. Клоп не позволяет наследование, тем более множественное. Поэтому единственный
способ реюзать код это копи-паста с помощью макросов, а макросов сишного уровня,
позволяющих одну строчку развернуть в портянку на два экрана, в них, насколько я знаю, нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697283
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

я смотрел демку реализации у Иржи. Так вот он там хитро для процедур вывернулся через оператор yield, вместо создания класса ResultSet
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697284
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

поясню мы говорим об объёме кода который необходимо написать конечному пользователю, а не о том сколько промежуточных слоёв наделали за тебя. Тут и без лупы видно что код на C# и Java будет работать в разы медленней.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697287
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисСтатическую структуру сообщений через COM не построишь.

Вообще-то вполне можно было бы, если бы не фиксированный формат буфера, который вынуждает
структуру подгонять под IMessageMetadata, а не наоборот. Это как раз первое, что я
попытался сделать, увидев новое API: создать дельфийский класс, который по заданной record
заполняет наследника от IMessageMetadata. Разочарование было жестоким, когда я понял, что
весь код Firebird игнорирует значения, возвращаемые getOffset() и getNullOffset().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697299
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

а какой в этом смысл, если входные и выходные сообщения всё равно должны полностью соответствовать входным и выходным параметрам объявленным в PSQL для UDR? Или ты про триггеры? Я их даже не щупал ещё.
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697303
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениса какой в этом смысл, если входные и выходные сообщения всё равно должны полностью
соответствовать входным и выходным параметрам объявленным в PSQL для UDR?

Не должны, но могут. Более того, UDR могут сами себя регистрировать и описывать свои
параметры, не требуя явного их создания с помощью SQL. Но взадсовместимость требует, чтобы
список параметров был доступен через select from где-то, а перековать таблицу
RDB$FUNCTION_ARGUMENTS во вьюху, объединяющую параметры всех трёх видов функций, видимо,
показалось слишком большой работой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697304
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovигнорирует значения, возвращаемые getOffset() и getNullOffset().

....ну если даже QueryInterface слишком медленный оказался, то тут тем более.

М.б. внутрь буфера надо было сначала положить вектор смещений/указателей, а потом уже вектор данных.

Тогда библиотека в конечном ЯВУ могла бы "препарить" первый вектор раз и насовсем и много раз потом копировать/заполнять только данные
...
Рейтинг: 0 / 0
Internal и external function с одинаковым названием
    #39697308
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

это и ежу понятно. Фигачить такие вызовы каждый раз да ещё и с проверкой статуса на фиг не надо. Это можно сделать единожды при создании экземпляра процедуры/функции. В любом случае получение указателей по смещениям будет медленней чем через фиксированную структуру.
...
Рейтинг: 0 / 0
25 сообщений из 71, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Internal и external function с одинаковым названием
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]