Відкрито код 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 alse 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.

Джерело: opennet.ru

Додати коментар або відгук