Тема: Static typed QLua?
У [Q]Lua есть несколько темных сторон, которые почему-то практически не обсуждаются в рунете.
Хочу их тут осветить. А также обсудить, как с ними бороться.
Недостатки [Q]Lua:
1. Lua - довольно низкоуровневый язык, поэтому часто приходится изобретать велосипеды. Многие сторонние библиотеки либо дублируют функционал, либо несовместимы (примеры - реализация ООП, функции для работы со строками, регулярными выражениями, таблицами (map, reduce, etc.)).
2. по-умолчанию переменные - глобальные.
3. слишком минималистичные структуры данных - tables, которые как бы заменяют и массивы и структуры (record) и хеш-таблицы, но не на 100%. Известные багофичи - массивы с отрицательными/дробными индексами, с пропусками в нумерации.
4. динамическая типизация, с одной стороны, упрощает программирование, а с другой - ошибки с неправильным типом переменной или опечаткой в названии поля ловятся только во время выполнения скрипта, что для торговых алгоритмов чревато серьезными последствиями. Неоднозначная логика true|anytype/false|nil может давать побочные эффекты в выражениях x and y or z. Раз уж ввели тип boolean, следовало ограничить тип выражений в if, while только этим типом.
Для небольших разовых скриптов это не критично, но для предметной области QLua создает эффект разложенных вокруг граблей. Сюда же добавляются специфические проблемы Qlua/Quik:
5. Lua хорош как конструктор при наличии исходных кодов, когда автор программы может добавить любую С-библиотеку. Но с квиком ситуация другая - исходный код Qlua закрыт, разработчики решили свои проблемы - выставили API Quik в Qlua, а остальное - проблемы пользователей.
6. как следствие - сторонние модули lua c dll, не работают без пересборки, нет дебаггера ну и с тестированием скриптов есть проблемы. Без вспомогательных библиотек наподобие QL сделать элементарные вещи - сформировать/выставить/передвинуть заявку, проверить её исполнение/частичное исполнение/снятие - нетривиальная задача.
Что делать?
Гораздо лучше для всех было, если бы в квике использовалась стандартная lua dll, а qlua api было реализовано как preloaded lua модуль при инициализации интерпретатора. Да и без странного 2-поточного интерпретатора можно было обойтись. Лично я склоняюсь к мысли, что Lua в качестве языка для торгового терминала - не слишком удачный выбор. Гораздо лучше бы тут подошел какой-нибудь static typed скриптовый язык, который отлавливает большинство ошибок и опечаток во время компиляции. Из того, что я смотрел, мне понравились Angelscript, Pike, Dao.
Что можно сделать здесь и сейчас с QLua?
Вот что я насобирал на [url]http://lua-users.org/wiki[/url] и в интернете:
1. LuaLint (название раздела в wiki)- проводит статистический анализ глобальных переменных в скриптах lua. Сообщает о всех обращениях к необъявленным глобальным переменным, которые часто появляются из-за опечаток в именах переменных
2. DetectingUndefinedVariables - примеры скриптов, которые делают то же самое в рантайме (выводят ошибку при обращении к необъявленной глобальной переменной).
3. StrictStructs - аналогичная проверка корректности имен полей в таблицах.
Я делал похожий скрипт, но более простой - цепляем к любой таблице мета-таблицу с функциями __newindex, __index выкидывающие ошибки и всё - при обращении к несуществующему полю таблицы тут же получаем номер строки с ошибкой, а не непонятный "nil value" совершенно в другом месте.
4. LuaTypeChecking - проверка типов в рантайме (assert/decorators).
5. Очень многообещающий проект typedlua на гитхабе. Насколько я понял, авторы из того же бразильского университета что Р.Иерусалимский. Идея такая же как в typescript/javascript - typedlua компилируется в lua со статическим анализом типов. Можно в отдельных файлах описывать дескрипторы и структуры lua и с-библиотек. Они используются для статического анализа вызовов функций и обращения к структурам данных. Например, есть дескрипторы для всех стандартных lua-библиотек. Можно так же описать qlua API и qlua-таблицы! В общем, может заменить все вышеперечисленные костыли.
p.s. не совсем по теме, но ещё один любопытный язык, компилируемый в lua - moonscript. Синтаксис напоминает python и функциональные языки.