ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΊΠΎΠ΄ 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.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ