Вызывать функции на основе rpython из стандартного кода Python
Я уже неделю работаю с исходным деревом pypy и придумал следующий вопрос - есть ли способ построить программу rpython как общий объект, который предоставляет некоторые из его функций (скажем, список функций) для стандартного cpython vm другими словами, я хочу, чтобы эта функция вызывалась из скрипта Python через импорт общих объектов. Когда я пытаюсь построить свою программу так:
python rpython --shared -O2 some_program.py
libmyprogram-c.so фактически генерируется, хотя и не импортируется из cpython. Должен ли я использовать CFFI для cpython дальше, или в фреймворке rpython есть какое-то средство (декоратор или что-то в этом роде), которое должно его красиво вырезать?
1 ответ
Нет действительно удобного способа сделать это. Как вы описываете: напишите программу RPython, включите в libmyprogram-c.so
, а затем получить доступ к этой библиотеке C из CPython, например, с помощью cffi.
Более подробно, вы бы написали исходный код RPython так, чтобы .so
экспортирует C API по вашему выбору, используя декоратор rpython.rlib.entrypoint.entrypoint_highlevel()
, Но затем вы получаете библиотеку C, которая работает на уровне C. Нет ничего, что могло бы помочь вам обойти объект Python - у вас есть только C-типы. Например, нет понятия структур данных, таких как "список" или "dict", и нет автоматического управления временем жизни через границу.
Кроме того, отладка исходного кода RPython, который делает libmyprogram-c.so
это сложнее, чем отладка обычной библиотеки Си. Обычная рекомендация - тщательно протестировать программу или библиотеку RPython, прежде чем пытаться перевести ее на C, потому что, по крайней мере, вы можете отлаживать ее при тестировании поверх Python.
RPython светит только тогда, когда вы используете его сборщик мусора, настроенный на высокую скорость выделения и, что наиболее важно, его генератор компилятора "точно в срок", создающий JIT-компилятор из программы RPython, если последний вид динамического интерпретатора. Если вы не пользуетесь этим, тогда RPython плохо подходит. Если вы делаете, однако, это другая история:-)