В настоящее время я работаю над текстовым игровым движком в Ruby, где приложение разделено на код Ruby в / lib и данные YAML в / data, которые загружаются при необходимости игрой.Я хочу, чтобы файлы данных содержали базовые сценарии, в основном в модели событий / наблюдателей.Однако я также хочу, чтобы пользователи могли создавать собственные сценарии и обмениваться ими, не беспокоясь о вредоносном коде, встроенном в сценарий.
Приложение: Первоначально планировалось создать пользователяконтент разделен на два типа: «модули», которые были предназначены только для данных (и, следовательно, безопасны), и плагины, которые добавляли дополнительную функциональность (но, очевидно, были небезопасны).Чтобы провести аналогию с настольными играми, модули были бы похожи на опубликованные сценарии приключений и контент, а плагины - это книги правил, содержащие дополнительные правила и системы.
Пример сценария (синтаксис, конечно, может изменяться в зависимости от решения):
---
Location:
observers:
on_door_open: |
monster = spawn_monster(:goblin);
monster.add_item(random_item());
monster.hostile = true;
С точки зрения безопасности было бы идеально, если бы сценарий был строго включен, возможно, через встроенный миксин с небольшим количеством DSL, например:
class Frog
include Scriptable
def jump; ... ; end # this can be called from a script
allow_scripting :jump
def ribbit; ... ; end # this cannot be called from a script
end
Я посмотрелна три четыре варианта, но я не уверен, какой из подходов лучше всего использовать:
Использовать сценарии Ruby, но в какой-то песочнице.
Плюсы: Очень хорошо знаком с Ruby, нет необходимости в "склеивании" кода или проблем с интеграцией объектов между языками.
Минусы: Не очень знакомы сИз-за проблем безопасности или «песочницы» не найдено ни одного готового решения, которое, кажется, подходит.
Реализация Внедрение другого языка сценариев, например Lua.
Плюсы: Ruby и Lua основаны на C, поэтому привязки должны быть достаточно простыми.Lua - достаточно популярный язык, поэтому помощь можно получить, если я столкнусь с проблемами позже.Безопасный, так как любые функции, которые я специально не связываю, будут недоступны из сценариев.
Минусы: Существующие привязки Ruby-Lua кажутся односторонними, старыми и плохо обслуживаемыми, или оба,Кажется бесполезным встраивать язык сценариев в другой язык сценариев.
Реализовать собственный язык сценариев с интерпретатором Ruby.Я экспериментировал с Treetop , и не должно быть слишком сложно составить простую грамматику, достаточную для сценариев.
Плюсы: Нет необходимостивставлять другой язык.Только функции, которые я специально реализовал, будут доступны для сценариев.
Минусы: Overkill.Синдром «не построен здесь».Вероятно, ужасное гнездо ошибок, ожидающих появления.
Реализация файлов данных полностью на Ruby с использованием языка, специфичного для домена.
Плюсы: Просто и легко.
Минусы: Нет данных, созданных пользователем, можно доверять.
Я также открыт для других предложений, не входящих в этот список, которыеЯ, возможно, не думал о.Каково лучшее решение для безопасной реализации сценариев, встроенных в файлы данных?
Edit 2011 年 12 月 23 日: Добавлен четвертый вариант с DSL, добавлено "addendum" вверху с дополнительными мыслями /контекст.