воскресенье, 7 августа 2016 г.

Qt Script not dead

Есть в Qt такой модуль, который уже с 5-й версии является deprecated и полноценной замены ему, по моему мнению, пока не предвидится. Я говорю, конечно же, о Qt Script и его использовании для реализации скриптов со стороны пользователя .



Перед тем как начать, замечу, что в документации Qt сейчас перечислено три способа встраивания возможностей для скриптования своего приложения.

Последний из них - QML, использует ставший сейчас основным QJSEngine и используется в первую очередь для реализации GUI.

Второй из них - QJSEngine, недостатки которого будут приведены ниже.

Ну и Qt Script. Сейчас он помечен как deprecated, вплоть до текущей версии Qt (пока 5.7) а значит, возможно, будет удален в будущем. Пока, правда, об удалении ничего не слышно, а авторы говорят, о том, что он deprecated, так как готов и больше не обновляться не будет.

QML - здесь все понятно: отдельный язык, но всё же, иногда не хочется отказываться от привычного C++. К тому же, паттерны работы довольно сильно отличаются от той манеры, которая привычна со скриптовым движком.

QJSEngine - не может считаться полноценной заменой Qt Script, так как:
  • Нет таймаута на исполнение скриптов и его нельзя никак прервать, как было в QtScript
  • В нем нет возможности сделать константные объекты и свойства, сравните: QScriptValue::setProperty и QJSValue::setProperty
Казалось бы, мелочи, но на практике это значит, что пользователю такой интерфейс для скриптования давать нельзя - он легко сможет "повесить" программу или сломать весть интерфейс. К тому, же, во всех остальных JS-движках это есть. V8, V7, Duktape - все имеют такие возможности и в них это реализуется легко.

Почему же Qt Script остался не удел, а заменой ему стало такое решение? Ответ на этот вопрос можно посмотреть здесь . Есть ещё архивный топик в gmane, который подробно раскрывал вопрос, но он перестал быть доступен в связи со смертью самого gmane.

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

Почему в QJSEngine забыты такие мелочи как timeout скрипта и константные свойства? На этот вопрос ответа все же найти не удалось.

Что же остается делать в случае удаления Qt Script? Пока видится только два варианта:
  • Оставаться на старой версии Qt 4/5  - приемлемо в течении некоторого времени, но рано или поздно миграция станет проблемой
  • Заменять Qt Script на какой-то другой язык скриптования - во втором случае, помимо других вопросов, встает вопрос о том, как сделать автобиндинг свойств и методов классов, производных от QObject.
Проблема во втором варианте решается относительно через составление списков методов и свойств через QMetaFramework  и использованием QMetaProperty и QMetaMethod . Поэтому, пока второй метод кажется предпочтительным с точки зрения правильности. Но и ничего не делать тоже можно  - всё же, с момента как он стал deprecated прошло уже три года, а воз и ныне там... 

Комментариев нет:

Отправить комментарий