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

From Vigyanwiki

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

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

इतिहास

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

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

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

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

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

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

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

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

सुविधाएँ

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

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

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

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

सिंटेक्स

क्लासिक हैलो, वर्ल्ड! कार्यक्रम को इस प्रकार लिखा जा सकता है:[7]

print("Hello, World!")

या के रूप में

print 'Hello, World!'

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

function factorial(n)
  local x = 1
  for i = 2, n do
    x = x * i
  end
  return x
end

नियंत्रण प्रवाह

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

सामान्य if then end कथन के लिए तीनों खोजशब्दों की आवश्यकता होती है:

if condition then
	--statement body
end

else कीवर्ड को साथ स्टेटमेंट ब्लॉक के साथ निष्पादन को नियंत्रित करने के लिए जोड़ा जा सकता है, जब if स्थिति falseका मूल्यांकन करता है:

if condition then
	--statement body
else
	--statement body
end

कई स्थितियों के अनुसार elseif then का उपयोग करके निष्पादन को नियंत्रित किया जा सकता है, खोजशब्द:

if condition then
	--statement body
elseif condition then
	--statement body
else -- optional
	--optional default statement body
end

लुआ में चार प्रकार के कंडीशनल लूप होते हैं, while लूप, repeat लूप (लूप के समय do while के समान) लूप for न्यूमेरिक और लूप for के लिए जेनेरिक होता है।

--condition = true

while condition do
  --statements
end

repeat
  --statements
until condition

for i = first, last, delta do  --delta may be negative, allowing the for loop to count down or up
  --statements
  --example: print(i)
end

लूप for सामान्यतः

for key, value in pairs(_G) do
  print(key, value)
end

सूची पर पुनरावृति फलन pairs का उपयोग करके तालिका _G पर पुनरावृत्त होगा, जब तक कि यह nilन हो जाए। लूप को नेस्टेड (प्रोग्रामिंग) भी किया जा सकता है (दूसरे लूप के अंदर डालें)।

local grid = {
  { 11, 12, 13 },
  { 21, 22, 23 },
  { 31, 32, 33 }
}

for y, row in pairs(grid) do
  for x, value in pairs(row) do
    print(x, y, value)
  end
end

कार्य

प्रथम श्रेणी के फलन के रूप में लुआ के कार्यों का उपचार निम्न उदाहरण में दिखाए गए हैं, जहां प्रिंट फलन का व्यवहार संशोधित किया गया है:

do
  local oldprint = print
  -- Store current print function as oldprint
  function print(s)
    --[[ Redefine print function. The usual print function can still be used
      through oldprint. The new one has only one argument.]]
    oldprint(s == "foo" and "bar" or s)
  end
end

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

function addto(x)
  -- Return a new function that adds x to the argument
  return function(y)
    --[=[ When we refer to the variable x, which is outside the current
      scope and whose lifetime would be shorter than that of this anonymous
      function, Lua creates a closure.]=]
    return x + y
  end
end
fourplus = addto(4)
print(fourplus(3))  -- Prints 7

--This can also be achieved by calling the function in the following way:
print(addto(4)(3))
--[[ This is because we are calling the returned function from 'addto(4)' with the argument '3' directly.
  This also helps to reduce data cost and up performance if being called iteratively.
]]

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

सारिणी

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

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

{} कंस्ट्रक्टर सिंटैक्स का उपयोग करके तालिकाएँ बनाई जाती हैं।

a_table = {} -- Creates a new, empty table

तालिकाएँ हमेशा संदर्भ द्वारा पारित की जाती हैं (देखें साझा करके कॉल करें)। फलन सहित nil और NaN, को छोड़कर कुंजी (इंडेक्स) कोई भी मान हो सकता है।

a_table = {x = 10}  -- Creates a new table, with one entry mapping "x" to the number 10.
print(a_table["x"]) -- Prints the value associated with the string key, in this case 10.
b_table = a_table
b_table["x"] = 20   -- The value in the table has been changed to 20.
print(b_table["x"]) -- Prints 20.
print(a_table["x"]) -- Also prints 20, because a_table and b_table both refer to the same table.

कुंजी के रूप में स्ट्रिंग (कंप्यूटर विज्ञान) का उपयोग करके तालिका को अधिकांशतः वस्तु रचना (या रिकॉर्ड (कंप्यूटर विज्ञान)) के रूप में उपयोग किया जाता है। क्योंकि इस प्रकार का उपयोग बहुत आम है, लुआ ऐसे क्षेत्रों तक पहुँचने के लिए विशेष सिंटैक्स प्रस्तुत करता है।[8]

point = { x = 10, y = 20 }   -- Create new table
print(point["x"])            -- Prints 10
print(point.x)               -- Has exactly the same meaning as line above. The easier-to-read dot notation is just syntactic sugar.

संबंधित कार्यों को संग्रहीत करने के लिए तालिका का उपयोग करके, यह नामस्थान के रूप में कार्य कर सकता है।

Point = {}

Point.new = function(x, y)
  return {x = x, y = y}  --  return {["x"] = x, ["y"] = y}
end

Point.set_x = function(point, x)
  point.x = x  --  point["x"] = x;
end

सूचियाँ को स्वचालित रूप से संख्यात्मक कुंजी असाइन की जाती है, जिससे उन्हें सरणी डेटा प्रकार के रूप में उपयोग करने में सक्षम बनाया जाता है। पहला स्वचालित सूचकांक 0 के अतिरिक्त 1 है क्योंकि यह कई अन्य प्रोग्रामिंग भाषाओं के लिए है (चूंकि 0 के स्पष्ट सूचकांक की अनुमति है)। संख्यात्मक कुंजी 1 स्ट्रिंग कुंजी "1" से अलग है .

array = { "a", "b", "c", "d" }   -- Indices are assigned automatically.
print(array[2])                  -- Prints "b". Automatic indexing in Lua starts at 1.
print(#array)                    -- Prints 4.  # is the length operator for tables and strings.
array[0] = "z"                   -- Zero is a legal index.
print(#array)                    -- Still prints 4, as Lua arrays are 1-based.

तालिका t की लंबाई को किसी भी पूर्णांक सूचकांक n के रूप में परिभाषित किया गया है जैसे कि t[n] शून्य नहीं है और t[n+1] nil हैं; इसके अलावा, यदि t[1] nilहैं, तो n शून्य हो सकता है। नियमित सरणी के लिए, 1 से दिए गए n के गैर-शून्य मानों के साथ , इसकी लंबाई बिल्कुल वही n हैं, जो इसके अंतिम मान का सूचकांक हैं। यदि सरणी में छेद हैं (अर्थात, अन्य गैर-शून्य मानों के बीच शून्य मान), तो #t कोई भी सूचकांक हो सकता हैं, जो nil मान से पहले होता हैं (अर्थात, यह सरणी के अंत के रूप में ऐसे किसी भी शून्य मान पर विचार कर सकता है)।[9]

ExampleTable =
{
  {1, 2, 3, 4},
  {5, 6, 7, 8}
}
print(ExampleTable[1][3]) -- Prints "3"
print(ExampleTable[2][4]) -- Prints "8"

तालिका वस्तुओं की सरणी हो सकती है।

function Point(x, y)        -- "Point" object constructor
  return { x = x, y = y }   -- Creates and returns a new object (table)
end
array = { Point(10, 20), Point(30, 40), Point(50, 60) }   -- Creates array of points
                        -- array = { { x = 10, y = 20 }, { x = 30, y = 40 }, { x = 50, y = 60 } };
print(array[2].y)                                         -- Prints 40

किसी सरणी का अनुकरण करने के लिए हैश मैप का उपयोग करना सामान्य रूप से वास्तविक सरणी का उपयोग करने की तुलना में धीमा होता है; चूंकि, इस समस्या से बचने में सहायता करने के लिए लुआ तालिकाओं को सरणियों के रूप में उपयोग करने के लिए अनुकूलित किया गया है।[10]

मेटाटेबल्स

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

fibs = { 1, 1 }                                -- Initial values for fibs[1] and fibs[2].
setmetatable(fibs, {
  __index = function(values, n)                --[[__index is a function predefined by Lua, 
                                                   it is called if key "n" does not exist.]]
    values[n] = values[n - 1] + values[n - 2]  -- Calculate and memoize fibs[n].
    return values[n]
  end
})

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग

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

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

मूलभूत सदिश वस्तु बनाना:

local Vector = {}
local VectorMeta = { __index = Vector}

function Vector.new(x, y, z)    -- The constructor
  return setmetatable({x = x, y = y, z = z}, VectorMeta)
end

function Vector.magnitude(self)     -- Another method
  return math.sqrt(self.x^2 + self.y^2 + self.z^2)
end

local vec = Vector.new(0, 1, 0) -- Create a vector
print(vec.magnitude(vec))       -- Call a method (output: 1)
print(vec.x)                    -- Access a member variable (output: 0)

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

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

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

local Vector = {}
Vector.__index = Vector

function Vector:new(x, y, z)    -- The constructor
  -- Since the function definition uses a colon, 
  -- its first argument is "self" which refers
  -- to "Vector"
  return setmetatable({x = x, y = y, z = z}, self)
end

function Vector:magnitude()     -- Another method
  -- Reference the implicit object using self
  return math.sqrt(self.x^2 + self.y^2 + self.z^2)
end

local vec = Vector:new(0, 1, 0) -- Create a vector
print(vec:magnitude())          -- Call a method (output: 1)
print(vec.x)                    -- Access a member variable (output: 0)


वंशानुक्रम


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

local Vector = {}
Vector.__index = Vector

function Vector:new(x, y, z)    -- The constructor
  -- Here, self refers to whatever class's "new"
  -- method we call.  In a derived class, self will
  -- be the derived class; in the Vector class, self
  -- will be Vector
  return setmetatable({x = x, y = y, z = z}, self)
end

function Vector:magnitude()     -- Another method
  -- Reference the implicit object using self
  return math.sqrt(self.x^2 + self.y^2 + self.z^2)
end

-- Example of class inheritance
local VectorMult = {}
VectorMult.__index = VectorMult
setmetatable(VectorMult, Vector) -- Make VectorMult a child of Vector

function VectorMult:multiply(value) 
  self.x = self.x * value
  self.y = self.y * value
  self.z = self.z * value
  return self
end

local vec = VectorMult:new(0, 1, 0) -- Create a vector
print(vec:magnitude())          -- Call a method (output: 1)
print(vec.y)                    -- Access a member variable (output: 1)
vec:multiply(2)                 -- Multiply all components of vector by 2
print(vec.y)                    -- Access member again (output: 2)

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


कार्यान्वयन

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

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

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

function <factorial.lua:1,7> (9 instructions, 36 bytes at 0x8063c60)
1 param, 6 slots, 0 upvalues, 6 locals, 2 constants, 0 functions
	1	[2]	LOADK    	1 -1	; 1
	2	[3]	LOADK    	2 -2	; 2
	3	[3]	MOVE     	3 0
	4	[3]	LOADK    	4 -1	; 1
	5	[3]	FORPREP  	2 1	; to 7
	6	[4]	MUL      	1 1 5
	7	[3]	FORLOOP  	2 -2	; to 6
	8	[6]	RETURN   	1 2
	9	[7]	RETURN   	0 1

सी एपीआई (एप्लिकेशन प्रोग्रामिंग अंतरफलक)

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

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

यहाँ C से Lua फ़ंक्शन को कॉल करने का उदाहरण दिया गया है:

#include <stdio.h>
#include <lua.h> // Lua main library (lua_*)
#include <lauxlib.h> // Lua auxiliary library (luaL_*)

int main(void)
{
    // create a Lua state
    lua_State *L = luaL_newstate();

    // load and execute a string
    if (luaL_dostring(L, "function foo (x,y) return x+y end")) {
        lua_close(L);
        return -1;
    }

    // push value of global "foo" (the function defined above)
    // to the stack, followed by integers 5 and 3
    lua_getglobal(L, "foo");
    lua_pushinteger(L, 5);
    lua_pushinteger(L, 3);
    lua_call(L, 2, 1); // call a function with two arguments and one return value
    printf("Result: %d\n", lua_tointeger(L, -1)); // print integer value of item at stack top
    lua_pop(L, 1); // return stack to original state
    lua_close(L); // close Lua state
    return 0;
}

यह उदाहरण चलाने देता है:

$ cc -o example example.c -llua
$ ./example
Result: 8

सी एपीआई लुआ स्टैक में विभिन्न छद्म-सूचकांकों पर स्थित कुछ विशेष टेबल भी प्रदान करता है। पर LUA_GLOBALSINDEX लुआ 5.2 से पहले[17] वैश्विक तालिका है, _G लुआ के अन्दर से, जो मुख्य नामस्थान है। LUA_REGISTRYINDEX पर स्थित रजिस्ट्री भी है जहां C प्रोग्राम बाद में पुनर्प्राप्ति के लिए लुआ मान संग्रहीत कर सकते हैं।

मॉड्यूल


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

अनुप्रयोग

वीडियो गेम के विकास में, वीडियो गेम प्रोग्रामर # स्क्रिप्टर द्वारा लुआ को व्यापक रूप से एक स्क्रिप्टिंग भाषा के रूप में उपयोग किया जाता है, मुख्य रूप से एम्बेड करने की कथित सहजता, तेजी से निष्पादन और लघु सीखने की अवस्था के कारण।[21] लुआ का उपयोग करने वाले उल्लेखनीय खेलों में शामिल हैं रोबोक्स,[22] गैरी का मॉड, वारक्राफ्ट की दुनिया, पे डे 2, फैंटसी स्टार ऑनलाइन 2, डोटा 2, एंग्री बर्ड्स स्पेस,[23] क्राइसिस (वीडियो गेम),[24] गंभीर प्रयास। कुछ गेम जो मूल रूप से लुआ प्रोग्रामिंग या स्क्रिप्टिंग का समर्थन नहीं करते हैं, इस कार्यक्षमता को मॉड्स द्वारा जोड़ा जाता है, जैसे कि कंप्यूटरक्राफ्ट माइनक्राफ्ट के लिए करता है। इसके अलावा, Lua का उपयोग गैर-वीडियो गेम सॉफ़्टवेयर में भी किया जाता है, जैसे कि एडोब लाइटरूम, Moho (सॉफ़्टवेयर), आईक्लोन, एयरोस्पाइक (डेटाबेस) और फ्रीबीएसडी और नेटबीएसडी में कुछ सिस्टम सॉफ़्टवेयर, और मीडियाविकि पर टेम्पलेट स्क्रिप्टिंग भाषा के रूप में उपयोग किया जाता है। स्क्रिबंटो एक्सटेंशन।[25] 2003 में, GameDev.net द्वारा किए गए एक सर्वेक्षण से पता चला कि लुआ गेम प्रोग्रामिंग के लिए सबसे लोकप्रिय स्क्रिप्टिंग भाषा थी।[26] 12 जनवरी 2012 को, लुआ को प्रोग्रामिंग टूल्स श्रेणी में पत्रिका गेम डेवलपर (पत्रिका) से फ्रंट लाइन अवॉर्ड 2011 के विजेता के रूप में घोषित किया गया था।[27] बड़ी संख्या में गैर-गेम एप्लिकेशन भी एक्स्टेंसिबिलिटी के लिए लुआ का उपयोग करते हैं, जैसे कि लुआटेक्स, टीएक्स टाइप-सेटिंग भाषा का कार्यान्वयन, रेडिस, एक की-वैल्यू डेटाबेस, नव के, एक टेक्स्ट एडिटर, नगनेक्स, एक वेब सर्वर और वायरशार्क , एक नेटवर्क पैकेट विश्लेषक।

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

व्युत्पन्न भाषाएँ


बोलियां

  • लुजिट
  • रोबोक्स से Luau, धीरे-धीरे टाइपिंग और एर्गोनोमिक परिवर्धन के साथ Lua 5.1 भाषा।[35]
  • वैकल्पिक स्थिर टाइपिंग के साथ रवि, JIT-सक्षम Lua 5.3 भाषा। जेआईटी प्रकार की जानकारी द्वारा निर्देशित है।[36]
  • शाइन, लुआजिट का एक फोर्क जिसमें मॉड्यूल सिस्टम और मैक्रो सिस्टम समेत कई एक्सटेंशन हैं।[37]

इसके अलावा, लुआ उपयोगकर्ता समुदाय संदर्भ सी कार्यान्वयन के शीर्ष पर कुछ पावर पैच प्रदान करता है।[38]


यह भी देखें

संदर्भ

  1. 1.0 1.1 Ierusalimschy, Roberto; de Figueiredo, Luiz Henrique; Filho, Waldemar Celes (June 1996). "लुआ-एक एक्स्टेंसिबल एक्सटेंशन लैंग्वेज". Software: Practice and Experience. 26 (6): 635–652. doi:10.1002/(SICI)1097-024X(199606)26:6<635::AID-SPE26>3.0.CO;2-P. Retrieved 24 October 2015.
  2. 2.0 2.1 2.2 "लुआ के बारे में". Lua.org. Retrieved 2011-08-11.
  3. Yuri Takhteyev (21 April 2013). "ब्राजील से विकिपीडिया तक". Foreign Affairs. Retrieved 25 April 2013.
  4. 4.0 4.1 4.2 4.3 Ierusalimschy, R.; Figueiredo, L. H.; Celes, W. (2007). "The evolution of Lua" (PDF). प्रक्रिया। एसीएम एचओपीएल III का. pp. 2–1–2–26. doi:10.1145/1238844.1238846. ISBN 978-1-59593-766-7. S2CID 475143.[dead link]
  5. "एक विस्तार भाषा का विकास: लुआ का इतिहास". 2001. Retrieved 2008-12-18.
  6. Figueiredo, L. H.; Ierusalimschy, R.; Celes, W. (December 1996). "लुआ: एक एक्स्टेंसिबल एंबेडेड लैंग्वेज। कुछ मेटामैकेनिज्म कई सुविधाओं को बदल देते हैं". Dr. Dobb's Journal. Vol. 21, no. 12. pp. 26–33.
  7. "लुआ में प्रोग्रामिंग : 1".
  8. "लुआ 5.1 संदर्भ मैनुअल". 2014. Retrieved 2014-02-27.
  9. "लुआ 5.1 संदर्भ मैनुअल". 2012. Retrieved 2012-10-16.
  10. "लुआ 5.1 स्रोत कोड". 2006. Retrieved 2011-03-24.</रेफरी>
  11. "लुआ में प्रोग्रामिंग: 16.3". www.lua.org. Retrieved 2021-09-16.
  12. "लुआ-उपयोगकर्ता विकी: मेटामेथोड्स ट्यूटोरियल". lua-users.org. Retrieved 2021-09-16.
  13. Ierusalimschy, R.; Figueiredo, L. H.; Celes, W. (2005). "लुआ 5.0 का कार्यान्वयन". J. Of Universal Comp. Sci. 11 (7): 1159–1176.
  14. Texas Instruments (1990). पीसी योजना: उपयोगकर्ता गाइड और भाषा संदर्भ मैनुअल, व्यापार संस्करण. ISBN 0-262-70040-9.
  15. Kein-Hong Man (2006). "लुआ 5.1 वीएम निर्देशों का नो-फ्रिल्स परिचय" (PDF).
  16. 16.0 16.1 "लुआ 5.2 संदर्भ मैनुअल". Lua.org. Retrieved 2012-10-23.
  17. "एपीआई में बदलाव". Lua 5.2 Reference Manual. Lua.org. Retrieved 2014-05-09.
  18. "लुआ 5.4 संदर्भ मैनुअल". www.lua.org. Retrieved 2022-06-01.
  19. "लुआ रॉक्स". लुआ रॉक्स wiki. Retrieved 2009-05-24.
  20. "लुआ के लिए बाध्यकारी कोड". Lua-users wiki. Retrieved 2009-05-24.
  21. "लुआ को गेम लैंग्वेज क्यों माना जाता है?". Archived from the original on 20 August 2013. Retrieved 2017-04-22.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  22. "लुआउ क्यों?". Luau (in English). Retrieved 2022-03-23.
  23. "टीआईएल एंग्री बर्ड्स को लुआ - पोस्ट - इम्गुर में कोडित किया गया था". Retrieved 23 March 2022.
  24. "क्राइसिस सर्वर-साइड मोडिंग का परिचय". Retrieved 23 March 2022.
  25. "लुआ कार्य करता है". wow.gamepedia.com (in English). Retrieved 2021-03-01.
  26. "मतदान के परिणाम". Archived from the original on 7 December 2003. Retrieved 2017-04-22.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  27. "फ्रंट लाइन पुरस्कार विजेताओं की घोषणा की". Archived from the original on 15 June 2013. Retrieved 2017-04-22.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  28. "एक्सटेंशन: स्क्रिप्ट - मीडियाविकि". MediaWiki.org. Retrieved 21 February 2019.
  29. "विकिडाटा:इन्फोबॉक्स ट्यूटोरियल - विकिडाटा". www.wikidata.org. Retrieved 2018-12-21.
  30. "भाषा गाइड - मूनस्क्रिप्ट 0.5.0". moonscript.org. Retrieved 2020-09-25.
  31. leaf (2020-09-23), leafo/moonscript, retrieved 2020-09-25
  32. 32.0 32.1 Andre Alves Garzia. "लुआ को संकलित करने वाली भाषाएँ". AndreGarzia.com. Retrieved 25 September 2020.
  33. "अर्न: लुआ | के लिए एक लिस्प कार्यान्वयन अर्न". urn-lang.com. Retrieved 2021-01-12.
  34. "एमुलेट एमएल". amulet.works (in English). Retrieved 2021-01-12.
  35. "जाल". Roblox.GitHub.io (in English).
  36. "रवि प्रोग्रामिंग लैंग्वेज". GitHub.
  37. Hundt, Richard (2021-04-22). "रिचर्डहंट/शाइन". GitHub.
  38. "लुआ पावर पैच". lua-users.org.


अग्रिम पठन








बाहरी संबंध