Lua एक कम आंकी गई भाषा है
(nflatrea.bearblog.dev)- Lua की design और implementation के बारे में जितना ज़्यादा सीखते हैं, उतना ही प्रभावित होते हैं। कम code में बहुत कुछ करने वाला software बहुत कम मिलता है
- लेकिन Lua को दूसरी भाषाओं जितनी marketing और attention नहीं मिली। इसी वजह से कम developers इसके features और फायदों के बारे में जानते हैं
- इसे ज़्यादातर game और embedded systems में इस्तेमाल होने वाली एक niche language के रूप में देखा जाता है
[Lua की विशेषताएँ और फायदे]
समझने में आसान भाषा
- Lua एक free, reflective, imperative scripting language है। इसे 1993 में बनाया गया था, और इसे इस तरह design किया गया था कि इसे दूसरी applications में embed करके उन्हें extend किया जा सके।
- इसका design साफ-सुथरा है और code तेज़ चलता है। इसका C API इस्तेमाल करने में आसान है और performance भी अच्छी है।
- इसका syntax संक्षिप्त और minimalist है, इसलिए beginners के लिए भी इसे अपनाना आसान है।
बेहतरीन embedding क्षमता
- Lua को इस तरह design किया गया है कि इसे दूसरी भाषाओं, खासकर C और C++ में लिखी गई applications में आसानी से embed किया जा सके।
- game और embedded applications में scripting और extension के लिए यह एक बेहतरीन विकल्प है।
- उदाहरण: C program में Lua को embed करना
#include <lua.h> #include <lauxlib.h> #include <lualib.h> int main() { lua_State *L = luaL_newstate(); luaL_openlibs(L); luaL_dofile(L, "./myscript.lua"); lua_close(L); return 0; }
कई programming paradigms का समर्थन
- Lua अकेले या उपयुक्त libraries के साथ imperative, functional, और object-oriented programming को support करता है।
- यह users को अपनी ज़रूरत के हिसाब से programming style चुनने की flexibility देता है
[Lua की संभावित कमियाँ]
indexing convention
- Lua में indexing आम तौर पर 1 से शुरू होती है, लेकिन यह सिर्फ convention है। arrays को 0, negative, या किसी और value से भी index किया जा सकता है।
- Lua में वास्तव में arrays नहीं होते; इसमें सिर्फ tables होती हैं, जो हमेशा key-value hash होती हैं, इसलिए 0 या negative जैसी अलग-अलग values से indexing संभव है
- standard library और built-in functions यह मानकर चलती हैं कि array-जैसी tables में index 1 से शुरू होता है।
error handling
- Lua का error handling दूसरी भाषाओं से आने वाले developers को intuitive नहीं लग सकता।
- Lua में errors को value की तरह handle किया जा सकता है।
pcallका इस्तेमाल करके errors को पकड़ा जा सकता है।function risky_function() error("Something went wrong!") end local status, err = pcall(risky_function) if not status then print("Error: " .. err) end
Nil पर समाप्त होने वाले arrays
- Lua के arrays (यानी arrays की तरह इस्तेमाल होने वाली tables) nil value मिलते ही समाप्त माने जाते हैं, जिससे अप्रत्याशित व्यवहार हो सकता है
local arr = {10, 20, 30, nil, 50} for i, v in ipairs(arr) do print(v) -- 출력: 10, 20, 30 (nil에서 중단) end ipairsfunction nil value मिलते ही iteration रोक देता है- अगर array में खाली जगहें हों, तो
ipairsकी जगहpairsका इस्तेमाल करना बेहतर है। इससे nil values सहित सभी items को देखा जा सकता है
[सारांश]
- Lua एक शक्तिशाली, efficient, और versatile programming language है, जिसे कहीं ज़्यादा पहचान मिलनी चाहिए।
- इसकी simplicity, embedding क्षमता, और performance की वजह से यह game और embedded systems जैसी कई तरह की applications के लिए उपयुक्त है।
- कम आंकी जाने के बावजूद, simplicity और performance की वजह से इसे आज़माना चाहिए
- यह nvim के plugin system में इस्तेमाल होती है और efficient है।
7 टिप्पणियां
> Lua में वास्तव में array नहीं होते, और केवल table होते हैं जो हमेशा key-value hash होते हैं, इसलिए उन्हें 0 या negative जैसे अलग-अलग मानों से index किया जा सकता है
मैंने WoW addon की वजह से थोड़ी देर के लिए Lua इस्तेमाल किया था, और यही बात मुझे सबसे ज़्यादा प्रभावशाली लगी थी। लगभग हर data structure के लिए वे हमेशा table का ही इस्तेमाल करते थे।
मुझे बस lua का नाम ही पता था, लेकिन यह लेख देखकर लगा कि यह उतना अच्छा नहीं है lol...
मुझे ज़्यादा पता नहीं, लेकिन मैंने सुना है कि versions के बीच backward compatibility बहुत खराब है..
मेरी निजी राय में, Ruby.. की तुलना में 'क्या पुराने कोड अभी भी वैसे ही चल जाते हैं??' इस सवाल पर यह थोड़ा बेहतर है, लेकिन खासकर 5.3 में पुराने वर्ज़न की तुलना में
numberको हैंडल करने का तरीका बदल गया, इसलिए 5.1 से 5.3 पर अपग्रेड करने पर अंदरूनी तौर पर ट्रैक करना मुश्किल ऐसे ढेर सारे बग पैदा हो जाते हैं...और LuaJIT इस्तेमाल करने वाली जगहें भी बहुत हैं, और उसका इंटरफ़ेस भी फिर थोड़ा अलग है, इसलिए उन सूक्ष्म फ़र्कों से पैदा होने वाली समस्याएँ सबसे गंभीर लगती हैं। अंदरूनी व्यवहार बदल चुके हिस्से भी काफ़ी हैं, इसलिए कुछ खास किया भी नहीं जा सकता.. =m =.
मुझे Lua में SmartThings के edge driver लिखने का अनुभव है.
कुल मिलाकर इस्तेमाल करने लायक तो था, लेकिन यह मेरी पसंद की language नहीं थी.
मेरे हिसाब से development environment या DE भी language का हिस्सा होते हैं,
और सबसे पहले, community थोड़ी बंटी हुई सी लगती है.
language server भी कई तरह के हैं, लेकिन हर एक में कोई न कोई feature गायब है, या code indexing धीमी है, और अगर कोई बदलाव हो जाए तो वह फिर से शुरुआत से index करना शुरू कर देता है.
1-base indexing या comments में type hint लिखना भी खास पसंद नहीं आया,
और type hints का भी कोई standard नहीं लगा; language server के हिसाब से अलग-अलग थे.
coroutine भी पुराने Python वाली चीज़ की याद दिलाते हैं...
embedding या FFI निश्चित रूप से काफ़ी आसान लगते हैं.
आजकल sumneko ने बनाया हुआ Lua language server कमाल का है 'm'... (शायद 22 या 23 में बनाया था) इसका indexing काफ़ी समझदारी से किया गया है।
मुझे लगता है कि Lua की ख़ूबी (और कमी भी) असल में तब सामने आती है जब आप अजीब चीज़ें करना चाहते हैं। किसी दूसरे object के method को हद से ज़्यादा आसानी से overwrite किया जा सकता है, और इसी वजह से यह बिना ज़्यादा बंधन के, जो दिमाग़ में आए वैसा लिखने के लिए बहुत अच्छा language लगता है।
Type hinting के लिए... जैसा आपने कहा, solutions तो सच में बहुत हैं, लेकिन ठीक से स्थापित हुआ कोई solution लगभग नहीं है, इसलिए मुझे Roblox टीम के बनाए luau से उम्मीद है..
Hacker News राय
Lua को embed करना अच्छा है, लेकिन Redis में इसे scripting language के रूप में चुनने पर काफी पछतावा हुआ। भाषा खुद पसंद नहीं आई। abstraction level पर जो उम्मीद होती है, उसकी तुलना में इसमें काफी friction लगता है। छोटे-छोटे design decisions मिलकर भाषा को कुछ हद तक hostile बना देते हैं। फिर भी इसकी speed, आसान integration, कम memory usage और reliability की वजह से यह अभी भी चुनने लायक है। C-API level पर भी stack access approach की वजह से यही hostility महसूस होती है। FORTH जैसी stack language का अनुभव होने के बावजूद bindings लिखते समय अब भी mental gymnastics करनी पड़ती थी.
अगर आपको Lua पसंद है, तो Terra को देखने की सलाह दूँगा। Terra, Lua में embedded और metaprogrammed होने वाली एक low-level systems programming language है। यह C/C++ की तरह statically typed, compiled language है और manual memory management की सुविधा देती है। लेकिन C/C++ से अलग, इसे शुरुआत से ही Lua के जरिए metaprogramming के लिए design किया गया था। Terra programs वही LLVM backend इस्तेमाल करते हैं जो Apple के C compiler में इस्तेमाल होता है। इसका मतलब है कि Terra code, समान C code जैसी performance दे सकता है.
मैंने हाल ही में Lua को एक custom game engine के साथ integrate किया, और यह बात पूरी तरह समझी कि दूसरी भाषाओं के साथ इसका integration कितना साफ-सुथरा है। इसका interface इतना clean है कि automatically bindings generate करना आसान होता है। मैंने Roslyn Incremental Source Generators का उपयोग करके C# और Lua के बीच bindings अपने-आप generate किए, और interface design की वजह से यह बिल्कुल मुश्किल नहीं था। Lua stack, dynamic typing और "tables" की वजह से C# और Lua के बीच arbitrary data classes के लिए marshaller generate करना भी आसान था। लेकिन भाषा खुद पर की गई आलोचनाएँ भी काफी वैध हैं। खासकर मुझे 1-based indexing पसंद नहीं है। इन समस्याओं को हल करते हुए, मिलते-जुलते interface वाली एक embedded scripting language design करने पर विचार कर रहा हूँ.
Lua के लिए मेरे मन में कोई अतिरिक्त लगाव पैदा नहीं हुआ। उल्टा मेरी नाराज़गी और मजबूत हुई। Lua लिखे हुए काफी समय हो गया है, लेकिन तब भी यह intuitive नहीं लगी थी। arrays tables क्यों हैं, वे nil पर क्यों खत्म होती हैं, और 1 से क्यों शुरू होती हैं, यह समझ नहीं आता। मुझे नहीं लगता कि Lua को कम आंका गया है। यह script लिखने के लिए (पुराने) game engines में बहुत लोकप्रिय है.
मैंने Lua plugin commands से एक chatbot बनाया था, लेकिन इसे C++ program में integrate करना बेहद खराब अनुभव रहा। लोग क्यों कहते हैं कि इसे embed करना आसान है, यह समझ नहीं आता। बहुत ज्यादा stack manipulation करनी पड़ती है। भाषा खुद झंझटभरी है और गलती होने पर कोई मदद नहीं करती। मैं फिर कभी Lua का इस्तेमाल नहीं करूँगा, और Lua इस्तेमाल करने वाले projects से बचूँगा.
Lua में weak typing, type hints की कमी और error handling के अभाव की वजह से अच्छी-खासी मात्रा में code लिखना मुश्किल है। यह कम आंका गया नहीं है। समय के साथ मुझे static type languages और type hints (Python, TypeScript) ज्यादा पसंद आने लगे हैं। community में hints के बिना Python या JS code लिखना नुकसानदेह है। हाल ही में मैंने 1.5k cloc JS को TypeScript में फिर से लिखा। उसमें हमेशा दर्जनों missing null, null property access, या semantically suspicious null मिले.
मेरा मानना है कि जिन applications को scripting की ज़रूरत होती है, उनमें ज़्यादातर को JavaScript embed करना चाहिए। मौजूदा ecosystem से बड़ा फायदा मिलता है। लोगों को यह हमेशा पसंद नहीं आता, लेकिन लाखों लोग इसे पहले से जानते हैं। उन्हें array indexing, nil termination जैसी अजीब बातों और Lua की उन दर्जनों दूसरी चीज़ों को फिर से नहीं सीखना पड़ता जो runtime पर पता चलती हैं। हर आकार के JS engines मौजूद हैं, और ज़्यादातर operating systems बिना installation के उपलब्ध high-quality engine और embedding frameworks देते हैं। users को नई भाषा सिखाने के बजाय standard language इस्तेमाल करना बेहतर है। इससे user और खुद आपका, दोनों का समय बच सकता है.
मुझे Lua के साथ काम करना पसंद आया और यह मुझे बहुत अच्छी language लगती है। खासकर C/C++ में embed करने के लिए इसका interface साफ और flexible है। performance issues हैं, लेकिन high-performance video games में game logic के लिए Lua के व्यापक उपयोग को देखते हुए ये समस्याएँ हल की जा सकती हैं। हालांकि, कुछ दूसरी समस्याएँ भी हैं जो चीज़ों को confusing बनाती हैं और भाषा को कठिन करती हैं। Lua और C interface सीखना, Lua सीखने जितना ही बड़ा काम है, इसलिए deployments के बीच switch करना दूसरी भाषाओं की तुलना में ज्यादा confusing होता है। इसके बावजूद, मुझे लगता है कि इस भाषा को कम आंका गया है.
Lua को embed करना मज़ेदार था, लेकिन wasm की तरह, ऐसा बहुत कम हुआ कि पूरे binary को फिर से compile किए बिना नया code चलाने की ज़रूरत पड़े। सबसे मज़ेदार अनुभव C++ में game engine बनाना और सारे game logic के लिए Lua इस्तेमाल करना था। तेज debug cycle बहुत काम आई। दूसरा सबसे मज़ेदार काम एक IRC bot बनाना था, जिसमें Lua logic को reload किया जा सकता था। तीसरा सबसे मज़ेदार काम Lua को Turing-complete configuration language की तरह इस्तेमाल करना था। जब array की ज़रूरत पड़ी, तो मैंने Lua में array बना ली। सबसे कम मज़ेदार काम वह Blender plugin था जो 3D models को generated Lua में export करता था.
मुझे लगता है Lua को ज़रूरत से ज़्यादा सराहा गया है, क्योंकि game industry में इसका बहुत इस्तेमाल होता है। Lua का एकमात्र फायदा यह है कि इसे C++ में आसानी से embed किया जा सकता है। इसके अलावा बाकी सब एक nightmare है.