Подтвердить что ты не робот

Как сделать скверную программу С++ с помощью Python и/или Lua?

Я столкнулся с задачей сделать приложение С++ доступным для сценариев пользователями. Приложение находится в разработке в течение нескольких лет, и никто не тратил впустую мысль об этом раньше. Он содержит всевозможные тонкости, такие как многопоточность, шаблонное колдовство и множественное наследование. В качестве языка сценариев предпочтительнее использовать Python, но Lua может быть принят, если его значительно проще реализовать.

Вопрос 1

Из того, что я узнал до сих пор, в целом существуют два способа интеграции Python/Lua с С++: "расширение" и "внедрение".

В этом случае, похоже, мне нужны оба. Язык сценариев должен иметь доступ к объектам, методам и данным из приложения, но должен быть вызван приложением после того, как пользователь написал script - без перезапуска.

Как это обычно делается в реальном мире?

Вопрос 2

Кажется, что существует путаное множество ручных решений и генераторов привязки, причем все они менее совершенны.

  • swig, pyste, Py ++, ctypes, Boost.Python sip, PyCXX, pybindgen, robin, (Cython/Pyrex, Weave)
  • CppLua, Diluculum, Luabind, Luabridge, LuaCpp, Luna/LunaWrapper, MLuaBind, MultiScript, OOLua, SLB, Sweet Lua, люкс (этот список из wiki wiki)
  • CPB, tolua, tolua ++, toLuaxx, luna и снова swig

Большинство предложений по ним, найденным в Интернете, немного устарели. Например, swig считается сложным в нетривиальных случаях и порождает непонятный код. OTOH, он недавно перешел к версии 2.0.

Некоторые из вышеперечисленных используют pygccxml, чтобы gcc анализировал код С++, а затем разгладил привязку. Я считаю эту идею привлекательной, поскольку gcc, вероятно, лучше понимает код, чем я:-). Это хорошо работает?

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

Итак, какие из них вы рекомендуете?

4b9b3361

Ответ 1

Я бы не рекомендовал swig, так как трудно заставить его создать удовлетворительную привязку в сложных ситуациях: был там, сделал это. Мне пришлось написать ужасный script, который "разобрал" исходный код на С++ для генерации некоторого приемлемого кода на С++, который swig мог пережевывать и генерировать приемлемые привязки. Итак, в общем: избегайте ЛЮБОГО решения, которое полагается на разбор исходной программы на С++.

Между Lua и Python: я нашел Lua MUCH, MUCH лучше документирован и более чисто реализован. Python имеет GIL (глобальный замок), тогда как с Lua, например, вы можете иметь экземпляр интерпретатора в каждом потоке. Итак, если вы можете выбрать, я бы порекомендовал Lua. Это меньший язык, проще понять, проще встраивать (гораздо более чистый и меньший API, с отличной документацией). Я использовал luabind для небольшого моего проекта и нашел его простым в использовании.

Ответ 2

Относительно вопроса 1 - да, вам нужно сделать оба.

Вы можете открыть интерфейс сценариев приложений для встроенного интерпретатора, который затем запускает пользовательский script.

В разделе руководств по Python по встраиванию содержится раздел "Расширение встроенного Python" , а также есть учебные пособия для подобных вещей для Lua, см., например, в этой статье. Конечно, есть, вероятно, более простые способы найти, когда вы решили, с каким языком скриптинга и механизмом привязки вы хотите пойти.

Ответ 3

Некоторые из вышеперечисленных используют pygccxml, чтобы gcc анализировал код С++, а затем разгладил привязку. Я считаю эту идею привлекательной, поскольку gcc, вероятно, лучше понимает код, чем я:-). Это хорошо работает?

Аналогичный подход используется в привязке Lua Qt - lqt. Он использует cpptoxml для создания XML файла, содержащего все классы и методы с параметрами, и сгенерированный код С++ с привязкой к нему.

Он работает очень хорошо, генератор способен связывать почти все классы и методы Qt, включая виртуальные методы, перегруженные операторы, выбранные классы шаблонов, механизм сигнала/слота и т.д.

Хотя он был создан специально для Qt, он имеет режим "noqt", в котором он может служить универсальным связующим, к сожалению, у меня нет опыта с ним, поэтому я не могу сказать, сколько работы было бы связать ваши код.

Ответ 4

Мой опыт может быть немного, но я полагаю, что он по крайней мере стоит того, за что вы заплатили за него;)

Я сделал некоторые базовые модули "hello world" python, и я не мог по-настоящему попасть в swig - мне показалось, что накладные расходы на то, что я делаю. Конечно, это также возможно, что это просто правильная сумма для ваших нужд.

Ответ 5

Попробуйте Boost:: Python, он имеет некоторую связанную с ним кривую обучения, но это лучший инструмент для моей работы, у нас есть огромная система реального времени и разработана библиотека сценариев для QA в Boost::. Python