Linuxway (Страница 6) / Программирование / Форум StopLinux

Объявление

Kwork.ru - услуги фрилансеров от 500 руб.

#126 29-07-10 14:10:59

Skipper_gmr
Участник
Зарегистрирован: 15-07-10
Сообщений: 141

Re: Linuxway

Mike22 пишет:

В общем все. Не так уж много действий, но ппц как взбесило. Линуксоиды, проходящие через это чаще раза в месяц - однозначно скорбные разумом мазохисты, по которым биореактор плачет.

Причем тут линуксоиды? Почему они должны, что-то проходить под W7, если они ей не пользуются?

Ваша задача была тривиальной и даже по форумам "лазить" не надо было, любой нормальный пользователь по моему в состоянии догадаться, что нужно делать. А если Вас даже это раздражает, то Вам не то, что Linux, Вам вообще компьютер противопоказан, ибо нервные клетки не восстанавливаются.


"Ненависть к Microsoft является болезнью" (с) Линус Торвальдс

Неактивен

#127 29-07-10 14:24:19

whoknows
Гость

Re: Linuxway

DonDublon3 пишет:

Я могу взять класс написаный в каком-то девяносто лохматом году на Delphi, и скомпилить его под дотнет. И юзать его в свом приложении на C#. Ну или на C++.net, если мс-хейтер и сишарп не признаю.

А если исходников нет? Вы подменяете задачу.
ABI стандартизировать никто не будет. и RPC через сериализацию разных реализаций одного и того же класса невозможно. В рамках одной виртуальной машины - на здоровие, абы пан рады был.

DonDublon3 пишет:

Уж не знаю точно, как будет вестись передача между php.net-F# или IronPython-F#, но уверен на стопудов, что существенно проще.

репрезентация на уровне байт-кода от языка не зависит (?) - поэтому будет просто всё.

Tiphon пишет:

К тому же, есть очень удобные механизмы обмена данным между процессами. Как раз нормальными классами.

Это примерно как и передача между процессами нормальным XML. Все поля класса заморожены и специфицированы явно.

#128 29-07-10 15:43:29

DonDublon3
Участник
Из Уфа
Зарегистрирован: 06-05-10
Сообщений: 641

Re: Linuxway

whoknows пишет:

А если исходников нет? Вы подменяете задачу.
ABI стандартизировать никто не будет.

А если исходников нет - все равно я могу юзать чужой класс в своем приложении на любом дотнет-языке языках.
Стандартизировали же в дотнете. Могу писать наследников от класса, который пришел мне в виде бинарника.
Могу извлечь один класс из сборки, дизассемблировав в MSIL и пересобрав, это даже не будет хак.
В нативном коде такого вообще не может быть.


"Фу бля, крохобор вонючий" (с) Svart Testare

Неактивен

#129 29-07-10 15:55:02

whoknows
Гость

Re: Linuxway

DonDublon3 пишет:

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

в пределах одного инстанса виртуальной машины

DonDublon3 пишет:

В нативном коде такого вообще не может быть.

А как же щ код? В нативном коде может быть всё, что заблагорассудится. Хотя бы потому, что VM на нём написана wink

#130 29-07-10 16:46:44

DonDublon3
Участник
Из Уфа
Зарегистрирован: 06-05-10
Сообщений: 641

Re: Linuxway

whoknows пишет:
DonDublon3 пишет:

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

в пределах одного инстанса виртуальной машины

Вообще я не уверен, что это так, но даже если и так - это же все равно круче, чем с нативным кодом, где я не могу этого делать никак вообще!

whoknows пишет:
DonDublon3 пишет:

В нативном коде такого вообще не может быть.

А как же самомодифицирующийся код? В нативном коде может быть всё, что заблагорассудится. Хотя бы потому, что VM на нём написана wink

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


"Фу бля, крохобор вонючий" (с) Svart Testare

Неактивен

#131 29-07-10 16:49:16

Tiphon
Участник
Зарегистрирован: 08-07-10
Сообщений: 2,354

Re: Linuxway

whoknows пишет:

А как же самомодифицирующийся код? wink

А что мешает?


Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.

Неактивен

#132 29-07-10 18:28:26

Гареев Станислав
Вижуалкибергоп
Из Пятигорск
Зарегистрирован: 24-07-10
Сообщений: 3,103
Сайт

Re: Linuxway

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


Не ламерствуй лукаво.
"А петь мне нельзя - постановление суда" (с) Бендер

Неактивен

#133 29-07-10 19:02:28

Гареев Станислав
Вижуалкибергоп
Из Пятигорск
Зарегистрирован: 24-07-10
Сообщений: 3,103
Сайт

Re: Linuxway

То то маздайсофт и написал свой консольный интерпретатор с пасьянсами и дамами.


Не ламерствуй лукаво.
"А петь мне нельзя - постановление суда" (с) Бендер

Неактивен

#134 30-07-10 00:27:17

whoknows
Гость

Re: Linuxway

DonDublon3 пишет:

Вообще я не уверен, что это так, но даже если и так - это же все равно круче, чем с нативным кодом, где я не могу этого делать никак вообще!

А это примерно как статическая линковка. Ну и кто вам сказал, что я не могу подключить DLL в С++ с Delphi классами? Всё что надо иметь, чтобы вызвать член-функцию: 1) указатель на об'ект; 2) указатель на функцию; 3) знать calling convention
Всё чики-пуки, милорд smile

ты с такой проблемой сталкивался вообще? (мне лично не приходилось, я разнородный софт не юзаю - всё и так на C или С++ писано).

DonDublon3 пишет:

А при чем тут самомодифицирующийся код?

Это реализация вашего "поменяю класс, скомпилю, и подложу обратно", не?

Tiphon пишет:

А что мешает?

Собсна, ничего. Разве что asm целевой архитектуры знать надо.

Гареев Станислав пишет:

Это стало похоже на форум по вопросам программирования.

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

Редактировался whoknows (30-07-10 00:27:50)

#135 30-07-10 00:42:51

Tiphon
Участник
Зарегистрирован: 08-07-10
Сообщений: 2,354

Re: Linuxway

whoknows пишет:

А это примерно как статическая линковка. Ну и кто вам сказал, что я не могу подключить DLL в С++ с Delphi классами? Всё что надо иметь, чтобы вызвать член-функцию: 1) указатель на об'ект; 2) указатель на функцию; 3) знать calling convention
Всё чики-пуки, милорд smile

Ну ладно уж лукавить, что все так чикипуки и получается, милорд)
В .нет есть возможность переносить объекты "не думая" - они просто и там и сям - одинаковые объекты. А тут в разных языках и массивы располагаются по-разному и функции зовутся по-разному (ога) и т.д. И ничего чики-пуки не поулчается. Получается чики-трах-трах-трах-ояя!-пуки.

А что в пределах одной вм. так это же и ничего раз она вообще одна)))

Понимаешь она же и оптимизирована под это. У тебя подход джавовский. С точки зрения джавовских вм - это плохо. С точки зрения .нет... Ну понятно)

Редактировался Tiphon (30-07-10 00:43:43)


Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.

Неактивен

#136 30-07-10 01:21:03

Skipper_gmr
Участник
Зарегистрирован: 15-07-10
Сообщений: 141

Re: Linuxway

Mike22 пишет:

Skipper_gmr:

> Причем тут линуксоиды?

При том, что им подобные квесты приходится проходить много чаще.

> Вам вообще компьютер противопоказан, ибо нервные клетки не восстанавливаются.

Исходя из таких соображений, вам вообще жизнь противопоказана. Убейте себя, не тратьте нервные клетки.

1) Какие квесты? Я из Synaptica могу себе любую библиотеку найти и поставить. И процесс этот будет куда меньше,как по времени,так и по количеству других действий.
2) Я дал вам дельный совет, чтоб сохранить ваше здоровье и больше прожить, а вы мне смерти желаете. А потом еще говорят, что это линуксоиды злые и неадекватные.


"Ненависть к Microsoft является болезнью" (с) Линус Торвальдс

Неактивен

#137 30-07-10 01:23:22

whoknows
Гость

Re: Linuxway

Tiphon пишет:

В .нет есть возможность переносить объекты "не думая" - они просто и там и сям - одинаковые объекты.

Да, жаба-дотнет в этом плане щ. Інфа 100% smile

Tiphon пишет:

А тут в разных языках и массивы располагаются по-разному и функции зовутся по-разному (ога) и т.д.

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

Tiphon пишет:

А что в пределах одной вм. так это же и ничего раз она вообще одна)))

Не так. В пределах одного инстанса VM. Это разные щ. Совместимость классов разных версий с одинаковым полным именем не гарантируется (при передаче между разными инстансами VM). Банальный пример - добавил новое поле. Как мне его при десериализации об'екта без данного поля получить? Генерить рандомом?

Tiphon пишет:

Понимаешь она же и оптимизирована под это.

Под что? Сосание разных библиотек-бинарей-на-ML?

Tiphon пишет:

У тебя подход джавовский.

Это не жавовский подход - это просто закон природы, что совместимости несовместимых версий нет.

#138 30-07-10 02:28:39

Tiphon
Участник
Зарегистрирован: 08-07-10
Сообщений: 2,354

Re: Linuxway

whoknows пишет:
Tiphon пишет:

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

Ну вот у фортрана все переменные в процедурах, на самом деле, передаются ссылками. Интересное со строками.

Внимание (!) фокус-покус:
Например, если есть
procedure mypro(string), то тк.к. строки в фортране задаются в виде: массив чаров + инт - длинна, то в длл такая функция будет выглядеть
mypro_(char *, int*).
Ладно там про подчеркивание (которое зависит от компилятора) - можно посмотреть имена функций в самом длл.
Самое интересное тут с int*. Если у тебя есть строка и еще переменные в фотрановской функции, например:
procedure mypro(string, string), то в зависимости от флага компилятора можно делать, чтобы инты с длинной шли за своими char* либо в конце списка переменных. Т.е. на выходе, в зависимости от флага будет:
mypro_(char *, int*, char *, int*)
либо
mypro_(char *, char *, int*, int*)

Ну вот. Дальше если у тебя есть процедура на фортране procedure mypro(string, int). Даже если у тебя есть документация по функции и dll. Если ты не знаешь, с каким флагом это компилировалось, то имея
mypro_( char *, int*,  int*) - ты не сможешь определить кто из этих интов - параметр, а кто- длинна строки))

whoknows пишет:

Совместимость классов разных версий с одинаковым полным именем не гарантируется (при передаче между разными инстансами VM). Банальный пример - добавил новое поле. Как мне его при десериализации об'екта без данного поля получить? Генерить рандомом?

Не, после устроенного ими dll hell-а они тут очень тщательно сделали работу с версиями сборок.
Зырь:
https://msdn.microsoft.com/en-us/library … 71%29.aspx
И просто про сборки
https://msdn.microsoft.com/en-us/library … 71%29.aspx

Относительно десериализации об'екта - тут все просто. Если ты делаешь их встроенным бинарным сериалайзером, то он, наверное (не проверял), отвалится с исключением, когда проверит карту графов. Если ты ждешь такого поведения от объектов, то включи свой сериалайзер, который умеет решать эту проблему нужным тебе способом. Например у меня сейчас прога, там файлы конфигурации (которые сериализуются в хмл). Каждую версию программы туда добавляется несколько новых объектов и иногда убираются старые. Сделано, что в случае такой не стыковки - задаются значения по умолчанию. С точки зрения самих объектов - ничего не меняется. Т.е. как у них стояли атрибуты

[Serialisable]
public int Property...

Так и стоят. А еще добавляется
[ConfigItem(default="bla nla", description = "la la lo")]

Т.е. с точки зрения кода ничего не меняется, а дело решается механизмом атрибутов. Я же писал - сильная штука. И все чинно. А что подписывать надо - так по-любому если ты ожидаешь такого поведения от объектов, то должен это как-то решать. А .нет опять же, предоставляет механизмы. Ту же работу с графами)

Редактировался Tiphon (30-07-10 02:33:44)


Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.

Неактивен

#139 30-07-10 02:49:38

whoknows
Гость

Re: Linuxway

Tiphon пишет:

Ну вот. Дальше если у тебя есть процедура на фортране procedure mypro(string, int). Даже если у тебя есть документация по функции и dll. Если ты не знаешь, с каким флагом это компилировалось, то имея
mypro_( char *, int*,  int*) - ты не сможешь определить кто из этих интов - параметр, а кто- длинна строки))

Простое решение видится мне - выдавать С(С++)-заголовочный файл к такой DLL. Это - стандарт де-факто. Паскалисты сами себе могут из этого модуль сгенерить. А имея нормальную сигнатуру (а не как на фортране) + возвращаемое значение - можно спокойно кодить. Да, если уж 1 раз опубликовал сигнатуры + ретурн типы - будь бобр за тем, как компиляешь следить.

Tiphon пишет:

Если ты ждешь такого поведения от объектов, то включи свой сериалайзер, который умеет решать эту проблему нужным тебе способом.

Ручма всё делать? Ну это да, безотказный способ smile

Tiphon пишет:

Сделано, что в случае такой не стыковки - задаются значения по умолчанию.

Для конфигурации - работает (а иногда нет), потому что человек сам себе буратина и сам заботится как-то о том, как распарсить XML.
А для HashSet (абсолютно разные реализации от разных вендоров)?
Мне пофиг на хомячков с их конфигами - я делаю сохранение состояния среды выполнения, допустим, и хочу это восстановить при след. старте системы

Да, кстати, типичная поделка от MS - путают сериализацию с интерпретацией данных. Неточная десериализация - отличный путь к потерянным данным (когда при трансформации A_42 -> XML -> A_40 -> XML -> A_42 мы имеем потерянные или искажённые данные).

Tiphon пишет:

Не, после устроенного ими dll hell-а они тут очень тщательно сделали работу с версиями сборок.
Зырь:
https://msdn.microsoft.com/en-us/library … 71%29.aspx
И просто про сборки
https://msdn.microsoft.com/en-us/library … 71%29.aspx

Вот эта хня позволяет держать загруженными два класса одновременно - разные версии но одинаковые имена?
По MSDN не очень понятно

Редактировался whoknows (30-07-10 03:00:43)

#140 30-07-10 03:55:17

Tiphon
Участник
Зарегистрирован: 08-07-10
Сообщений: 2,354

Re: Linuxway

whoknows пишет:

Вот эта хня позволяет держать загруженными два класса одновременно - разные версии но одинаковые имена?
По MSDN не очень понятно

Канечна. Хочешь, на стадии дизайна:
https://blogs.msdn.com/b/abhinaba/archiv … 98278.aspx

А хочешь, на стадии исполнения (ссылку лень искать, но если попросишь - найду. Там элментарно через отражения).

whoknows пишет:

Простое решение видится мне - выдавать С(С++)-заголовочный файл к такой DLL. Это - стандарт де-факто. Паскалисты сами себе могут из этого модуль сгенерить. А имея нормальную сигнатуру (а не как на фортране) + возвращаемое значение - можно спокойно кодить. Да, если уж 1 раз опубликовал сигнатуры + ретурн типы - будь бобр за тем, как компиляешь следить.

Ну это очень оптимистично)) На практике такого нет. И это только один из примеров с фортраном (с только одним языком). Но пример хорош тем, что на фортране писали с 78 года и до сих пор много чего работает. Причем в каких местах! В ПО защиты на АЭС, например. Никто там хедеров не делал, я тебя умоляю.
Я не говорю, что что-то - невозможно. Я говорю: Ну ладно уж лукавить, что все так чикипуки и получается, милорд) Получается чики-трах-трах-трах-ояя!-пуки.

По поводу сериализации, есть на то и встроенные средства:
https://msdn.microsoft.com/en-us/library … 80%29.aspx
Но еще ты можешь реализовать через вот так
https://msdn.microsoft.com/en-us/library … zable.aspx

Редактировался Tiphon (30-07-10 04:03:42)


Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.

Неактивен

#141 30-07-10 04:15:07

whoknows
Гость

Re: Linuxway

Tiphon пишет:

А хочешь, на стадии исполнения

Ок, есть аналоги жабовским фичам значит. smile Это свой ворох проблем рождает, но там совсем не unixway smile

НО! Всё равно это не позволяет из A_42 получить A_40. Это концептуальная проблема, нерешаемая в щ случае при незамороженном API.
НО! Решается проблема, когда 2 разные слабосвязанные подсистемы используют обратно несовместимые классы (такое есть и под жаба - правда, 3rd party libs).
Под слабосвязанными я понимаю: a) не обмениваются инстансами класса A (будет швах "по причинческим технинам") б) в терминологии жабы - загружены разными класслоадерами.
Требования обязательны. 1-й - понятно, думаю, почему (A_40 не имеет A::getX(), а A_42 уже имеет). 2-й - потому что нет в языке средства (кроме рихлекшына), который бы позволил предсказать, какая версия об'екта будет создана при вызове A a = new A(); Непонятно какой конструктор вызывать и ссылку какого типа задавать для a. В рехлекшыне можно (в терминах жабы) задать, об'ект класса какого класслоадера нужно создавать. Но это неязыковое средство.

Если "остапа понесло", то бывает smile

Tiphon пишет:

Получается чики-трах-трах-трах-ояя!-пуки.

В реале может быть. Хотя, если честно, ничего кроме связки (.h + .dll) видеть не доводилось. Не, доводилось, просто .dll smile
Под линухом не доводилось - там сразу .h есть. А также сразу как бонус (почти всегда) - статически линкуемые библиотеки. Под виндой такое редкость.

Таким образом: да, проблема с нативным кодом на разных языках, де-факто, есть (теоретически, избегаемая). Под виндой она (наверное - не мне судить) более серьёзная. Под линухом - менее (C там откровенно доминирует, заголовки есть всегда).

Добавлено спустя 06 мин 43 с:

Tiphon пишет:

По поводу сериализации, есть на то и встроенные средства:
https://msdn.microsoft.com/en-us/library … 80%29.aspx
Но еще ты можешь реализовать через вот так
https://msdn.microsoft.com/en-us/library … zable.aspx

В жаба такое всё есть.
Насчёт того, что если сделана кастомная сериализация или эктернализация - можно ли десериализовать другую версию класса, вроде в жабе такое сделать нельзя (про Externalizable не знаю почти ничего, to my shame, про кастомный Serializable почти уверен, что нельзя, но не на 100% - надо чекать).
Это покрывает 80% кейсов ("структуры" + контейнеры), если версия там не чекается.

#142 30-07-10 10:12:13

DonDublon3
Участник
Из Уфа
Зарегистрирован: 06-05-10
Сообщений: 641

Re: Linuxway

whoknows пишет:

А это примерно как статическая линковка. Ну и кто вам сказал, что я не могу подключить DLL в С++ с Delphi классами? Всё что надо иметь, чтобы вызвать член-функцию: 1) указатель на об'ект; 2) указатель на функцию; 3) знать calling convention
Всё чики-пуки, милорд

ты с такой проблемой сталкивался вообще? (мне лично не приходилось, я разнородный софт не юзаю - всё и так на C или С++ писано).

Гм. Ну разумеется, так не получится. Ибо объекты высшего уровня используются по-разному, в Delphi TObject существуенно больше (тупо, по размеру) чем аналог в C++. Если хочешь посмотреть, для данного частного случая, то тебе потребуется С++ builder, там этот объявление этого TObject занимает около 150 строк, я щас специально посмотрел.

Ты правильно написал, что нам нужен будет указатель на объект, функции его и calling convention. Но как ты поедставляешь себе это на практике? Указатели на объекты автоматически не генерятся, это невозможно, разве что на функции, причем строго те которые экспортируются, безо всяких calling convention, а также параметров. Неужели создатель будет искать своей в длл-ке указатели на класс? Разумеется, нет. А если не укажет создатель, не разберется никто кроме супер-мега хакера.
В дотнете же все это делается (указывается) само, на блюдечке. Пользуйтесь классами повторно, дорогие программисты smile

С проблемой сталкивался, да. У нас большая программа на Delphi, понадобилось подключить либу на С, причем не удинственный раз, потому что Delphi уже непопулярен, все наработки под С делаются.

whoknows пишет:

Это реализация вашего "поменяю класс, скомпилю, и подложу обратно", не?

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


"Фу бля, крохобор вонючий" (с) Svart Testare

Неактивен

#143 30-07-10 18:34:21

whoknows
Гость

Re: Linuxway

DonDublon3 пишет:

Ибо объекты высшего уровня используются по-разному, в Delphi TObject существуенно больше (тупо, по размеру) чем аналог в C++.

предлагаю подумать сначала, во что транслируется (если записать на языке С)
1) вызов член-функции
2) щ к полю об'екта
3) наследование (виртуальное и обычное)
Просто ты мыслишь не на том уровне абстракции, какой нужен для иcпользования динамически линкуемого кода.

DonDublon3 пишет:

Указатели на объекты автоматически не генерятся

указатель - это число. я могу сгенерить его на что угодно, хоть на пустое место. (случай множественного наследования опустим). Да и генерить его не нужно. после трансляции 1) в код ты это сам увидишь.

DonDublon3 пишет:

С проблемой сталкивался, да.

Давай технические детали разберём?

DonDublon3 пишет:

об исходниках которой не знаю ничего

Давай конкретный пример, будет предметнее

DonDublon3 пишет:

В нативной длл-ке для человека, который ее заюзает, нету ничего вообще. Просто мешанина, бинарный поток.

Адрес входа в функцию есть? Есть. Сигнатура есть? Есть. Если есть дебаг инфа - то щ всего вычисляется и размер тела функции. Чего не хватает?

DonDublon3 пишет:

поэтому для того чтобы кто-то заюзал длл-ку Имярека, он должен прикладывать к ней .h - файл, причем только с описаниями функций, а не классов, потому что классы тут не при чем.

Если инфа о сигнатурах отсутствует в DLL или so (вопросом не владею) - то никуда не деться. "Сборки" дотнетовские - суть все с дебаг информацией. Потому оттуда выдрать можно всё что хош. Как и из DLL с дебаг инфой.

#144 31-07-10 12:06:44

DonDublon3
Участник
Из Уфа
Зарегистрирован: 06-05-10
Сообщений: 641

Re: Linuxway

whoknows пишет:

предлагаю подумать сначала, во что транслируется (если записать на языке С)
1) вызов член-функции
2) обращение к полю об'екта
3) наследование (виртуальное и обычное)
Просто ты мыслишь не на том уровне абстракции, какой нужен для иcпользования динамически линкуемого кода.

Возможно, я не строю из себя гуру.
Но объектности на уровне нативного кода просто нет, уж это я понимаю. Просто потому что то, что является объектом для С++, не будет объектом для других языков, того же Delphi, к примеру. Поэтому все три пункта на уровне нативного кода смысла не имеют, поскольку объектности там нет, а они относятся именно к объектам.

whoknows пишет:

указатель - это число. я могу сгенерить его на что угодно, хоть на пустое место.

Сгенерить можешь, трабла в том, что при переходе на другой язык (а возможно, просто даже на другой компилятор того же языка) потеряет смысл то, на что указатель указывает.

whoknows пишет:

Давай технические детали разберём?

Ну давай. Итак, задача 1. К программе на Delphi подцепить библиотеку на чистом С, называется МETIS, для разбиения графов. На вход - 2 или 3 целочисленных массива, на выход - один, тоже целочисленный. В Delphi я, понятно дело, создаю TintegerDynArray, который содержит в себе длину, а также, в зависимости от настроек компиляции, умеет ее контролировать. В чистом С этого нет, в С++ тоже нет. ( как отступление: наши коллеги в соседней комнате, пишущие на С++, используют Boost для массивов. Разумеется, массив из boost не равен TintegerDynArray.) В результате я передаю указатель на первый элемент массива, при этом в сишной либе указываю, что он именно integer, и отдельно передаю его длину. Больше вариантов нет.
В дотнете же массивы стандартизованы для любого языка. Чисто технически от этого стандарта, конечно, отступпить можно, но зато "общий знаменатель" для данных из разных источников - существенно больше.

Задача №2. Встраиваю в Delphi интерпретатор Python. Тут разнобой объектов можно наблюдать вообще во всей красе. Про Delphi вообще можно забыть, типы и для С не одинаковы даже для чисел! API Питона изобилует функциями типа Py_IntegerFromLong и обратно, преобразовывая целые числа, действительные, строки. Ну про даты вообще молчу, понятно что надо преобразовывать. А для объектов даже простые указатели не подходят, как ты говорил. Приходится делать следующую вещь:
класс TpyObject
     ... GetSelf: PpyObject
где TpyObject - объект, с которым может работать Delphi, PpyObject - указатель, с которым может работать Питон. В общем, разнобой полный.

whoknows пишет:

Адрес входа в функцию есть? Есть. Сигнатура есть? Есть. Если есть дебаг инфа - то чаще всего вычисляется и размер тела функции. Чего не хватает?

Адрес есть, и на этом все. Сигнатуру можно получить только из исходников. Причем, а если переметром функции является объект, откуда его брать? Все, финиш. дебаг инфу люди другим как правило не предоставляют, только для себя.

whoknows пишет:

"Сборки" дотнетовские - суть все с дебаг информацией.

Ну эта дебаг-информация там очень богата, очень. А главное - всегда есть smile Причем для любого языка. И для связки IronPython-F# не надо будет писать прослойку на С, как для просто Python-Ocaml. Что и требовалось доказать smile

Редактировался DonDublon3 (31-07-10 12:14:51)


"Фу бля, крохобор вонючий" (с) Svart Testare

Неактивен

#145 31-07-10 14:13:55

Tiphon
Участник
Зарегистрирован: 08-07-10
Сообщений: 2,354

Re: Linuxway

Да, вы тут серьезно о разном говорите.


Квантовая механика - "малопонятный математический курьёз" (с) msAVA - современный учитель.

Неактивен

#146 02-08-10 02:57:46

whoknows
Гость

Re: Linuxway

Ну давай. Итак, задача 1.

Да, с интеграцией придётся поработать. Это человекочасы, но технических непреодолимых препятствий нет - они там же и решены.

Адрес есть, и на этом все. Сигнатуру можно получить только из исходников. Причем, а если переметром функции является объект, откуда его брать? Все, финиш. дебаг инфу люди другим как правило не предоставляют, только для себя.

Универсальный алгоритм (не всегда лучший):
1. убедиться, что в бинарнике в область памяти с кодом можно писать (если нет - выставить нужный флаг)
2. убедиться, что размер у функции больший, чем длина команды прямого вызова функции по абс. адресу + ret. (для интел 86-32 - 5 + 1 байтов - обычно выполняется из-за записи фреймов в стек)
3. написать модифицированную функцию в свободной области памяти кода (let it be f())
4. поменять первые байты исходной функции на
call f
ret;

дело сделано, код модифицирован. не так всё красиво, как щ с класслоадерами и прочей мутью, но работает. Плюсы: не нужна перелинковка. Минусы: не всегда применим.
Можно подкладывать нужную dll, но нужна будет перелинковка всего - это геморнее.

За сим раскланиваюсь.

Kwork.ru - услуги фрилансеров от 500 руб.
Мой VPS с 2016 года !
✅ Виртуальные от 300 ₽/месяц, RAM 1-10GB, DISK 20-360 GB;
✅ Выделенные от 3000 ₽/месяц. RAM 4-64GB, DISK до 4TB;
✅ Intel Xeon, SSD, XEN, iLO/KVM, Windows/Linux, Администрирование;
✅ Бесплатно Full Backup и Anti-DDoS.





Подвал форума

Под управлением FluxBB
Модифицировал Visman

Яндекс.Метрика