Интеграция скриптового языка в приложение C ++ - PullRequest
8 голосов
/ 23 сентября 2010

Я действительно новичок в C ++ и столкнулся с проблемой, которую не смог решить, прочитав документацию.

Я хочу встроить язык сценариев в мое приложение c ++. Этим языком может быть javascript, lua или предпочтительно python.

Я не ищу что-то вроде Boost.Python / swig, что-то, что может обернуть мои функции / классы c ++ в интерфейс python, а скорее python_evaluate_and_return_result_as_variable("my_code"); функцию.

У меня есть целая куча структур, содержащих несколько целых чисел:

struct my_integers {
    int a;
    int b;
    int c;
    int d;
    int e;
};

Теперь я хочу сделать некоторые математические вычисления с этими целыми числами, например:

i.a = i.c * i.e;

Математика, которую я хочу сделать, в будущем сильно изменится, и мне нужны люди, а не я, чтобы иметь возможность менять математику без доступа к коду C ++.

Я думаю о такой структуре кода:

  1. Я инициализирую свою структуру и заполняю ее начальными значениями
  2. Я загружаю внешнюю функцию python, скажем, "my_python_function", которая принимает структуру в качестве аргумента и выполняет математическую обработку с ней перед возвратом.
  3. Я получаю свою структуру как i = my_python_function_cppwrapper(i)

Возможно ли что-то подобное? Я много гуглял по этому поводу, но единственное, что мне кажется, это обертки, которые обеспечивают функциональность c ++ -> python (или наоборот) без реального взаимодействия с переменными.

Я был бы очень благодарен за любую помощь,
Робин.

Ответы [ 9 ]

8 голосов
/ 23 сентября 2010

Почему бы не использовать Boost.Python? Вы можете представить свои классы данных Python и выполнить скрипт / функцию, как описано здесь .

8 голосов
/ 23 сентября 2010

В документации Python есть страница о внедрении Python в приложение C или C ++.

6 голосов
/ 23 сентября 2010

Если вы хотите просто запустить скрипты Python из C / C ++, тогда используйте API Python C . В вашем коде C / C ++:

PyRun_SimpleString("import math; x = math.sqrt(2 * 2)");

Для более сложных вещей, вам придется взглянуть на документы API, но это довольно просто.

2 голосов
/ 23 сентября 2010

Как насчет встраивания движка JavaScript, такого как V8 ?

1 голос
/ 23 сентября 2010

Я советую использовать Lua в качестве внутреннего механизма сценариев. Реализация - это всего лишь несколько строк, и хотя язык и легок, язык обладает достаточной силой. Так что нет необходимости в TCL. Вы также можете посмотреть на python, интеграция в C ++ довольно проста, поскольку существует реализация Boost.Python , облегчающая интеграцию.

Но в зависимости от приложения я бы порекомендовал Lua.

1 голос
/ 23 сентября 2010

Для чего-то столь же простого, как вы описываете, вы могли бы реализовать переводчик для своего собственного «маленького языка».Вы могли бы даже назвать это "языком Робина".; -)

1 голос
/ 23 сентября 2010

Вы говорите, что не ищете что-то, чтобы обернуть ваши функции / классы C ++ в интерфейс Python, но если вы хотите, чтобы код Python мог ссылаться на членов вашей структуры C ++ my_integers, это это упаковка классов C ++ в интерфейсе Python.Конечно, вы можете свободно оборачивать столько классов, сколько хотите - в этом примере вы обернули бы my_integers, а затем вставили бы интерпретатор Python , чтобы делать что-то с my_integers.

1 голос
/ 23 сентября 2010

Lua также работает довольно хорошо, тем более, что он небольшой, совместимый с требованиями стандарта ANSI, имеет небольшой объем памяти и большой список вики и сообщений.Если вам нужна еще большая скорость, есть 32-битная и 64-битная версия x86 (luajit).Связывание может быть выполнено с помощью множества инструментов / библиотек, таких как swig или lunar (в вики их все перечислено).Единственная проблема, которую я вижу, - это связывание членов структуры, чтобы на них можно было ссылаться напрямую (т.е. struct.member = 4), хотя это можно установить с помощью метатаблиц, у которых методы get и set связаны с именами переменных

1 голос
/ 23 сентября 2010

не забудьте дедушку встроенного скриптового языка - tcl.

У tcl есть замечательная оболочка c ++ (смоделированная на boost.python), которая упрощает вызов и передачу обратных вызовов в ваш код

...