लुआ (प्रोग्रामिंग भाषा)

हांग और कमजोर टाइपिंग, बतख टाइपिंग MoonSharp, [//luvit.io Luvit], [//www.luart.org LuaRT], Luau | विकिबुक्स = }}
 * कार्यान्वयन = [//www.lua.org/download.html Lua], LuaJIT, [//eliasdaler.github.io/luavela/ LuaVela],
 * प्रोग्रामिंग_भाषा = एएनएसआई सी
 * बोलियाँ = Metalua, आइडल, जीएसएल शेल
 * impact_by = C++, CLU (प्रोग्रामिंग भाषा), Modula-2, योजना (प्रोग्रामिंग भाषा), SNOBOL
 * प्रभावित = GameMonkey Script, आयो (प्रोग्रामिंग भाषा), जावास्क्रिप्ट, जूलिया (प्रोग्रामिंग भाषा), मिनी डी, लाल (प्रोग्रामिंग भाषा), रिंग_ (प्रोग्रामिंग_भाषा), रूबी (प्रोग्रामिंग भाषा), गिलहरी (प्रोग्रामिंग भाषा), मूनस्क्रिप्ट, सी--
 * ऑपरेटिंग_सिस्टम = क्रॉस-प्लेटफॉर्म
 * लाइसेंस = मेरा लाइसेंस
 * वेबसाइट =
 * फ़ाइल एक्सट =

लुआ (से लुआ [ˈlu.(w)ɐ] अर्थ चंद्रमा) एक हल्की प्रोग्रामिंग भाषा, उच्च-स्तरीय प्रोग्रामिंग भाषा, बहु-प्रतिमान प्रोग्रामिंग भाषा है जिसे मुख्य रूप से अनुप्रयोगों में स्क्रिप्टिंग भाषा के लिए डिज़ाइन किया गया है। लुआ क्रॉस-प्लेटफ़ॉर्म है, चूंकि संकलक बाईटकोड का इंटरप्रेटर (कंप्यूटिंग) एएनएसआई सी में लिखा गया है, और लुआ के पास इसे अनुप्रयोगों में अंतःस्थापित करने के लिए अपेक्षाकृत सरल सी एपीआई है।

लुआ की उत्पत्ति 1993 में उस समय अनुकूलन की बढ़ती मांग को पूरा करने के लिए सॉफ्टवेयर अनुप्रयोगों के विस्तार के लिए एक भाषा के रूप में हुई थी। इसने अधिकांश प्रक्रियात्मक प्रोग्रामिंग भाषाओं की बुनियादी सुविधाएं प्रदान किया था, लेकिन अधिक जटिल या डोमेन-विशिष्ट भाषा सुविधाओं को शामिल नहीं किया गया; बल्कि, इसमें प्रोग्रामर को ऐसी सुविधाओं को लागू करने की अनुमति देने वाली भाषा का विस्तार करने के लिए तंत्र शामिल थे। जैसा कि लुआ को एक सामान्य अंतःस्थापित करने योग्य विस्तार भाषा बनाने का इरादा था, लुआ के डिजाइनरों ने इसकी रूपरेखा (कंप्यूटर प्रोग्रामिंग), में पोर्टेबिलिटी, एक्स्टेंसिबिलिटी और विकास में उपयोग में आसानी पर ध्यान केंद्रित किया था।

इतिहास
लुआ को 1993 में ब्राज़िल में रियो डी जनेरियो के परमधर्मपीठीय कैथोलिक विश्वविद्यालय में कंप्यूटर ग्राफिक्स टेक्नोलॉजी ग्रुप (टेक्ग्राफ) के सदस्य रॉबर्टो इरुसलिम्स्की, लुइज़ हेनरिक डी फिगुएरेडो और वाल्डेमर सेलेस द्वारा बनाया गया था।

1977 से 1992 तक, ब्राजील में कंप्यूटर हार्डवेयर और सॉफ्टवेयर के लिए मजबूत व्यापार बाधाओं (जिसे मार्केट रिजर्व कहा जाता है) की नीति थी। उस माहौल में, टेकग्राफ के ग्राहक राजनीतिक या आर्थिक रूप से विदेश से अनुकूलित सॉफ्टवेयर खरीदने का जोखिम नहीं उठा सकते थे। उन कारणों ने टेकग्राफ को खरोंच से आवश्यक बुनियादी उपकरणों को लागू करने के लिए प्रेरित किया था।

लुआ के पूर्ववर्ती डेटा-विवरण/कॉन्फ़िगरेशन भाषाएँ एसओएल (सिंपल ऑब्जेक्ट लैंग्वेज) और डीईएल (डेटा-एंट्री भाषा) थीं। वे 1992-1993 में टेकग्राफ में दो अलग-अलग परियोजनाओं में कुछ लचीलापन जोड़ने के लिए स्वतंत्र रूप से विकसित किए गए थे (दोनों पेट्रोब्रास कंपनी में इंजीनियरिंग अनुप्रयोगों के लिए इंटरैक्टिव ग्राफिकल प्रोग्राम थे)। एसओएल और डीईएल में किसी भी प्रवाह-नियंत्रण संरचनाओं की कमी थी, और पेट्रोब्रास ने उन्हें पूर्ण प्रोग्रामिंग शक्ति जोड़ने की बढ़ती आवश्यकता महसूस किया था।

लुआ के विकास में, भाषा के लेखकों ने लिखा:

"1993 में, एकमात्र वास्तविक दावेदार टीसीएल था, जिसे स्पष्ट रूप से अनुप्रयोगों में एम्बेड करने के लिए डिज़ाइन किया गया था। हालाँकि, Tcl में अपरिचित सिंटैक्स था, डेटा विवरण के लिए अच्छा समर्थन नहीं देता था, और केवल यूनिक्स प्लेटफॉर्म पर चलता था। हमने एलआईएसपी या स्कीम पर विचार नहीं किया क्योंकि उनके अमित्र सिंटैक्स थे। पायथन अभी भी अपनी प्रारंभिक अवस्था में था। फ्री, डू-इट-योरसेल्फ वातावरण में जो तब टेकग्राफ में राज करता था, यह काफी स्वाभाविक था कि हमें अपनी खुद की स्क्रिप्टिंग भाषा विकसित करने की कोशिश करनी चाहिए ... क्योंकि भाषा के कई संभावित उपयोगकर्ता पेशेवर प्रोग्रामर नहीं थे, भाषा से बचना चाहिए गूढ़ वाक्य रचना और शब्दार्थ। नई भाषा का कार्यान्वयन अत्यधिक पोर्टेबल होना चाहिए, क्योंकि टेकग्राफ के ग्राहकों के पास कंप्यूटर प्लेटफॉर्म का एक बहुत ही विविध संग्रह था। अंत में, चूंकि हमें उम्मीद थी कि अन्य टेकग्राफ उत्पादों को भी एक स्क्रिप्टिंग भाषा को एम्बेड करने की आवश्यकता होगी, नई भाषा को एसओएल के उदाहरण का पालन करना चाहिए और सी एपीआई के साथ एक पुस्तकालय के रूप में प्रदान किया जाना चाहिए।"

लुआ 1.0 को इस तरह से डिजाइन किया गया था कि इसके ऑब्जेक्ट कंस्ट्रक्टर्स, वर्तमान प्रकाश और लचीली शैली से थोड़ा अलग होने के कारण, एसओएल के डेटा-विवरण सिंटैक्स को शामिल (इसलिए नाम लुआ: सोल का अर्थ पुर्तगाली में सूर्य, और लुआ का अर्थ चंद्रमा) किया गया है। नियंत्रण संरचनाओं के लिए लुआ सिंटेक्स (प्रोग्रामिंग भाषाएं) ज्यादातर मापांक (, ,  / ) से उधार लिया गया था, लेकिन सीएलयू (प्रोग्रामिंग लैंग्वेज) (कई असाइनमेंट और फ़ंक्शन कॉल से कई रिटर्न, संदर्भ या स्पष्ट सूचक (कंप्यूटर प्रोग्रामिंग) द्वारा कॉल करने के लिए एक सरल विकल्प के रूप में), सी ++ (एक स्थानीय चर को अनुमति देने का साफ विचार) से भी प्रभावित हुआ था। केवल वहीं घोषित किया जाए जहां हमें इसकी आवश्यकता है ), SNOBOL और AWK (सहयोगी सरणियाँ)। डॉ. डॉब के जर्नल में प्रकाशित एक लेख में, लुआ के रचनाकारों ने यह भी कहा कि एलआईएसपी और योजना उनके एकल, सर्वव्यापी डेटा-संरचना तंत्र (सूची (सार डेटा प्रकार)) के साथ तालिका को लुआ की प्राथमिक डेटा संरचना के रूप में विकसित करने के उनके निर्णय पर एक बड़ा प्रभाव था।

लुआ सिमेंटिक्स समय के साथ विशेष रूप से गुमनाम कार्यों और पूर्ण शाब्दिक दायरे की शुरुआत के साथ योजना से प्रभावित हुए हैं। नए लुआ संस्करणों में कई सुविधाएँ जोड़ी गईं।

संस्करण 5.0 से पहले लुआ के संस्करण बीएसडी लाइसेंस के समान लाइसेंस के तहत जारी किए गए थे। संस्करण 5.0 के बाद से, लुआ को एमआईटी लाइसेंस के तहत लाइसेंस दिया गया है। दोनों अनुमेय मुफ्त सॉफ्टवेयर लाइसेंस हैं और लगभग समान हैं।

सुविधाएँ
लुआ को आमतौर पर बहु-प्रतिमान प्रोग्रामिंग भाषा के रूप में वर्णित किया जाता है। बहु-प्रतिमान भाषा, सामान्य सुविधाओं का एक छोटा सा सेट प्रदान करती है जिसे विभिन्न प्रकार की समस्या के लिए बढ़ाया जा सकता है। लुआ में वंशानुक्रम (वस्तु-उन्मुख प्रोग्रामिंग) के लिए स्पष्ट समर्थन नहीं है, लेकिन इसे मेटासूचियाँ के साथ लागू करने की अनुमति देता है। इसी तरह, लुआ प्रोग्रामर्स को नामस्थान, क्लास (कंप्यूटर प्रोग्रामिंग), और अन्य संबंधित विशेषताओं को इसके एकल टेबल कार्यान्वयन का उपयोग करने की अनुमति देता है; प्रथम श्रेणी के कार्य कार्यात्मक प्रोग्रामिंग से कई तकनीकों के रोजगार की अनुमति देते हैं; और पूर्ण लेक्सिकल स्कूपिंग कम से कम विशेषाधिकार के सिद्धांत को लागू करने के लिए ठीक-ठाक जानकारी को छिपाने की अनुमति देता है।

सामान्य तौर पर, लुआ सरल, लचीली मेटाप्रोग्रामिंग प्रदान करने का प्रयास करता है, जिसे एक प्रोग्रामिंग प्रतिमान के लिए विशिष्ट फीचर-सेट की आपूर्ति के बजाय आवश्यकतानुसार बढ़ाया जा सकता है। नतीजतन, आधार भाषा हल्की है, पूर्ण संदर्भ इंटरप्रेटर केवल 247 किलोबाइट संकलित है और अनुप्रयोगों की एक विस्तृत श्रृंखला के लिए आसानी से अनुकूलनीय है।

विस्तार भाषा या स्क्रिप्टिंग भाषा के रूप में उपयोग के लिए एक गतिशील रूप से टाइप की गई भाषा, लुआ विभिन्न प्रकार के होस्ट प्लेटफॉर्म पर फिट होने के लिए पर्याप्त कॉम्पैक्ट है। यह बूलियन डेटा मान, संख्या (दोहरा-परिशुद्धता फ़्लोटिंग पॉइंट और डिफ़ॉल्ट रूप से 64-बिट पूर्णांक), और स्ट्रिंग (कंप्यूटर विज्ञान) जैसे परमाणु डेटा संरचनाओं की एक छोटी संख्या का समर्थन करता है। लुआ की एकल मूल डेटा संरचना, तालिका, जो अनिवार्य रूप से एक विषम साहचर्य सरणी है, का उपयोग करके सरणियों, सेटों, सूची (कंप्यूटिंग) और रिकॉर्ड (कंप्यूटर विज्ञान) जैसे विशिष्ट सेट (कंप्यूटर विज्ञान) संरचनाओं का प्रतिनिधित्व किया जा सकता है।

लुआ उन्नत सुविधाओं के एक छोटे सेट को लागू करता है जैसे प्रथम श्रेणी के कार्य, कचरा संग्रह (कंप्यूटर विज्ञान), क्लोजर (कंप्यूटर विज्ञान), उचित पूंछ की पुनरावृत्ति, प्रकार रूपांतरण (रन टाइम पर स्ट्रिंग और संख्या मानों के बीच स्वत: रूपांतरण), कोरटाइन (सहकारी) मल्टीटास्किंग) और गतिशील लोडिंग बंद करता है।

सिंटेक्स
क्लासिक हैलो, वर्ल्ड! कार्यक्रम को इस प्रकार लिखा जा सकता है: या के रूप में लुआ में एक टिप्पणी (कंप्यूटर प्रोग्रामिंग) एक डबल-हाइफ़न के साथ शुरू होती है और एडा (प्रोग्रामिंग भाषा), एफिल (प्रोग्रामिंग भाषा), हास्केल (प्रोग्रामिंग भाषा), एसक्यूएल और वीएचडीएल के समान लाइन के अंत तक चलती है। बहु-पंक्ति तार और टिप्पणियाँ दोहरे वर्ग कोष्ठक से सुशोभित हैं। कारख़ाने का फ़ंक्शन को इस उदाहरण में एक फ़ंक्शन के रूप में लागू किया गया है:

नियंत्रण प्रवाह
लुआ में एक प्रकार की सशर्त (कंप्यूटर प्रोग्रामिंग) परीक्षण होता है:  वैकल्पिक के साथ   तथा   निष्पादन नियंत्रण का निर्माण होता है।

सामान्य  कथन के लिए तीनों खोजशब्दों की आवश्यकता होती है:   कीवर्ड को एक साथ स्टेटमेंट ब्लॉक के साथ निष्पादन को नियंत्रित करने के लिए जोड़ा जा सकता है, जब   स्थिति  का मूल्यांकन करता है: कई स्थितियों के अनुसार   का उपयोग करके निष्पादन को नियंत्रित किया जा सकता है, खोजशब्द: लुआ में चार प्रकार के कंडीशनल लूप होते हैं,   लूप,   लूप (लूप के दौरान   के समान) लूप   न्यूमेरिक और लूप    के लिए जेनेरिक होता है। लूप   सामान्यतः  सूची पर पुनरावृति फलन   का उपयोग करके तालिका   पर पुनरावृत्त होगा, जब तक कि यह  न हो जाए।

लूप को नेस्टेड (प्रोग्रामिंग) भी किया जा सकता है (दूसरे लूप के अंदर डालें)।

कार्य
प्रथम श्रेणी के फलन के रूप में लुआ के कार्यों का उपचार निम्न उदाहरण में दिखाए गए हैं, जहां प्रिंट फलन का व्यवहार संशोधित किया गया है: कोई भविष्य कॉल करता है  अब नए फ़ंक्शन के माध्यम से रूट किया जाएगा, और लुआ के स्कोप (प्रोग्रामिंग) लेक्सिकल स्कोपिंग के कारण, पुराना प्रिंट फ़ंक्शन केवल नए, संशोधित प्रिंट द्वारा ही एक्सेस किया जा सकेगा।

लुआ क्लोजर (कंप्यूटर प्रोग्रामिंग) का भी समर्थन करता है, जैसा कि नीचे दिखाया गया है: वेरिएबल  के लिए एक नया क्लोजर हर बार   को कॉल करने के लिए बनाया जाता है, ताकि लौटाया गया प्रत्येक नया अज्ञात फ़ंक्शन हमेशा स्वयं के   पैरामीटर तक पहुंच सके। किसी अन्य वस्तु की तरह, लुआ के कचरा संग्राहक द्वारा बंद का प्रबंधन किया जाता है।

सारिणी
लुआ में सूचियाँ सबसे महत्वपूर्ण डेटा संरचनाएं हैं (और, डिज़ाइन द्वारा, केवल अंतर्निहित समग्र डेटा प्रकार) और सभी उपयोगकर्ता-निर्मित प्रकारों का आधार हैं। वे स्वचालित संख्यात्मक कुंजी और विशेष सिंटैक्स के साथ साहचर्य सरणियाँ हैं।

तालिका कुंजी और डेटा जोड़े का एक संग्रह है, जहां डेटा को कुंजी द्वारा संदर्भित किया जाता है; दूसरे शब्दों में, यह एक हैश तालिका विषम साहचर्य सरणी है।

कंस्ट्रक्टर सिंटैक्स का उपयोग करके तालिकाएँ बनाई जाती हैं। तालिकाएँ हमेशा संदर्भ द्वारा पारित की जाती हैं (देखें साझा करके कॉल करें)।

फलन सहित  और NaN, को छोड़कर एक कुंजी (इंडेक्स) कोई भी मान हो सकता है। कुंजी के रूप में स्ट्रिंग (कंप्यूटर विज्ञान) का उपयोग करके एक तालिका को अक्सर वस्तु रचना (या रिकॉर्ड (कंप्यूटर विज्ञान)) के रूप में उपयोग किया जाता है। क्योंकि इस तरह का उपयोग बहुत आम है, लुआ ऐसे क्षेत्रों तक पहुँचने के लिए एक विशेष सिंटैक्स पेश करता है। संबंधित कार्यों को संग्रहीत करने के लिए तालिका का उपयोग करके, यह नामस्थान के रूप में कार्य कर सकता है। सूचियाँ को स्वचालित रूप से एक संख्यात्मक कुंजी असाइन की जाती है, जिससे उन्हें सरणी डेटा प्रकार के रूप में उपयोग करने में सक्षम बनाया जाता है। पहला स्वचालित सूचकांक 0 के बजाय 1 है क्योंकि यह कई अन्य प्रोग्रामिंग भाषाओं के लिए है (हालांकि 0 के स्पष्ट सूचकांक की अनुमति है)।

एक संख्यात्मक कुंजी  एक स्ट्रिंग कुंजी   से अलग है. तालिका  की लंबाई को किसी भी पूर्णांक सूचकांक   के रूप में परिभाषित किया गया है जैसे कि   शून्य नहीं है और     हैं; इसके अलावा, अगर    हैं, तो   शून्य हो सकता है। एक नियमित सरणी के लिए, 1 से दिए गए   के गैर-शून्य मानों के साथ, इसकी लंबाई बिल्कुल वही   हैं, जो इसके अंतिम मान का सूचकांक हैं। यदि सरणी में छेद हैं (अर्थात, अन्य गैर-शून्य मानों के बीच शून्य मान), तो   कोई भी सूचकांक हो सकता हैं, जो   मान से पहले होता हैं (अर्थात, यह सरणी के अंत के रूप में ऐसे किसी भी शून्य मान पर विचार कर सकता है)। एक तालिका वस्तुओं की एक सरणी हो सकती है। किसी सरणी का अनुकरण करने के लिए हैश मैप का उपयोग करना सामान्य रूप से वास्तविक सरणी का उपयोग करने की तुलना में धीमा होता है; हालाँकि, इस समस्या से बचने में मदद करने के लिए लुआ तालिकाओं को सरणियों के रूप में उपयोग करने के लिए अनुकूलित किया गया है।

मेटाटेबल्स
एक्स्टेंसिबल शब्दार्थ लुआ की एक प्रमुख विशेषता है, और मेटाटेबल अवधारणा तालिकाओं के शक्तिशाली अनुकूलन की अनुमति देती है। निम्न उदाहरण एक अनंत तालिका प्रदर्शित करता है। किसी के लिए,   दे देंगे  गतिशील प्रोग्रामिंग और memoization का उपयोग करते हुए -वां फाइबोनैचि संख्या। <वाक्यविन्यास लैंग = लुआ> तंतु = {1, 1} -- तंतु [1] और तंतु [2] के लिए प्रारंभिक मूल्य। सेटमेटेटेबल (फ़ाइब, { __index = function(values, n) --__index लुआ द्वारा पूर्वनिर्धारित एक फ़ंक्शन है,                                                   इसे कहा जाता है अगर कुंजी एन मौजूद नहीं है।    मान [n] = मान [n - 1] + मान [n - 2] - तंतुओं की गणना करें और याद रखें [n]।    वापसी मूल्य [एन]  समाप्त }) 

वस्तु-उन्मुख प्रोग्रामिंग
हालांकि लुआ में कक्षा (कंप्यूटर विज्ञान) की एक अंतर्निहित अवधारणा नहीं है, वस्तु-उन्मुख प्रोग्रामिंग को कार्यों और तालिकाओं का उपयोग करके अनुकरण किया जा सकता है। टेबल में मेथड्स और फील्ड्स डालकर ऑब्जेक्ट बनाया जाता है। इनहेरिटेंस (वस्तु उन्मुख कार्यकर्म) (सिंगल और मल्टीपल दोनों) को मेटाटेबल्स के साथ लागू किया जा सकता है, गैर-मौजूद तरीकों और फ़ील्ड्स को पैरेंट ऑब्जेक्ट के रूप में प्रस्तुत किया जा सकता है।

इन तकनीकों के साथ वर्ग जैसी कोई अवधारणा नहीं है; बल्कि, स्व (प्रोग्रामिंग भाषा) या जावास्क्रिप्ट के समान, प्रोटोटाइप-आधारित प्रोग्रामिंग का उपयोग किया जाता है। नई वस्तुओं को या तो फ़ैक्टरी विधि पैटर्न (जो स्क्रैच से नई वस्तुओं का निर्माण करता है) या किसी मौजूदा वस्तु का क्लोन बनाकर बनाया जाता है।

एक बुनियादी वेक्टर (ज्यामिति) वस्तु बनाना: <वाक्यविन्यास लैंग = लुआ> स्थानीय वेक्टर = {} स्थानीय वेक्टरमेटा = {__इंडेक्स = वेक्टर}

फ़ंक्शन वेक्टर.न्यू (एक्स, वाई, जेड) - निर्माता रिटर्न सेटमेटेबल ({x = x, y = y, z = z}, वेक्टरमेटा) समाप्त

समारोह वेक्टर.परिमाण (स्वयं) - एक और तरीका वापसी गणित.sqrt(self.x^2 + self.y^2 + self.z^2) समाप्त

स्थानीय vec = वेक्टर.नया (0, 1, 0) - एक वेक्टर बनाएं प्रिंट (vec.magnitude (vec)) - एक विधि कॉल करें (आउटपुट: 1) प्रिंट (vec.x) - एक सदस्य चर तक पहुँचें (आउटपुट: 0) 

यहां, setmetatable लुआ को एक तत्व की तलाश करने के लिए कहता है Vector तालिका में यदि यह मौजूद नहीं है vec मेज़। vec.magnitude, जो बराबर है vec["magnitude"], पहले में दिखता है vec के लिए तालिका magnitude तत्व। vec }} टेबल में a नहीं है magnitude तत्व, लेकिन इसके मेटाटेबल प्रतिनिधि Vector के लिए तालिका magnitude तत्व जब यह में नहीं पाया जाता है vec मेज़।

लुआ ऑब्जेक्ट ओरिएंटेशन को सुविधाजनक बनाने के लिए कुछ सिंटैक्टिक चीनी प्रदान करता है। एक प्रोटोटाइप टेबल के अंदर मेथड (कंप्यूटर साइंस) घोषित करने के लिए, कोई भी उपयोग कर सकता है function table:func(args), जो बराबर है function table.func(self, args). कॉलिंग क्लास के तरीके भी कोलन का उपयोग करते हैं: object:func(args) के बराबर है object.func(object, args).

इसे ध्यान में रखते हुए, यहाँ एक संगत वर्ग है : सिंटैक्टिक चीनी:

<वाक्यविन्यास लैंग = लुआ> स्थानीय वेक्टर = {} वेक्टर.__इंडेक्स = वेक्टर

फ़ंक्शन वेक्टर: नया (x, y, z) - कंस्ट्रक्टर - चूंकि फ़ंक्शन परिभाषा एक कोलन का उपयोग करती है, - इसका पहला तर्क स्वयं है जो संदर्भित करता है - वेक्टर के लिए रिटर्न सेटमेटेबल ({x = x, y = y, z = z}, स्वयं) समाप्त

फ़ंक्शन वेक्टर: परिमाण - एक और तरीका - स्वयं का उपयोग करके अंतर्निहित वस्तु का संदर्भ लें वापसी गणित.sqrt(self.x^2 + self.y^2 + self.z^2) समाप्त

स्थानीय vec = वेक्टर: नया (0, 1, 0) - एक वेक्टर बनाएँ प्रिंट (vec: परिमाण ) - एक विधि कॉल करें (आउटपुट: 1) प्रिंट (vec.x) - एक सदस्य चर तक पहुँचें (आउटपुट: 0) 

वंशानुक्रम
लुआ वर्ग विरासत देने के लिए लुआ मेटाटेबल्स का उपयोग करने का समर्थन करता है।

मेटाटेबल्स

एक्स्टेंसिबल शब्दार्थ लुआ की एक प्रमुख विशेषता है, और मेटाटेबल अवधारणा तालिकाओं के शक्तिशाली अनुकूलन की अनुमति देती है। निम्न उदाहरण एक "अनंत" तालिका प्रदर्शित करता है। किसी भी  के लिए,    डायनेमिक प्रोग्रामिंग और मेमोइज़ेशन का उपयोग करके  -वें फाइबोनैचि संख्या देगा। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग

हालांकि लुआ में कक्षाओं की एक अंतर्निहित अवधारणा नहीं है, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को फ़ंक्शंस और तालिकाओं का उपयोग करके अनुकरण किया जा सकता है। टेबल में मेथड्स और फील्ड्स डालकर ऑब्जेक्ट बनाया जाता है। इनहेरिटेंस (सिंगल और मल्टीपल दोनों) को मेटाटेबल्स के साथ लागू किया जा सकता है, गैर-मौजूद तरीकों और फील्ड्स को पैरेंट ऑब्जेक्ट को सौंप दिया जाता है।

इन तकनीकों के साथ "वर्ग" जैसी कोई अवधारणा नहीं है; बल्कि, स्व या जावास्क्रिप्ट के समान प्रोटोटाइप का उपयोग किया जाता है। नई वस्तुओं को या तो फ़ैक्टरी विधि (जो स्क्रैच से नई वस्तुओं का निर्माण करती है) या किसी मौजूदा वस्तु का क्लोन बनाकर बनाई जाती है।

एक बुनियादी सदिश वस्तु बनाना: यहां,  लूआ को   वेक्टर तालिका में एक तत्व की तलाश करने के लिए कहता है यदि यह    तालिका में   मौजूद नहीं है, जो   के समतुल्य है, सबसे पहले परिमाण तत्व के लिए   तालिका में दिखता है।   तालिका में एक   तत्व नहीं होता है, लेकिन जब यह   तालिका में नहीं मिलता है तो   तत्व के लिए   तालिका में इसका मेटाटेबल प्रतिनिधि होता है।

लुआ ऑब्जेक्ट ओरिएंटेशन को सुविधाजनक बनाने के लिए कुछ सिंटैक्टिक चीनी प्रदान करता है। एक प्रोटोटाइप तालिका के अंदर सदस्य कार्यों की घोषणा करने के लिए, कोई  का उपयोग कर सकता है, जो   के बराबर है। कॉलिंग क्लास के तरीके भी कोलन:   का उपयोग करते हैं जो   के बराबर है।

इसे ध्यान में रखते हुए, यहाँ एक संगत वर्ग है: वाक्यात्मक खंड:

वंशानुक्रम

लुआ वर्ग विरासत देने के लिए लुआ मेटाटेबल्स का उपयोग करने का समर्थन करता है। इस उदाहरण में, हम वैक्टर को एक व्युत्पन्न वर्ग में उनके मानों को एक स्थिरांक से गुणा करने की अनुमति देते हैं। लुआ एकाधिक वंशानुक्रम का भी समर्थन करता है; __index या तो एक फलन या एक टेबल हो सकता है। ऑपरेटर ओवरलोडिंग भी की जा सकती है; लुआ मेटासूचियाँ में __add, __sub आदि जैसे तत्व हो सकते हैं।

कार्यान्वयन
लुआ प्रोग्राम सीधे टेक्स्ट वाली लुआ फ़ाइल से भाषा की व्याख्या नहीं करते हैं, लेकिन बायटेकोड में संकलित किया जाता है, जिसे बाद में लुआ आभासी मशीन पर चलाया जाता है। संकलन प्रक्रिया आमतौर पर उपयोगकर्ता के लिए अदृश्य होती है और रन टाइम (प्रोग्राम जीवनचक्र चरण) के दौरान की जाती है, खासकर जब एक जेआईटी संकलित का उपयोग किया जाता है, लेकिन लोडिंग प्रदर्शन को बढ़ाने या मेजबान पर्यावरण के स्मृति पदचिह्न को कम करने के लिए इसे ऑफ़लाइन किया जा सकता है। स्ट्रिंग लाइब्रेरी से  फ़ंक्शन और   फ़ंक्शंस का उपयोग करके लुआ बाइटकोड को लुआ के भीतर से भी उत्पादित और निष्पादित किया जा सकता है। लुआ संस्करण 5.3.4 सी कोड की लगभग 24,000 पंक्तियों में लागू किया गया है।

अधिकांश सीपीयू की तरह, और अधिकांश वर्चुअल मशीनों (जो स्टैक मशीन|स्टैक-आधारित हैं) के विपरीत, लुआ वीएम रजिस्टर मशीन-आधारित है, और इसलिए वास्तविक हार्डवेयर डिज़ाइन के अधिक निकट है। रजिस्टर आर्किटेक्चर दोनों मानों की अत्यधिक प्रतिलिपि से बचाता है और प्रति कार्य निर्देशों की कुल संख्या को कम करता है। लुआ 5 की वर्चुअल मशीन व्यापक उपयोग के लिए पहले रजिस्टर-आधारित शुद्ध वीएम में से एक है। पैरेट आभासी मशीन और एंड्राइड (ऑपरेटिंग सिस्टम) का दल्विक (सॉफ़्टवेयर) दो अन्य प्रसिद्ध रजिस्टर-आधारित वीएम हैं। पीसीस्कीम का वीएम भी रजिस्टर-आधारित था।

यह उदाहरण ऊपर परिभाषित फैक्टोरियल फ़ंक्शन की बायटेकोड सूची है (जैसा कि  5.1 संकलक द्वारा दिखाया गया है):

सी एपीआई (एप्लिकेशन प्रोग्रामिंग अंतरफलक)
लुआ को अन्य अनुप्रयोगों में अंतःस्थापित करने का इरादा है, और इस उद्देश्य के लिए सी (प्रोग्रामिंग भाषा) एप्लीकेशन प्रोग्रामिंग अंतरफलक प्रदान करता है। एपीआई को दो भागों में बांटा गया है: लुआ कोर और लुआ सहायक पुस्तकालय। लुआ एपीआई का डिज़ाइन, पायथन (प्रोग्रामिंग लैंग्वेज) के एपीआई के विपरीत, C कोड में मैन्युअल संदर्भ गिनती की आवश्यकता को समाप्त करता है। एपीआई, भाषा की तरह, न्यूनतर है। उन्नत कार्यक्षमता सहायक पुस्तकालय द्वारा प्रदान की जाती है, जिसमें बड़े पैमाने पर पूर्वप्रक्रमक मैक्रो (कंप्यूटर विज्ञान) होते हैं जो जटिल तालिका संचालन में सहायता करते हैं।

लुआ सी एपीआई स्टैक (डेटा संरचना) आधारित है। लुआ स्टैक से सबसे सरल सी डेटा प्रकारों (पूर्णांक, फ़्लोट्स, आदि) को पुश और पॉप करने के लिए फ़ंक्शन प्रदान करता है, साथ ही स्टैक के माध्यम से तालिकाओं में हेरफेर करने के लिए फ़ंक्शन प्रदान करता है। लुआ स्टैक पारंपरिक स्टैक से कुछ अलग है; स्टैक को सीधे अनुक्रमित किया जा सकता है, उदाहरण के लिए, नकारात्मक सूचकांक स्टैक के शीर्ष से ऑफ़सेट का संकेत देते हैं। उदाहरण के लिए, -1 सबसे ऊपर है (सबसे हाल ही में पुश किया गया मान), जबकि सकारात्मक सूचकांक नीचे से ऑफसेट (सबसे पुराना मान) इंगित करते हैं। स्टैक का उपयोग करके सी और लुआ कार्यों के बीच मार्शलिंग (कंप्यूटर विज्ञान) डेटा भी किया जाता है। लुआ फ़ंक्शन को कॉल करने के लिए, तर्कों को स्टैक पर धकेल दिया जाता है, और फिर  वास्तविक फ़ंक्शन को कॉल करने के लिए उपयोग किया जाता है। लुआ से सीधे बुलाए जाने वाले सी फ़ंक्शन को लिखते समय, स्टैक से तर्क पढ़े जाते हैं।

यहाँ C से Lua फ़ंक्शन को कॉल करने का एक उदाहरण दिया गया है: यह उदाहरण चलाने देता है: सी एपीआई लुआ स्टैक में विभिन्न छद्म-सूचकांकों पर स्थित कुछ विशेष टेबल भी प्रदान करता है। पर  लुआ 5.2 से पहले वैश्विक तालिका है,   लुआ के भीतर से, जो मुख्य नामस्थान है।   पर स्थित एक रजिस्ट्री भी है जहां C प्रोग्राम बाद में पुनर्प्राप्ति के लिए लुआ मान संग्रहीत कर सकते हैं।

मॉड्यूल

मानक पुस्तकालय (कोर) मॉड्यूल के अलावा लुआ एपीआई का उपयोग करके एक्सटेंशन लिखना संभव है। विस्तार मॉड्यूल साझा वस्तुएं हैं जिनका उपयोग लुआ लिपियों को मूल सुविधाएं प्रदान करके दुभाषिया की कार्यक्षमता बढ़ाने के लिए किया जा सकता है। लुआ स्क्रिप्ट  एक्सटेंशन मॉड्यूल का उपयोग करके लोड कर सकती हैं, ठीक उसी तरह जैसे लुआ में ही लिखे मॉड्यूल, या. जब सी लाइब्रेरी को  के माध्यम से लोड किया जाता है, तो लुआ फलन   की तलाश करेंगे और इसे कॉल करें, जो लुआ से कॉल करने योग्य किसी भी सी फ़ंक्शन के रूप में कार्य करता है और आम तौर पर विधियों से भरी तालिका देता है। सीपीएएन, रूबीजम्स और पायथन अंडे की भावना में लुआरॉक्स नामक पैकेज प्रबंधन प्रणाली के माध्यम से चट्टानों के रूप में जाने वाले मॉड्यूल का बढ़ता हुआ संग्रह उपलब्ध है। अन्य स्क्रिप्टिंग भाषाओं सहित अधिकांश लोकप्रिय प्रोग्रामिंग भाषाओं के लिए पूर्व लिखित लुआ भाषा बंधन मौजूद है। सी ++ के लिए, कई टेम्पलेट-आधारित दृष्टिकोण और कुछ स्वचालित बाध्यकारी जेनरेटर हैं।

अनुप्रयोग
वीडियो गेम के विकास में, वीडियो गेम प्रोग्रामर # स्क्रिप्टर द्वारा लुआ को व्यापक रूप से एक स्क्रिप्टिंग भाषा के रूप में उपयोग किया जाता है, मुख्य रूप से एम्बेड करने की कथित सहजता, तेजी से निष्पादन और लघु सीखने की अवस्था के कारण। लुआ का उपयोग करने वाले उल्लेखनीय खेलों में शामिल हैं रोबोक्स, गैरी का मॉड, वारक्राफ्ट की दुनिया, Payday 2, फैंटसी स्टार ऑनलाइन 2, Dota 2, एंग्री बर्ड्स स्पेस, क्राइसिस (वीडियो गेम), गंभीर प्रयास। कुछ गेम जो मूल रूप से लुआ प्रोग्रामिंग या स्क्रिप्टिंग का समर्थन नहीं करते हैं, इस कार्यक्षमता को मॉड्स द्वारा जोड़ा जाता है, जैसे कि कंप्यूटरक्राफ्ट Minecraft के लिए करता है। इसके अलावा, Lua का उपयोग गैर-वीडियो गेम सॉफ़्टवेयर में भी किया जाता है, जैसे कि Adobe Lightroom, Moho (सॉफ़्टवेयर), iClone, Aerospike (डेटाबेस) और FreeBSD और NetBSD में कुछ सिस्टम सॉफ़्टवेयर, और MediaWiki पर टेम्पलेट स्क्रिप्टिंग भाषा के रूप में उपयोग किया जाता है। स्क्रिबंटो एक्सटेंशन। 2003 में, GameDev.net द्वारा किए गए एक सर्वेक्षण से पता चला कि लुआ गेम प्रोग्रामिंग के लिए सबसे लोकप्रिय स्क्रिप्टिंग भाषा थी। 12 जनवरी 2012 को, लुआ को प्रोग्रामिंग टूल्स श्रेणी में पत्रिका गेम डेवलपर (पत्रिका) से फ्रंट लाइन अवॉर्ड 2011 के विजेता के रूप में घोषित किया गया था। बड़ी संख्या में गैर-गेम एप्लिकेशन भी एक्स्टेंसिबिलिटी के लिए लुआ का उपयोग करते हैं, जैसे कि लुआटेक्स, टीएक्स टाइप-सेटिंग भाषा का कार्यान्वयन, रेडिस, एक की-वैल्यू डेटाबेस, नव के, एक टेक्स्ट एडिटर, नगनेक्स, एक वेब सर्वर और वायरशार्क, एक नेटवर्क पैकेट विश्लेषक।

Scribunto एक्सटेंशन के माध्यम से, Lua MediaWiki सॉफ़्टवेयर में सर्वर-साइड स्क्रिप्टिंग भाषा के रूप में उपलब्ध है जो विकिपीडिया और अन्य विकी को शक्ति प्रदान करता है। इसके उपयोगों में विकिडेटा से लेखों में डेटा के एकीकरण की अनुमति देना शामिल है, और शक्ति देना.

लुआ
को संकलित करने वाली भाषाएं
 * मूनस्क्रिप्ट एक गतिशील प्रोग्रामिंग भाषा है, कॉफीस्क्रिप्ट से प्रेरित व्हॉट्सएप चरित्र-संवेदनशील स्क्रिप्टिंग भाषा है, जिसे लुआ में संकलित किया गया है। इसका मतलब है कि उपयोग करने के बजाय  तथा   (या   तथा  ) कोड के अनुभागों को परिसीमित करने के लिए यह लाइन ब्रेक (कंप्यूटिंग) और इंडेंटेशन शैली का उपयोग करता है।  मूनस्क्रिप्ट का एक उल्लेखनीय उपयोग एक वीडियो गेम वितरण वेबसाइट Itch.io है।
 * Haxe Lua लक्ष्य के संकलन का समर्थन करता है, Lua 5.1-5.3 के साथ-साथ LuaJIT 2.0 और 2.1 का समर्थन करता है।
 * फेनेल, एक लिस्प बोली जो लुआ को लक्षित करती है। * अर्न, एक लिस्प (प्रोग्रामिंग भाषा) बोली जो लुआ पर बनी है।
 * एमुलेट, एक एमएल (प्रोग्रामिंग भाषा) जैसी फंक्शनल प्रोग्रामिंग, जिसका कंपाइलर लुआ फाइलों को आउटपुट करता है।

बोलियां
इसके अलावा, लुआ उपयोगकर्ता समुदाय संदर्भ सी कार्यान्वयन के शीर्ष पर कुछ पावर पैच प्रदान करता है।
 * लुजिट
 * Roblox से Luau, धीरे-धीरे टाइपिंग और एर्गोनोमिक परिवर्धन के साथ Lua 5.1 भाषा।
 * वैकल्पिक स्थिर टाइपिंग के साथ रवि, JIT-सक्षम Lua 5.3 भाषा। जेआईटी प्रकार की जानकारी द्वारा निर्देशित है।
 * शाइन, लुआजिट का एक फोर्क जिसमें मॉड्यूल सिस्टम और मैक्रो सिस्टम समेत कई एक्सटेंशन हैं।

यह भी देखें

 * प्रोग्रामिंग भाषाओं की तुलना

अग्रिम पठन

 * (The 1st ed. is available online.)


 * Chapters 6 and 7 are dedicated to Lua, while others look at software in Brazil more broadly.
 * Interview with Roberto Ierusalimschy.
 * How the embeddability of Lua impacted its design.
 * Lua papers and theses
 * Chapters 6 and 7 are dedicated to Lua, while others look at software in Brazil more broadly.
 * Interview with Roberto Ierusalimschy.
 * How the embeddability of Lua impacted its design.
 * Lua papers and theses
 * Interview with Roberto Ierusalimschy.
 * How the embeddability of Lua impacted its design.
 * Lua papers and theses
 * How the embeddability of Lua impacted its design.
 * Lua papers and theses
 * Lua papers and theses

इस पेज में लापता आंतरिक लिंक की सूची

 * सीएलयू (प्रोग्रामिंग भाषा)
 * उच्च स्तरीय प्रोग्रामिंग भाषा
 * भाषा का अंकन
 * दुभाषिया (कंप्यूटिंग)
 * ट्रेड बैरियर
 * रियो डी जनेरियो के पोंटिफिकल कैथोलिक विश्वविद्यालय
 * संदर्भ द्वारा कॉल करें
 * साहचर्य सरणी
 * अनाम समारोह
 * वर्ग (कंप्यूटर प्रोग्रामिंग)
 * जानकारी छुपाना
 * प्रथम श्रेणी समारोह
 * नाम स्थान
 * कम से कम विशेषाधिकार का सिद्धांत
 * रूपांतरण टाइप करें
 * क्लोजर (कंप्यूटर साइंस)
 * गतिशील रूप से टाइप किया गया
 * coroutine
 * सरणी डेटा संरचना
 * हैश टेबल
 * शेयर करके कॉल करें
 * स्वयं (प्रोग्रामिंग भाषा)
 * फैक्टरी विधि पैटर्न
 * विधि (कंप्यूटर विज्ञान)
 * समय-समय पर संकलन
 * रन टाइम (कार्यक्रम जीवनचक्र चरण)
 * व्याख्या की गई भाषा
 * दैविक (सॉफ्टवेयर)
 * पायथन (प्रोग्रामिंग भाषा)
 * ढेर (डेटा संरचना)
 * अजगर के अंडे
 * वीडियो गेम विकास
 * एयरोस्पाइक (डेटाबेस)
 * मोहो (सॉफ्टवेयर)
 * nginx
 * लुआटेक्स
 * विकिडाटा
 * व्हाइटस्पेस चरित्र
 * क्रमिक टाइपिंग

बाहरी संबंध

 * Lua Users, Community
 * Lua Forum
 * LuaDist
 * Lua Rocks - Package manager
 * Projects in Lua
 * Projects in Lua