LINUX.ORG.RU

История изменений

Исправление witaway, (текущая версия) :

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

Глянул, а в питоне уже есть решение. Правда не элегантное. В C# тоже есть, уже приятное и довольно интуитивное.

Боюсь даже представить, как оно может работать внутри. В шарпике ты просто декорируешь делегат как UnmanagedFunctionPointer и оно работает из коробки. Предполагаю, на уровне рантайма происходит следующее:

  1. Каким-то образом, на уровне рантайма, проверяется совместимость входных аргументов и выходного значения. int, double, char, long должен быть по размеру как низкоуровневые платформозависимые аналоги; никаких классов; только статические методы. Что в сишарпе с его статической типизацией задача вполне решаемая, а в питоне с этой всей динамикой надо ещё попотеть.

  2. Все эти типы, естественно, анбоксятся.

  3. Каким-то образом, динамически в адресном пространстве создаётся машинный код, принимающий всё это дело и сразу же передающий обратно на выполнение в CLR на выполнение - при этом надо каким-то образом обеспечить совместимость независимо от платформы.

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

P.s. Посмотрел шарповый биндинг курла - там взаимодействие максимально простое через коллбеки. Да. Очередей не надо никаких. Очереди, потоки, лонг поллинги это всё-таки больше для интенсивного месседжинга.

Исправление witaway, :

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

Глянул, а в питоне уже есть решение. Правда не элегантное. В C# тоже есть, уже приятное и довольно интуитивное.

Боюсь даже представить, как оно может работать внутри. В шарпике ты просто декорируешь делегат как UnmanagedFunctionPointer и оно работает из коробки. Предполагаю, на уровне рантайма происходит следующее:

  1. Каким-то образом, на уровне рантайма, проверяется совместимость входных аргументов и выходного значения. int, double, char, long должен быть по размеру как низкоуровневые платформозависимые аналоги; никаких классов; только статические методы. Что в сишарпе с его статической типизацией задача вполне решаемая, а в питоне с этой всей динамикой надо ещё попотеть.

  2. Все эти типы, естественно, анбоксятся.

  3. Каким-то образом, динамически в адресном пространстве создаётся машинный код, принимающий всё это дело и сразу же передающий обратно на выполнение в CLR на выполнение - при этом надо каким-то образом обеспечить совместимость независимо от платформы.

Рад, что это всё есть и уже работает. Меньше рвать жопу придётся. Если знаешь, как это работает на самом деле - буду рад пояснению.

P.s. Посмотрел шарповый биндинг курла - там взаимодействие максимально простое через коллбеки. Да. Очередей не надо никаких. Очереди, потоки, лонг поллинги это всё-таки больше для интенсивного месседжинга.

Исправление witaway, :

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

Глянул, а в питоне уже есть решение. Правда не элегантное. В C# тоже есть, уже приятное и довольно интуитивное.

Боюсь даже представить, как оно может работать внутри. В шарпике ты просто декорируешь делегат как UnmanagedFunctionPointer и оно работает из коробки. Предполагаю, на уровне рантайма происходит следующее:

  1. Каким-то образом, на уровне рантайма, проверяется совместимость входных аргументов и выходного значения. int, double, char, long должен быть по размеру как низкоуровневые платформозависимые аналоги; никаких классов; только статические методы. Что в сишарпе с его статической типизацией задача вполне решаемая, а в питоне с этой всей динамикой надо ещё попотеть.

  2. Все эти типы, естественно, анбоксятся.

  3. Каким-то образом, динамически в адресном пространстве создаётся машинный код, принимающий всё это дело и сразу же передающий обратно на выполнение в CLR на выполнение - при этом надо каким-то образом обеспечить совместимость независимо от платформы.

Рад, что это всё есть и уже работает. Меньше рвать жопу придётся. Если знаешь, как это работает на самом деле - буду рад пояснению.

P.s. Посмотрел шарповый биндинг курла - там взаимодействие максимально простое через коллбеки. Да. Очередей не надо никаких. Очереди, потоки, лонг поллинги это, наверное, больше для интенсивного месседжинга.

Исходная версия witaway, :

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

Глянул, а в питоне уже есть решение. Правда не элегантное. В C# тоже есть, уже приятное и довольно интуитивное.

Боюсь даже представить, как оно может работать внутри. В шарпике ты просто декорируешь делегат как UnmanagedFunctionPointer и оно работает из коробки. Предполагаю, на уровне рантайма происходит следующее:

  1. Каким-то образом, на уровне рантайма, проверяется совместимость входных аргументов и выходного значения. int, double, char, long должен быть по размеру как низкоуровневые платформозависимые аналоги; никаких классов; только статические методы. Что в сишарпе с его статической типизацией задача вполне решаемая, а в питоне с этой всей динамикой надо ещё попотеть.

  2. Все эти типы, естественно, анбоксятся.

  3. Каким-то образом, динамически в адресном пространстве создаётся машинный код, принимающий всё это дело и сразу же передающий обратно на выполнение в CLR на выполнение - при этом надо каким-то образом обеспечить совместимость независимо от платформы.

Рад, что это всё есть и уже работает. Меньше рвать жопу придётся. Если знаешь, как это работает на самом деле - буду рад пояснению.