7 पॉइंट द्वारा GN⁺ 2025-09-23 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Luau एक तेज, सुरक्षित और gradual typing को support करने वाली embedded scripting language है, जो Lua 5.1 से derived है
  • यह Roblox platform के complex games और large-scale codebases को support करने के लिए performance, language tools, और type system को मजबूत करते हुए विकसित हुई
  • सामान्य Lua के विपरीत, इसमें sandboxing features हैं, ताकि अलग-अलग permissions वाला code साथ-साथ चल सके
  • इसका syntax Lua 5.1 के साथ compatible है, लेकिन यह additional syntax extensions और analysis tools (linter, type checker) देकर code quality बेहतर बनाता है
  • performance optimization, custom bytecode, JIT support आदि के जरिए यह LuaJIT-स्तर की execution speed को लक्ष्य बनाता है, और Roblox से आगे विभिन्न embedded environments में भी इसकी उपयोगिता की संभावना है

Motivation (पृष्ठभूमि)

  • लगभग 2006 में Roblox ने game scripting language के रूप में Lua 5.1 को अपनाया
  • समय के साथ Roblox platform पर games का स्तर बढ़ा और टीमों का आकार बड़ा हुआ, इसलिए मौजूदा Lua की सीमाओं को पार करने के लिए भाषा और उसके implementation में बड़े सुधार किए गए
  • platform की growth के साथ performance optimization, user friendliness, और language-related tools के development में काफी निवेश किया गया
  • खासकर 2020 तक 10 लाख लाइनों से अधिक के large-scale codebase को manage करते हुए यह स्पष्ट हुआ कि gradual type system को अपनाना आवश्यक है
  • इन्हीं जरूरतों के आधार पर Roblox ने Lua से derived Luau नाम की language विकसित की, जो तेज, छोटी, सुरक्षित है और जिसमें types को gradual तरीके से लागू किया जा सकता है
  • अधिक जानकारी Why Luau दस्तावेज़ में उपलब्ध है

Luau overview

  • Luau Lua 5.1 पर आधारित एक embedded scripting language है
    • यह तेज और हल्का runtime प्रदान करती है
    • यह gradual type system को support करती है, जिससे dynamic और static analysis साथ-साथ संभव होते हैं
  • यह Roblox Studio में integrated है, और --!strict flag से strict mode को सक्रिय किया जा सकता है
  • developers Luau Creator Docs में Roblox से जुड़ी documentation देख सकते हैं

Sandboxing (sandbox सुविधा)

  • Luau exposed standard library को सीमित करती है और अतिरिक्त sandboxing features प्रदान करती है
  • इससे सामान्य developers द्वारा लिखा गया unprivileged code और platform के अंदर का privileged code सुरक्षित रूप से parallel में चल सकता है
  • इसी कारण इसका execution environment सामान्य Lua से अलग है
  • अधिक विवरण Sandbox विवरण में उपलब्ध है

Compatibility (संगतता)

  • जहाँ तक संभव हो, यह Lua 5.1 के साथ backward compatibility बनाए रखती है, और बाद के versions की कुछ features भी शामिल करती है
  • लेकिन Luau Lua के सभी design decisions को नहीं अपनाती, बल्कि Roblox के विशिष्ट use cases और constraints को दर्शाती है
  • Lua 5.1 के बाद के versions की feature support स्थिति Compatibility दस्तावेज़ में दी गई है

Syntax (syntax)

  • यह Lua 5.1 syntax के साथ पूरी तरह compatible है
  • साथ ही यह आधुनिक और परिचित syntax extensions देती है, जिससे development convenience बढ़ती है
  • पूरा syntax Syntax दस्तावेज़ में देखा जा सकता है

Analysis (analysis tools)

  • सही code लिखने में मदद के लिए script analysis tools उपलब्ध हैं

  • components:

    • Linter: सामान्य errors का पता लगाता है
    • Type Checker: type verification
  • इन्हें luau-analyze CLI tool से चलाया जा सकता है

  • lint rules के लिए Lint दस्तावेज़, और type checking guide के लिए Typecheck दस्तावेज़ देखें

Performance (प्रदर्शन)

  • parser, linter, type checker वाले custom frontend के साथ optimized bytecode, interpreter, और compiler प्रदान किए जाते हैं
  • कुछ मामलों में यह LuaJIT interpreter के बराबर प्रतिस्पर्धी performance दे सकती है
  • x64 और ARM64 platforms पर optional JIT compiler support मिलता है, जिससे कुछ programs की performance काफी बढ़ सकती है
  • runtime को लगातार optimize किया जा रहा है और उसके कुछ हिस्सों को दोबारा लिखा जा रहा है ताकि efficiency बेहतर हो
  • performance की विस्तृत विशेषताएँ Performance दस्तावेज़ में उपलब्ध हैं

Libraries (लाइब्रेरी)

  • भाषा स्वयं Lua 5.1 का पूर्ण superset है
  • standard library में कुछ functions हटाए गए हैं और कुछ नए functions जोड़े गए हैं
  • application में embed किए जाने पर यह app-specific extension libraries तक भी पहुँच सकती है
  • पूरी library documentation Library दस्तावेज़ में देखी जा सकती है

1 टिप्पणियां

 
GN⁺ 2025-09-23
Hacker News राय
  • Lumix Engine में Lua और LuaJIT का उपयोग करने के बाद टाइप सिस्टम की वजह से Luau पर स्विच करने का अनुभव रहा, लेकिन लगा कि Roblox के बाहर के प्रोजेक्ट्स में इसका उपयोग करना कठिन है; डॉक्यूमेंटेशन कमजोर है और कम्युनिटी लगभग नहीं के बराबर है, इसलिए समस्याओं के समाधान में कोई मदद नहीं मिलती। Lua या LuaJIT की तुलना में इसका साइज़ बड़ा है, इसलिए कंपाइल स्पीड 7 गुना धीमी हो गई। API की async प्रोसेसिंग भी व्यवहार में sync की तरह ब्लॉक हो जाती है, और STL का उपयोग करने जैसी कई असुविधाएँ हैं। analysis और LSP से जुड़े बग भी अक्सर देखने को मिलते हैं। इसलिए किसी दूसरे विकल्प की तलाश करने पर विचार कर रहा हूँ
    • Roblox टीम आगे Luau को Roblox के बाहर भी अधिक आसानी से उपयोग योग्य बनाने पर ध्यान दे रही है। Remedy Entertainment(Alan Wake 2), Digital Extremes(Warframe), GIANTS Software(Farming Simulator 25) जैसी कई जगहों पर यह पहले से अच्छी तरह इस्तेमाल हो रहा है। अभी तक निवेश और सपोर्ट Roblox के अंदरूनी उपयोग पर केंद्रित था, लेकिन आगे सामान्य उपयोग के लिए स्वतंत्र runtime Lute विकसित किया जा रहा है, और Luau-आधारित कई developer tools भी बनाए जा रहे हैं ताकि ecosystem का विस्तार हो सके। अभी यह शुरुआती चरण में है, लेकिन बाहरी उपयोग और विविध use cases को सपोर्ट करते हुए सक्रिय रूप से निवेश किया जा रहा है। हमारा मानना है कि Luau की स्वस्थ वृद्धि के लिए अधिक विविध उपयोगकर्ता और उपयोग परिदृश्य लाना महत्वपूर्ण है
    • Unity गेम के पूरे प्ले कोड(60 हज़ार लाइनों से अधिक) में Luau का उपयोग कर रहा हूँ। चाहता हूँ कि डॉक्यूमेंटेशन, खासकर custom integration से जुड़ी सामग्री, और बेहतर हो। नया type system और LSP भी अभी पूरी तरह मेल खाते नहीं लगते, और zeux के टीम छोड़ने के बाद long-term direction को लेकर थोड़ी चिंता है। लेकिन development experience खुद मुझे बहुत पसंद है। Luau कोड गेम चलते समय भी लगभग तुरंत hot reload हो जाता है, और C++ प्रोजेक्ट भी जल्दी compile हो जाते हैं। modding support के लिए sandbox environment मिलना भी अच्छा है। आधिकारिक Discord कम्युनिटी भी कुछ हद तक सक्रिय है
    • आपने कहा कि compile धीमा है, लेकिन अगर यह scripting language है तो सामान्यतः source code को compile करने की ज़रूरत नहीं होनी चाहिए, यह जानना चाहता हूँ। क्या आप Luau VM के compile होने की बात कर रहे हैं?
  • यह बात सचमुच दिलचस्प है कि Roblox Node.js-स्टाइल desktop के लिए Luau runtime बना रहा है: https://github.com/luau-lang/lute
    • पहले से ही अधिक परिपक्व Luau runtime Lune मौजूद है। मैं इसे build scripts और Roblox place files की automation के लिए इस्तेमाल कर रहा हूँ, और मेरे उपयोग के लिए यह काफ़ी संतोषजनक रूप से काम करता है
    • एक और standalone Luau runtime के रूप में Lune भी मौजूद है
  • Luau, Lua की तुलना में कहीं अधिक जटिल दिखता है। कोड के हिसाब से देखें तो Luau लगभग 1.2 लाख लाइनों का C++ है, जबकि Lua 5.1 लगभग 14 हज़ार लाइनों का C है। मेरा मानना है कि gradual या static type system जोड़ने पर जटिलता बढ़ना लगभग अपरिहार्य है। कुछ हद तक पूर्ण type system होने पर वह dynamic scripting language से अंततः बड़ा ही होगा
    • Lua (और कुछ हद तक Luau भी) लाइन काउंट के हिसाब से नहीं, बल्कि भाषा सीखने के लिहाज़ से छोटी भाषा है। execution के लिए ज़रूरी runtime पूरी तरह Analysis पर निर्भर नहीं है। Analysis में दो पूर्ण type systems शामिल हैं, और पिछले 3 वर्षों से मूलभूत सीमाओं को हल करने के लिए नया type system विकसित किया जा रहा है। अब पुराना वाला जल्द हटाया जाएगा। ऐसा होने पर लगभग 30 हज़ार लाइनों का कोड भी कम किया जा सकेगा
    • मैं Lua और Luau को छोटी या सरल भाषाएँ नहीं मानता। हो सकता है यह जटिलता अनिवार्य भी न हो। मैं Bau नाम की एक अधिक सरल लेकिन expressive भाषा पर काम कर रहा हूँ, और Lua-स्टाइल VM भी विकसित कर रहा हूँ। ऐसी छोटी भाषाएँ Reddit पर भी अक्सर चर्चा में रहती हैं: Bau, Bau VM, r/ProgrammingLanguages
    • static typing या gradual typing जटिलता बढ़ाते हैं, लेकिन यह वृद्धि शायद जितनी सोची जाती है उससे कम होती है। कई बार dynamic scripting language उससे अधिक जटिल होती है। Hindley–Milner type checker को एक पेज के कोड में लागू किया जा सकता है, इसलिए यहाँ जिस 2000-पेज स्तर की जटिलता की बात हो रही है, वह ज़्यादा लगती है। H–M बिना higher-order functions, generics(parametric polymorphism), या null pointer को संभाले भी पूर्ण हो सकता है, full inference दे सकता है, extensible भी है, और सिर्फ़ मूल रूप में भी C या Java 1.7 type system से कहीं अधिक शक्तिशाली है
    • मैंने Lua का type checker खुद लिखकर देखा है और source भी काफ़ी पढ़ा है। Lua की 14 हज़ार लाइनें बहुत high-density code हैं। सामान्य स्टाइल में लिखा जाए तो वही लगभग 30-40 हज़ार लाइनें बनतीं। यानी Lua मूल रूप से छोटा नहीं है, बल्कि बहुत संक्षिप्त रूप से लिखा गया है
    • tokei से निकाले गए लाइन काउंट को और विस्तार से देखें तो Analysis directory में C++ की 62 हज़ार लाइनें, C headers की 9,200 लाइनें, Ast में C++ की 8,400 लाइनें, CodeGen C++ की 21 हज़ार लाइनें आदि हैं। वहीं Lua 5.1 में पूरे src में C code की 11 हज़ार लाइनें और headers की 1,900 लाइनें हैं
  • Teal और Luau में क्या अंतर है, यह जानना चाहता हूँ। दोनों को "statically typed Lua dialect" कहा जाता है, इसलिए तुलना करना चाहता हूँ https://teal-language.org/
    • Teal, Teal files को Lua में compile करता है, इसलिए JS और TS के रिश्ते जैसे उसके भी फायदे और नुकसान लागू होते हैं। Luau के पास Lua का superset होने वाला अपना runtime है, और यह सिर्फ़ type system ही नहीं बल्कि पूरे development experience को बेहतर बनाता है। इसलिए दोनों काफ़ी अलग हैं। Teal का फायदा यह है कि जहाँ भी Lua चल सकता है वहाँ इसे इस्तेमाल किया जा सकता है। दूसरी ओर Luau सिर्फ़ Luau-विशेष runtime में चलता है, लेकिन अलग compile step न होने के कारण developer के लिए बेहतर usability देता है। type information भी खोती नहीं, उसे इस्तेमाल किया जा सकता है
    • Teal Lua में transpile होता है, जबकि Luau, Lua का fork है। इसलिए interpreter performance, security, syntax extensibility आदि में व्यापक बदलाव संभव हैं। Roblox लगभग 100 अरब डॉलर के market cap वाली बड़ी कंपनी है और इसके लिए कई dedicated developers काम कर रहे हैं
    • Luau सिर्फ़ "Lua में type जोड़ना" नहीं है, बल्कि gradual type system और type inference पर बहुत ज़ोर देता है और भाषा को भी क्रमिक रूप से सुधार रहा है। इसे developer experience और tool support पर केंद्रित करके डिज़ाइन किया गया है। binary size जैसी चीज़ों का ध्यान रखा जाता है, लेकिन Lua जैसी कठोर सादगी इसकी पहली प्राथमिकता नहीं है। बड़े C प्रोजेक्ट्स को Lua से बाँधने की तुलना में इसका फ़ोकस इस भाषा को सीधे उपयोग करने वाले developers को अच्छा अनुभव देना अधिक है
  • यह थोड़ा अफ़सोस की बात है कि Lua ने backward compatibility बनाए रखते हुए अधिक विकास नहीं किया। 2000 के दशक के अंत में Roblox समेत कई प्रोजेक्ट्स ने Lua 5.1 अपनाया था, और अब Lua 5.4 तक पहुँच चुका है, लेकिन पुराने वर्ज़न के साथ compatibility अच्छी तरह बनी नहीं रही। LuaJIT आदि अभी भी सिर्फ़ 5.1 सपोर्ट करते हैं। यह कुछ हद तक Python 2.x/3.x जैसी स्थिति है, लेकिन Lua कम्युनिटी ज़्यादातर अब भी 5.1 का उपयोग करती दिखती है
    • वास्तव में स्थिति इससे भी अधिक है। luau और luaJIT भी आधिकारिक lua प्रोजेक्ट से अलग-अलग दिशाओं में विकसित हुए हैं, इसलिए अब वे एक-दूसरे के साथ सूक्ष्म रूप से compatible भी नहीं रहे। सब Lua 5.1 से निकले थे, लेकिन अब ऐसा लगता है जैसे कोई औपचारिक standard बचा ही नहीं
    • बड़ा अंतर यह है कि Lua कम्युनिटी backward compatibility टूटने पर खुलकर निंदा नहीं करती, इसलिए अलग-अलग versions के लिए code लिखना काफ़ी आसान रहता है
    • आधिकारिक आँकड़े मिलना कठिन है, लेकिन अनुभव के आधार पर लगता है कि 5.1 और 5.2 के उपयोगकर्ता 5.4 से अधिक हैं, और शायद 5.3 से भी अधिक। LuaJIT में रुचि बहुत है, लेकिन वास्तविक उपयोग में वह उतना अक्सर दिखाई नहीं देता
    • LuaJIT में Lua के नए versions(5.2, 5.3) की कुछ सुविधाएँ भी शामिल हैं और उससे अधिक features भी हैं https://luajit.org/extensions.html
  • मुझे सबसे दिलचस्प यह लगा कि कुछ मामलों में Luau interpreter, LuaJIT के बराबर पहुँच जाता है। performance पेज पर इसकी अच्छी व्याख्या है, और इससे Roblox की engineering क्षमता का एहसास होता है https://luau.org/performance
  • मेरे 13 साल के बच्चे की Roblox Studio में रुचि के कारण मुझे Luau के बारे में पता चला और मैंने luau.org भी देखा। Roblox की engineering वास्तव में प्रभावशाली है
    • Arseny Kapoulkine एक बेहतरीन engineer हैं। उनके blog या social media को follow करना अच्छा रहेगा। luau और Roblox के rendering engine के अलावा उन्होंने meshoptimizer भी बनाया है, जो graphics industry में लगभग अनिवार्य रूप से इस्तेमाल होने वाली library है, और volk तो Vulkan SDK में भी शामिल है
  • Second Life अब पुराने Linden Scripting Language से Luau की ओर जा रहा है। पहले यह Mono-आधारित compile system था, लेकिन Mono अब maintain नहीं हो रहा, इसलिए नई भाषा की ज़रूरत पड़ी। सिर्फ़ Luau support ही नहीं, बल्कि मौजूदा LSL compiler को भी Luau execution engine को target करने के लिए बदला गया है। performance में भी थोड़ा सुधार हुआ है। Second Life एक अनोखा environment है जहाँ सर्वर पर लाखों event-driven scripts चलती हैं, इसलिए resource management आसान नहीं है; निष्क्रिय प्रोग्राम अगर हर frame में 1 microsecond भी लें, तो उसका जमा असर बड़ी समस्या बन सकता है
    • Luau beta environment खुलने पर मैंने इसे खुद इस्तेमाल किया और महसूस किया कि पुरानी Mono system की तुलना में performance काफ़ी बेहतर हुई है। खासकर save करते समय script checking की speed 10 सेकंड से घटकर लगभग तुरंत हो गई, जिससे development efficiency बहुत बढ़ी। हालाँकि, अगर FiveM की तरह coroutine को आसानी से संभालने के लिए CreateThread(fn), Wait(ms) जैसी helper functions और Await/Promises सपोर्ट होता तो और अच्छा होता(Luau Promise implementation)। FiveM में ऐसे wrappers की वजह से script optimization और coroutine management आसान हो जाता है, FiveM Lua scheduler example
    • VM बदलने के बाद जो बात तुरंत नज़र आती है, वह यह कि पहले का overhead scheduling, context switching, और library functions के implementation में अधिक था। Luau में design के स्तर पर preemptive scheduling अधिक स्वाभाविक रूप से समर्थित है, इसलिए simple glue code coordination काफ़ी आसान हो जाता है। VM स्तर पर इसे संभालना AST या bytecode स्तर पर state machine transformation करने की तुलना में बहुत सस्ता और लागू करना आसान है। idle programs का microsecond-स्तरीय overhead भी अंततः scheduler को ही optimize करना होता है
  • Lua का मूल minimal charm type inference की वजह से कुछ हद तक कमज़ोर हुआ है, लेकिन यह type safety के बदले मिलने वाला trade-off है। मगर --!strict घोषित करने के बाद भी स्पष्ट type violation होने पर बिना किसी error या warning के code का चल जाना मेरे लिए चौंकाने वाला था। यह मेरी अपेक्षा से अलग व्यवहार था
    • फिलहाल Luau का type system "अनिवार्य(strict)" नहीं है। code को type check किए बिना भी चलाया जा सकता है, और demo या luau executable से सीधे चलाने पर type checking लागू नहीं होती। अगर embedded environment में compile से पहले सभी code पर अनिवार्य type checking कराई जाए, तो अपेक्षा के अनुरूप type errors पकड़े जा सकते हैं। यह इस डिज़ाइन का लगभग अनिवार्य परिणाम है, क्योंकि लाखों लाइनों के Lua 5.1 codebase को एक साथ Luau में बदला गया था
  • मैं हमेशा Typed Lua चाहता था, लेकिन dynamic languages में पूर्ण type checker और LSP लागू करना काफ़ी कठिन रहा है। हर dynamic language में कुछ हद तक समान structural typing समस्याएँ होती हैं(TypeScript जैसी समस्याएँ)। सोचता हूँ कि अगर TypeScript engine को reuse करके Luau code को आंशिक रूप से TypeScript में बदला जाए, फिर tsc से जाँच कराकर errors/results को वापस Luau पर map किया जाए, तो क्या इससे कई dynamic languages के लिए तेज़ type checker बनाए जा सकते हैं
    • जैसे LLVM compiler के लिए एक common IR की तरह काम करता है, वैसे ही type system के लिए TypeScript type system को एक common backend या "intermediate language" की तरह इस्तेमाल करना संभव लग सकता है। मुझे dynamic languages विशेष पसंद नहीं, लेकिन अगर TypeScript-स्तर की type checking और tooling support मिले तो मेरी रुचि बढ़ेगी। जो चीज़ें संभव न हों उन्हें छोड़ देना ही gradual typing का सार है। अगर TypeScript type system Lua runtime में आता, तो मैं उसे ज़रूर आज़माता। Luau की दिशा पर भी मेरी नज़र है
    • Luau के लिए पहले से ही शानदार Luau Language Server मौजूद है, जो vscode, nvim, zed आदि में बेहतरीन diagnostics, autocomplete, और strict type checking देता है। Ruby या Python की तुलना में मुझे इससे कहीं बेहतर development experience मिला है। मैं shell scripting से लेकर general programming तक में Luau का उपयोग कर रहा हूँ, और seal नाम का अपना node-styled runtime भी बनाया है। Roblox developers CI/CD, testing आदि के लिए अधिक लोकप्रिय Lune का उपयोग करते हैं
    • dynamic language के हर कोने को TypeScript से type करने की कोशिश करने पर system बहुत जटिल हो जाता है, इसलिए मेरा मानना है कि Rescript या Gleam की तरह target language पर कुछ सीमाएँ लगाकर Hindley–Milner type system अपनाना बेहतर होगा। HM type system लंबे अनुभव और सिद्धांत के कारण मज़बूत और व्यावहारिक है। व्यक्तिगत रूप से मुझे आश्चर्य है कि Lua में code emit करने वाला कोई छोटा ML-परिवार का language project बहुत दिखाई नहीं देता। अगर Gleam Lua backend को सपोर्ट करे तो वह बहुत अच्छी तरह फिट बैठेगा
    • ऐसा एक प्रोजेक्ट पहले से मौजूद है: TypeScriptToLua। Love2D में इसे काफ़ी ठीक-ठाक इस्तेमाल करने का अनुभव रहा है