Ruby vs Lua как язык сценариев для C ++ - PullRequest
23 голосов
/ 16 марта 2011

Я сейчас создаю игровой сервер (а не движок) и хочу, чтобы он был расширяемым, как система плагинов.
Решение, которое я нашел, заключается в использовании языка сценариев.Все идет нормально.

Я не уверен, стоит ли мне использовать Ruby или Lua.Lua легче встраивать, но у Ruby есть большая библиотека и лучший синтаксис (на мой взгляд).Проблема в том, что я не нашел простого способа использовать Ruby в качестве языка сценариев в C ++, в то время как в Lua это очень просто.

Сложно по этому поводу?Предложения по использованию Ruby в качестве языка сценариев (я пробовал SWIG, но он не такой аккуратный, как при использовании Lua)?

Спасибо.

Ответы [ 6 ]

12 голосов
/ 16 марта 2011

Я уже смотрел на встраивание Ruby в C / C ++, и это казалось чрезвычайно сложным. Вы столкнетесь с множеством проблем:

  • Для вызова Ruby из C / C ++ требуется написать 2 слоя функций (один слой для вызова, а другой для перехвата исключений)
  • Для обратного вызова C / C ++ из Ruby требуется обычная работа типа SWIG
  • Перемещение данных назад и вперед требует тщательного отслеживания выделений, поскольку Ruby захочет собрать мусор из всего, что может

Я уверен, что это можно сделать, но мне это показалось чрезвычайно трудным, выполнимым, только если вы можете прыгнуть в Ruby за минимальное количество точек входа.

8 голосов
/ 16 марта 2011

В прошлом я широко использовал Lua.

Luabind действительно прост в использовании, нет необходимости во внешнем генераторе, таком как SWIG, документация великолепна. Время компиляции остается приличным.

Самая большая проблема, которую я видел: lua в основном ... только для записи. На самом деле у вас нет классов, но есть только ассоциативные массивы с небольшим количеством синтаксического сахара (object ['key'] может быть написан object.key), так что вы легко в конечном итоге добавляете 'member' в непонятную функцию, полностью забывая об этом, и побочные эффекты позже.

По этой и только по этой причине я бы предпочел Python. Boost :: Python является основой для Luabind, поэтому оба имеют схожий API (раньше Luabind был немного проще в сборке, но не сейчас). С точки зрения функциональности они вполне эквивалентны.

Не имеет прямого отношения: ни один из них не может быть надежно использован в многопоточной среде (так что это зависит от сложности вашего сервера).

  • N Темы Python: GIL (Global Interpreter Lock) уже в пути. Каждый раз, когда вы используете переменную в потоке, она блокируется, так что она как бы портит точку, за исключением длительных операций ввода-вывода и вызовов функций C.
  • у lua есть сопрограммы, но они не распараллеливаются.
  • Рубиновые нити на самом деле не являются нитями, но похожи на сопрограммы Луа

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

6 голосов
/ 16 марта 2011

Вам может быть интересно узнать о Белке .Я считаю, что это был язык сценариев, используемый Left 4 Dead 2 .Он более продвинутый, чем lua (использует объекты и классы), и его легко встроить в приложение C ++, которое звучит именно так, как вы ищете.

2 голосов
/ 16 марта 2011

Пойдите для lua, хотя я бы порекомендовал luajit, не только для скорости, но и для новой библиотеки ffi, увеличивающей взаимодействие до максимума :). У Lua также есть тоны модулей, и новые очень легко создавать, это восполняет недостаток в его stdlib.

1 голос
/ 17 марта 2011

У Lua есть одна возможность - легко перемещать данные между C ++ (или C) и самим собой. По сути, вы просто помещаете данные в стек для связи между ними. Одновременно запустить и запустить несколько сред Lua также довольно просто (если вам нужна эта функциональность). Хотя Lua - это язык для сборки мусора, его легко предотвратить в отношении данных, которые должны храниться в вашем коде C ++. Создание расширяемой системы плагинов должно быть легко с Lua, как только вы заложите основу. Обмен плагинов (в данном случае, скриптов) на вход и выход во время выполнения также довольно тривиален (хотя это может быть верно и для Ruby, я недостаточно знаком с этим, чтобы это знать).

Стоит задуматься над тем, сколько объектно-ориентированных вещей вы хотите, чтобы ваши сценарии могли обрабатывать. Lua использует функции, таблицы, метатаблицы и прототипы для реализации ОО-подобного программирования. Кому-то это нравится, кому-то нет; лично я нашел это интересным для использования, хотя иногда немного неуклюжим. Не используя Ruby, я не могу за это говорить, но вы можете взвесить вашу потребность в поддержке объектов / классов.

Я думаю, что в вашей ситуации вы также должны подумать о том, как быстро вы хотите запустить и запустить свой проект. Как вы и другие заметили, Ruby сложно встроить в C ++, а Lua - нет. Время всегда ценно, и если вы хотите, чтобы что-то работало как можно скорее, лучше всего подойдет Lua.

0 голосов
/ 16 марта 2011

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

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