Мне нужно что-то (например, аннотации, отражения, определения или что-то совершенно другое), которое я могу добавить к произвольному вызову функции или функции.
Для каждой функции f
, который имеет это что-то, добавленная конкретная функция t
должны вызываться с параметрами f
,
Функция t
Теперь должен отправить свои параметры по сети другой программе.
Есть ли способ сделать что-то подобное?
Общий принцип за этим называется marshalling
где параметры функции упакованы таким образом, что вы можете отправить их на другой компьютер. Отправитель маршаллизирует параметры, получатель демаршаллирует. Оба должны иметь представление о типах и должны делать это в соответствии с различными компьютерными архитектурами.
Удаленные вызовы процедур (RPC) являются одним из способов отправки вызовов функций с одного компьютера на другой и требуют некоторой сортировки за ними.
XMLRPC, как отметил Виктор, является одним из способов сделать это, когда сортировка происходит через XML. Существует множество других пакетов, и поиск в Google для RPC и маршаллинга должен дать больше возможностей, но XMLRPC может быть именно тем, что вам нужно.
CORBA и DCOM являются родственным механизмом. Идея отправки вызовов функций между компьютерами является одной из основных концепций в распределенных системах, так что, возможно, посмотрите немного подробнее, возможно, есть очень простые решения вашей конкретной проблемы.
XMLRPC библиотека может быть той, которую вы ищете, если вы просто хотите вызвать функцию на удаленном компьютере. Он генерирует код для маршалинга параметров с использованием спецификаций XML RPC.
Вы можете использовать Google Protocol Buffers для этого: https://developers.google.com/protocol-buffers/docs/overview
Это простая в использовании и переносимая библиотека сериализации. Кроме того, вы сможете писать программы, способные «общаться» с вашим кодом C ++ (десериализовать объекты, сериализованные вашим кодом C ++) на разных языках, таких как Python, Java и другие, что может быть очень полезно, например, для упрощения тестирования. ,
Если вы находитесь в среде Linux / BSD, выполните ‘man rpcgen’. Мне было проще создавать распределенные приложения, чем DCE / CORBA.
Давайте дадим то, что вы пытаетесь сделать имя, «вызов функции внутри процесса» или IFC.
Я работал над компилятором IFC (ifcc) для создания масштабируемых облачных приложений со встроенной в приложения видимостью на основе браузера в реальном времени.
Прототип компилятора работает. Часть видимости платформы также работает, но еще не интегрирована в компилятор для генерации инструментального кода.
Ifcc принимает в качестве входных данных файл включения C и, основываясь на объявлениях прототипов функций в файле .h, генерирует исходный код C для маршаллинга и клиентские и серверные прокси / заглушки, подходящие для гетерогенного использования (заботится о порядке следования байтов). / big endian / little endian) окружающая среда.
И, кстати, ifcc — умный компилятор. Он не только обрабатывает массивы, определения типов, вложенные структуры и т. Д., Но также выполняет произвольную погоню за указателями. Например. если вы вызываете функцию с указателем на список двойных ссылок, она упаковывает его, отправляет и воссоздает список двойных ссылок на принимающей стороне.
Если люди хотят поиграть с ним, добавьте комментарий с выводом «uname -a» вашей системы, а также с тем, какой компилятор вы используете. Если есть большой интерес, я могу сделать его доступным для разработчиков, чтобы учиться / играть / экспериментировать.