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

Ruby vs Lua как язык сценариев для С++

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

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

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

Спасибо.

4b9b3361

Ответ 1

Я использовал Lua в прошлом.

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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