Адкрыты код 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

Дадаць каментар