Встроенный скриптовый движок для DSL

Я работаю над проектом, которому нужен встроенный DSL для выполнения ожидаемых требований.

DSL будет определяться пользователем на основе событий. Вот макет желаемого синтаксиса:

user-defined-event-1 {
    // event body
}

user-defined-event-2 {
    // event body
}

Вероятно, самый похожий язык, который я знаю, основанный на событиях, это LSL (из Second Life).

Итак, прочитав другие подобные вопросы о SO, я хотел бы попросить лучший встраиваемый механизм сценариев (Ruby, Lua, Python и т. д.) на C++ (я работаю в Qt), который позволяет мне создать этот DSL.

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

Работа встроенного языка с Qt не требуется. Это может быть изолировано, но было бы неплохо иметь некоторую интеграцию.


person Dario Castañé    schedule 19.10.2009    source источник
comment
Спасибо за ваши комментарии, я собираюсь проверить оставшиеся без ответа как можно скорее, потому что они нуждаются в более глубоком рассмотрении, чем другие.   -  person Dario Castañé    schedule 21.10.2009
comment
Еще раз спасибо всем. Я выбираю Lua из-за его действительно встраиваемого способа работы и привязки Qt, хотя QtScript/V8 тоже были хорошими вариантами. Python выглядит слишком сложным для встраивания для меня сейчас.   -  person Dario Castañé    schedule 21.10.2009


Ответы (8)


Существует по крайней мере, несколько привязок Qt-Lua. Lua может отчасти использовать синтаксис, который вы показали выше; в частности, {} указывает на таблицу (ассоциативный массив) в Lua, и если вы только передаете анонимную таблицу в функцию, вам не нужны круглые скобки:

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> function LengthOfTable(t) print(#t) end
> LengthOfTable ({"a","b","c"})
3
> LengthOfTable {"a","b","c"}
3

Является ли Lua лучшим для вашего приложения, конечно, зависит от вашего приложения. В любом случае, Lua очень легко (IMO) встроить в C или C++.

person Mark Rushakoff    schedule 19.10.2009
comment
Теперь я понимаю, почему Lua так популярен при написании игровых сценариев. Он выглядит очень мощно и, как вы сказали, очень легко встраивается (это замечательный пример: cc.byexamples.com/20080607/how-to-embed-lua-51-in-c). Кроме того, он работает кроссплатформенно и имеет знакомый синтаксис (на первый взгляд, похожий на Ruby, но я знаю, что это не так), поэтому я не теряю ни одной функции, внедряя его в свой проект. Спасибо! - person Dario Castañé; 21.10.2009

Вы можете посмотреть встраиваемый javascript через проект Google V8, написанный на C++.

http://code.google.com/apis/v8/intro.html

person James Black    schedule 19.10.2009
comment
Это тоже хороший момент, но я такой же, как QtScript. Думаю, я могу построить DSL на Java/ECMAscript и предоставить его в качестве обязательной библиотеки. - person Dario Castañé; 21.10.2009

Qt поставляется с модулем сценариев QtScript. Он использует язык на основе ECMAScript (например, javascript).

person Karl Voigtland    schedule 19.10.2009
comment
Прежде чем спросить, я взглянул на QtScript, но не нашел подсказки для создания на нем DSL. - person Dario Castañé; 21.10.2009
comment
Если вы погуглите «javascript dsl», вы сможете найти полезную информацию. - person Karl Voigtland; 21.10.2009

Tcl довольно близок к предложенному вами синтаксису:

proc user-defined-event-1 {} {
# event body
puts "Hello World"
}

proc определяет процедуру, а дополнительные фигурные скобки {} используются для аргументов. В оболочке tcl процедуры можно динамически вводить построчно, копировать и вставлять или загружать из файла. Их также можно переопределить, просто перезагрузив их.

person Joe Internet    schedule 19.10.2009
comment
Я нашел некоторую информацию о построении DSL на TCL, но Lua выглядит лучше. Спасибо, в любом случае! - person Dario Castañé; 21.10.2009

Я никогда не пробовал, но есть PyQt.

person Troubadour    schedule 19.10.2009
comment
Спасибо, но PyQt - это просто привязка к библиотекам Qt. Мне нужно встроить в проект C++ скриптовый движок, позволяющий построить на нем DSL и, по возможности, иметь привязки к Qt. Может быть, я смогу встроить python и использовать PyQt внутри. - person Dario Castañé; 21.10.2009

Я считаю, что boost::python довольно легко реализовать. Я слышал, что есть и решения для python-Qt.

person Maciek    schedule 19.10.2009

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

person coppro    schedule 19.10.2009
comment
Очень интересный вариант, но я предполагаю, что в созданном DSL будет отсутствовать какая-либо базовая функция (например, условный поток), предусмотренная для ранее существовавшего встроенного языка, если я не реализую ее намеренно. Я прав? - person Dario Castañé; 21.10.2009

Для встраивания DSL в ваше приложение я рекомендую ANTLR. Я использовал ANTLR на протяжении многих лет, последний из которых был в составе драйвера JDBC для Cassandra. Возможно, вы захотите попробовать версию 4, которая имеет среду выполнения C++. В версии 3 возникли проблемы с Qt из-за конфликта с ключевым словом emit.

person Glenn    schedule 01.05.2013