История изменений
Исправление witaway, (текущая версия) :
У меня почему-то не гуглился ответ на вопрос - а картинка у меня в голове, как должна выглядеть такая поддержка коллбеков в низкоуровневый язык представлялась очень сложной.
Глянул, а в питоне уже есть решение. Правда не элегантное. В C# тоже есть, уже приятное и довольно интуитивное.
Боюсь даже представить, как оно может работать внутри. В шарпике ты просто декорируешь делегат как UnmanagedFunctionPointer
и оно работает из коробки. Предполагаю, на уровне рантайма происходит следующее:
-
Каким-то образом, на уровне рантайма, проверяется совместимость входных аргументов и выходного значения. int, double, char, long должен быть по размеру как низкоуровневые платформозависимые аналоги; никаких классов; только статические методы. Что в сишарпе с его статической типизацией задача вполне решаемая, а в питоне с этой всей динамикой надо ещё попотеть.
-
Все эти типы, естественно, анбоксятся.
-
Каким-то образом, динамически в адресном пространстве создаётся машинный код, принимающий всё это дело и сразу же передающий обратно на выполнение в CLR на выполнение - при этом надо каким-то образом обеспечить совместимость независимо от платформы.
Рад, что это всё есть и уже работает. Меньше рвать жопу придётся. Если знаешь, как это работает на самом деле - буду рад пояснению или направлению, где искать.
P.s. Посмотрел шарповый биндинг курла - там взаимодействие максимально простое через коллбеки. Да. Очередей не надо никаких. Очереди, потоки, лонг поллинги это всё-таки больше для интенсивного месседжинга.
Исправление witaway, :
У меня почему-то не гуглился ответ на вопрос - а картинка у меня в голове, как должна выглядеть такая поддержка коллбеков в низкоуровневый язык представлялась очень сложной.
Глянул, а в питоне уже есть решение. Правда не элегантное. В C# тоже есть, уже приятное и довольно интуитивное.
Боюсь даже представить, как оно может работать внутри. В шарпике ты просто декорируешь делегат как UnmanagedFunctionPointer
и оно работает из коробки. Предполагаю, на уровне рантайма происходит следующее:
-
Каким-то образом, на уровне рантайма, проверяется совместимость входных аргументов и выходного значения. int, double, char, long должен быть по размеру как низкоуровневые платформозависимые аналоги; никаких классов; только статические методы. Что в сишарпе с его статической типизацией задача вполне решаемая, а в питоне с этой всей динамикой надо ещё попотеть.
-
Все эти типы, естественно, анбоксятся.
-
Каким-то образом, динамически в адресном пространстве создаётся машинный код, принимающий всё это дело и сразу же передающий обратно на выполнение в CLR на выполнение - при этом надо каким-то образом обеспечить совместимость независимо от платформы.
Рад, что это всё есть и уже работает. Меньше рвать жопу придётся. Если знаешь, как это работает на самом деле - буду рад пояснению.
P.s. Посмотрел шарповый биндинг курла - там взаимодействие максимально простое через коллбеки. Да. Очередей не надо никаких. Очереди, потоки, лонг поллинги это всё-таки больше для интенсивного месседжинга.
Исправление witaway, :
У меня почему-то не гуглился ответ на вопрос - а картинка у меня в голове, как должна выглядеть такая поддержка коллбеков в низкоуровневый язык представлялась очень сложной.
Глянул, а в питоне уже есть решение. Правда не элегантное. В C# тоже есть, уже приятное и довольно интуитивное.
Боюсь даже представить, как оно может работать внутри. В шарпике ты просто декорируешь делегат как UnmanagedFunctionPointer
и оно работает из коробки. Предполагаю, на уровне рантайма происходит следующее:
-
Каким-то образом, на уровне рантайма, проверяется совместимость входных аргументов и выходного значения. int, double, char, long должен быть по размеру как низкоуровневые платформозависимые аналоги; никаких классов; только статические методы. Что в сишарпе с его статической типизацией задача вполне решаемая, а в питоне с этой всей динамикой надо ещё попотеть.
-
Все эти типы, естественно, анбоксятся.
-
Каким-то образом, динамически в адресном пространстве создаётся машинный код, принимающий всё это дело и сразу же передающий обратно на выполнение в CLR на выполнение - при этом надо каким-то образом обеспечить совместимость независимо от платформы.
Рад, что это всё есть и уже работает. Меньше рвать жопу придётся. Если знаешь, как это работает на самом деле - буду рад пояснению.
P.s. Посмотрел шарповый биндинг курла - там взаимодействие максимально простое через коллбеки. Да. Очередей не надо никаких. Очереди, потоки, лонг поллинги это, наверное, больше для интенсивного месседжинга.
Исходная версия witaway, :
У меня почему-то не гуглился ответ на вопрос - а картинка у меня в голове, как должна выглядеть такая поддержка коллбеков в низкоуровневый язык представлялась очень сложной.
Глянул, а в питоне уже есть решение. Правда не элегантное. В C# тоже есть, уже приятное и довольно интуитивное.
Боюсь даже представить, как оно может работать внутри. В шарпике ты просто декорируешь делегат как UnmanagedFunctionPointer
и оно работает из коробки. Предполагаю, на уровне рантайма происходит следующее:
-
Каким-то образом, на уровне рантайма, проверяется совместимость входных аргументов и выходного значения. int, double, char, long должен быть по размеру как низкоуровневые платформозависимые аналоги; никаких классов; только статические методы. Что в сишарпе с его статической типизацией задача вполне решаемая, а в питоне с этой всей динамикой надо ещё попотеть.
-
Все эти типы, естественно, анбоксятся.
-
Каким-то образом, динамически в адресном пространстве создаётся машинный код, принимающий всё это дело и сразу же передающий обратно на выполнение в CLR на выполнение - при этом надо каким-то образом обеспечить совместимость независимо от платформы.
Рад, что это всё есть и уже работает. Меньше рвать жопу придётся. Если знаешь, как это работает на самом деле - буду рад пояснению.