Открыт код 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), таких как “x**” (шестнадцатеричное число), “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 else 0
  • Наличие режима изоляции (sandbox), позволяющего запускать не заслуживающий доверие код. Указанную возможность можно использовать для организации запуска бок о бок собственного кода и кода написанного другим разработчиком, например, сторонних библиотек за безопасность которых нельзя поручиться.
  • Ограничение стандартной библиотеки из которой удалены функции, которые потенциально могут создавать проблемы с безопасностью. Например, из стандартного набора исключены библиотеки “io” (доступ к файлам и запуск процессов), “package” (доступ к файлам и загрузка модулей), “os” (удалены функции доступа к файлам и изменения переменных окружения), “debug” (небезопасная работа с памятью),
    “dofile” и “loadfile” (доступ к ФС).
  • Предоставление инструментов для статического анализа кода, выявления ошибок (linter) и проверки корректности использования типов.
  • Собственные высокопроизводительные парсер, интерпретатор байткода и компилятор. Luau пока не поддерживает JIT-компиляцию, но утверждается, что интерпретатор Luau в некоторых ситуациях вполне сопоставим по производительности с LuaJIT.
Release. Ссылка here.