Встраивание скриптового движка в C ++ - PullRequest
4 голосов
/ 25 мая 2010

Я изучаю, как лучше всего расширить приложение C ++ с помощью сценариев, и я смотрю на Python или JavaScript. Для пользовательских сценариев потребуется возможность доступа к модели данных приложения.

Кто-нибудь из вас имел опыт встраивания этих скриптовых движков? Каковы некоторые потенциальные подводные камни?

Ответы [ 5 ]

7 голосов
/ 25 мая 2010

Lua также является отличным кандидатом для встраивания в программы. Он самодостаточен, и даже родная система вызовов на нескольких языках неплохая.

Для JavaScript лучше всего сейчас смотреть на V8 (от Google), с которым достаточно легко работать.

6 голосов
/ 25 мая 2010

Конечно, легко внедрить Python с помощью библиотеки Boost :: Python (хорошо, хорошо, сарказм). Ничто не является "легким", когда дело доходит до межъязыковой функциональности. Boost много сделал для содействия такому развитию. Один из разработчиков, с которым я работал, ругается на интерфейс Boost-> Python. Его код может быть запрограммирован пользователем на Python, а REPL встроен прямо в пользовательский интерфейс. Удивительно.

Однако мой опыт лучше наблюдался при использовании SWIG и других языков, таких как Java. В настоящее время я работаю с SWIG, чтобы обернуть C ++ с Python. Есть все виды ошибок с исключениями, многопоточностью, межъязыковым полиморфизмом и тому подобным.

Я бы сначала посмотрел на эти два места. Как я уже сказал, ничто не будет «легким», но оба они делают жизнь более пригодной для жизни.

4 голосов
/ 25 мая 2010

Если вы действительно не настроены на Python или Javascript, я бы немного подумал об использовании Lua . Поскольку он спроектирован полностью как встроенный механизм сценариев, он устраняет частичные совпадения с тем, что C и C ++ уже делают хорошо. Это также довольно легко внедрить, если вы только взаимодействуете между вашим кодом и движком Lua с точки зрения вызываемых функций Си.

Если вы хотите использовать интерфейс уровня C ++, вы можете взглянуть на LuaBind , который позволяет такие вещи, как класс Lua, производный от (прокси, который он генерирует) от класса C ++, который вы написали .

1 голос
/ 22 февраля 2011

Посмотрите на ангелскрипт простой и легкий для встраивания, синтаксис c / c ++. бесплатная и corss-платформа. ты можешь начать через несколько часов.

1 голос
/ 25 мая 2010

Boost :: Python, как и в ответе на wheaties, является очень зрелым решением.

Луа имеет репутацию легкого встраивания, но я сам не пробовал.

Как пользователь R , меня больше интересует встраивание R , что возможно при использовании пакета RInside . Простой пример:

#include <RInside.h>                // for the embedded R via RInside

int main(int argc, char *argv[]) {

    RInside R(argc, argv);          // create an embedded R instance 

    R["txt"] = "Hello, world!\n";   // assign a char* (string) to 'txt'

    R.parseEvalQ("cat(txt)");       // eval the init string, ignoring any returns

    exit(0);
}

и в пакете есть еще пара примеров. RInside , по сути, предоставляет вам хорошую оболочку для движка R с использованием некоторого пакета интерфейса Rcpp .

...