25.01.2022

Открыт код Luau, варианта языка Lua с проверкой типов

Объявлено об открытии исходных текстов и публикации первого отдельного выпуска языка программирования Luau, продолжающего развитие языка Lua и обратно совместимого с Lua 5.1. Язык Luau предназначен в основном для встраивания обработчиков сценариев в приложения и нацелен на достижение высокой производительности и низкого потребления ресурсов. Код проекта написан на языке C++ и открыт под лицензией MIT.

Luau расширяет Lua возможностями для проверки типов и некоторыми новыми синтаксическими конструкциями, такими как строковые литералы. Язык обратно совместим с Lua 5.1 и частично с более новыми версиями. Поддерживается API Lua Runtime, что позволяет использовать Luau с уже существующим кодом и привязками (binding). Языковой runtime основан на сильно переработанном коде Lua runtime 5.1, но интерпретатор полностью переписан. При разработке задействованы некоторые новые техники оптимизации, позволившие добиться более высокой производительности по сравнению с Lua.

Проект разработан компанией Roblox и используется в коде игровой платформы, игр, и пользовательских приложений данной компании, включая редактор Roblox Studio. Изначально Luau развивался за закрытыми дверями, но в итоге решено перевести его в разряд открытых проектов для дальнейшего совместного развития при участии сообщества.

Основные особенности:

  • Последовательная система типов (Gradual typing), занимающая промежуточное положение между динамической и статической типизацией. Luau позволяет использовать статическую типизацию по необходимости, указывая информацию о типах через специальные аннотации. Предоставляются встроенные типы «any», «nil», «boolean», «number», «string» и «thread». При этом сохранена и возможность использования динамической типизации без явного определения типа переменных и функций.
     function foo(x: number, y: string): boolean local k: string = y:rep(x) return k == "a" end
    
  • Поддержка строковых литералов (как в Lua 5.3), таких как «\0x**» (шестнадцатеричное число), «\u{**}» (Unicode-символ) и «\z» (конец строки), а также возможность наглядного оформления чисел (можно писать 1_000_000 вместо 1000000), литералы для шестнадцатеричных (0x…) и двоичных чисел (0b…….).
  • Поддержка выражения «continue», дополняющее существующее ключевое слово «break», для перехода к новой итерации цикла.
  • Поддержка составных операторов присвоения (+=, -=, *=, /=, %=, ^=, ..=).
  • Поддержка использования условных блоков»if-then-else» в форме выражений, возвращаемых значение, вычисленное во время выполнения блока. Допускается указание произвольного числа выражений elseif в блоке.
     local maxValue = if a > b then a else b local sign = if x 0 then -1 elseif x > 0 then 1 else 0 
  • Наличие режима изоляции (sandbox), позволяющего запускать не заслуживающий доверие код. Указанную возможность можно использовать для организации запуска бок о бок собственного кода и кода написанного другим разработчиком, например, сторонних библиотек за безопасность которых нельзя поручиться.
  • Ограничение стандартной библиотеки из которой удалены функции, которые потенциально могут создавать проблемы с безопасностью. Например, из стандартного набора исключены библиотеки «io» (доступ к файлам и запуск процессов), «package» (доступ к файлам и загрузка модулей), «os» (удалены функции доступа к файлам и изменения переменных окружения), «debug» (небезопасная работа с памятью), «dofile» и «loadfile» (доступ к ФС).
  • Предоставление инструментов для статического анализа кода, выявления ошибок (linter) и проверки корректности использования типов.
  • Собственные высокопроизводительные парсер, интерпретатор байткода и компилятор. Luau пока не поддерживает JIT-компиляцию, но утверждается, что интерпретатор Luau в некоторых ситуациях вполне сопоставим по производительности с LuaJIT.

Источник.