- Lua hafif, gömülebilir ve çok paradigmalıdır: tablolar, fonksiyonlar ve coroutine'ler her şeyi birbirine bağlar.
- Dinamik tipleme, require'li modüller, metatablolu ve coroutine'li OOP ile işbirlikçi akış.
- Lua mantığını yerel uygulamalara entegre etmek için temiz C API; oyun ve IoT için ideal.
- Geniş gerçek kullanım: motorlar, modlar, DAW'lar ve ESP8266/NodeMCU gibi mikrodenetleyiciler.

Lua, dengesiyle şaşırtan dillerden biridir : küçük, hızlı ve uygulamalara gömülmek üzere tasarlanmış olmasına rağmen, birden fazla programlama stilini kapsayacak kadar ifade gücüne sahiptir. Tam olarak ne olduğunu, ne için kullanıldığını ve neden bu kadar çok aracın onu tercih ettiğini merak ediyorsanız, işte pratik ve iyi belgelenmiş bir rehber.
Ayrıntılara girmeden önce, iki önemli noktayı açıklığa kavuşturmakta fayda var: Lua, 1993 yılında Brezilya'da (PUC-Rio, TeCGraf grubu) hafif ve genişletilebilir olma hedefiyle oluşturuldu ve 5.0 sürümünden beri MIT lisansı altında dağıtılıyor (önceden BSD benzeri bir lisans). Çalıştırılması doğrudan kaynak metni yorumlamaz: bayt koduna derler ve kendi sanal makinesinde çalıştırır; ayrıca, çalışma zamanı derlemesi için LuaJIT mevcuttur.
Lua nedir ve nereden geliyor?
Lua, Portekizce'de "ay" anlamına gelir ve Roberto Ierusalimschy, Luiz Henrique de Figueiredo ve Waldemar Celes tarafından oluşturulmuştur. Başlangıçtan itibaren odak noktası çok netti: C'den ilham alan basit bir sözdizimine ve Perl'e benzer genişletilebilirliğe sahip , gömülebilir, taşınabilir ve minimalist bir dil olmak . Yıllar içinde, video oyunları, eklentiler ve gömülü sistemler için bir betik motoru olarak kendini kanıtlamıştır.
Başlangıcından itibaren taşınabilirlik temel bir odak noktası olmuştur : ISO C ile uygulanan bu yazılım, büyük sunuculardan yalnızca birkaç yüz kilobayt belleğe sahip mikrodenetleyicilere kadar neredeyse her yerde çalışır. İlk sürümler BSD tarzı bir lisans altında lisanslanmışken, Lua 5.0'dan beri tamamen GPL uyumlu olan MIT lisansını kullanmaktadır .
Felsefe ve tasarım: Hafif, gömülü ve çok paradigmalı
Lua, "az sayıda ama çok güçlü parça"ya öncelik verir. Kavramsal çerçevesi üç temel üzerine kuruludur : tek veri yapısı olarak tablolar , birinci sınıf vatandaş olarak fonksiyonlar ve işbirlikçi akış kontrolü için eş zamanlı işlemler (coroutines ). Bu temellerle kullanıcılar özel modüller, nesneler, ortamlar ve soyutlamalar oluşturabilirler .
Genellikle prosedürel olarak tanımlanır, ancak doğal olarak fonksiyonel stilleri (kapanışlar, üst düzey komutlar), nesne yönelimli yaklaşımları (meta tablolar ve prototipler aracılığıyla) ve veri odaklı bir yaklaşımı benimser . Minimalist yapısı katılık anlamına gelmez: dil, meta tablolar aracılığıyla davranışları yeniden tanımlayarak genişler ve uyum sağlar.
Temel sözdizimi ve yürütme
Lua'da değişkenlerin statik tipleri yoktur ; değerlerine atanan tipler verilir. Sekiz temel tip sunar : nil , boolean , number , string , table , function , userdata ve thread (eş zamanlı işlemler). Ayrıca, çalışma zamanında sayılar ve dizeler arasında kontrollü tür dönüştürmeyi destekler .
Dil şu şekilde düzenlenmiştir: parçaları (Derleyicinin anonim fonksiyonlara dönüştürdüğü kod parçaları) bu yardımcı olur durumu kapsüllemek artık kazara "sihirli küresel değişkenler" olmadan çalışacaktır. Yorumlar ile işaretlenmiştir -- ve uzun tırnak işaretleri veya köşeli parantezleri olan dize sabitlerini destekler; operatörler aritmetik, ilişkisel, kısa devre mantığını içerir (and, or, not), birleştirme (..) ve uzunluk (#).
Akış kontrolü ile ilgili olarak, bulduk if/elseif/else, while, repeat until (vücut en az bir kez garantilidir) ve iki çeşidi for: sayısal (başlangıç, son ve adımla) ve genel (yineleyiciler gibi pairs o ipairs). yerel ifadeler sözcüksel kapsamı sınırlamak ve dönüş birden fazla değere izin verir.
Veri türleri ve zorlama
Lua , yapısı gereği dinamik olarak tiplendirilmiştir . Otomatik dönüşümler öncelikle aritmetik işlemlerde veya metin bağlamlarında dize ve sayı arasında gerçekleşir. Koşullu ifadeler yalnızca false ve nil değerlerini yanlış olarak kabul eder ; geri kalan her şey doğrudur (0 ve boş dize dahil).
Temel veri türleri arasında tablo (sözlükler/ilişkisel diziler), fonksiyon (birinci sınıf değerler), kullanıcı verisi (C bellek blokları) ve iş parçacığı (eş zamanlı işlemler) bulunur. Tablolar heterojendir , nil hariç her türlü anahtar türünü kabul eder ve listeler, kayıtlar, ağaçlar ve seyrek diziler gibi karmaşık yapıların temelini oluşturur.
Tablolar ve metatablolar: dilin kalbi
Tablo tek veri yapısıdır ve her şey için kullanılır: basit bir diziden ({10,20,30}) kataloglara, nesnelere, modüllere ve ortamlara erişim. t y t.x Anahtar bir isim olduğunda eşdeğerdir. Parantezli oluşturucular, çok kompakt ifadeler başlatmanın.
ile metatablolar se davranışları yeniden tanımlamak operatörler ve erişimler: __add, __eq, __lt, __concat, __len, __index, __newindex, __call, vb. Bu, şunları sağlar: aşırı yük ekleme, karşılaştırma, birleştirme veya eksik bir alana erişime nasıl yanıt verileceği gibi birçok özellik içerir. Böylece, karmaşık sayı sınıfları, proxy'ler, doğrulayıcılar veya sarmalayıcılar sadece birkaç satırla.
Modüller ve ortamlar
İşlevi require bir modülü yükler (yürütüldüğünde bir parça), normalde bir tablo döndürür (fonksiyonlar ve sabitlerle) Lua, dahili olarak kodu bir fonksiyona derler ve kendi içinde yürütür. çevre, sonucunu yeniden kullanılmak üzere döndürür. Küresel değişkenler bir tabloda "canlıdır" ve şu şekilde erişilebilir: _G ve daha modern versiyonlarda, fonksiyonun görünür ortamı aracılığıyla (_ÇEVRE).
Bu mimari, ikili dosya boyutunu küçük tutar : her şeyi yüklemek yerine, her modül yalnızca gerekli olanı sunar ve geliştirici neleri dahil edeceğine karar verir. Sözcük görünürlüğü ve ortam ayrımı, kod parçaları arasındaki yan etkileri en aza indirir.
Fonksiyonlar, kapanışlar ve parçalar
Lua'da bir fonksiyon bir değerdir : değişkenlere atanır, argüman olarak geçirilir ve sonuç olarak döndürülür. Katı bir argüman sayısı sınırlaması yoktur: fazladan argümanlar göz ardı edilir ; eksik argümanlar nil ile doldurulur . Hatta kod blokları bile anonim fonksiyonlar olarak ele alınır, bu da yerel durumu küresel ortamı kirletmeden kapsüllemeyi kolaylaştırır .
Sözdizimsel şeker olarak operatör : (iki nokta üst üste) "yöntemleri" tanımlamanıza ve çağırmanıza olanak tanır self dolaylı olarak: obj:metodo(x) eşittir obj.metodo(obj, x). Kapanışlar Bunlar, yineleyiciler, fabrikalar ve temiz API'ler oluşturmak için çok güçlü bir temel olan yukarı değerleri yakalar.
Nesne yönelimli "Lua yolu"
Her ne kadar böyle bir sınıfı olmasa da, Lua, tablolar ve metatablolar kullanarak OOP'yi uygularEn yaygın desen kullanımları __index Bir prototipe yetki devretmek için: Nesneler durumlarını depolar ve yöntemlerini "şablonda" (prototip tablosu) arar. Bir oluşturucu, metatabloyu kolayca atayabilir ve yeni örnekler döndürebilir.
Birleştirme yapıcılar, __index ve şeker:, pragmatik bir OOP elde edilir: yöntemler self, sözde kalıtım (zincirlenmiş prototipler), üzerine yazma olasılığı ve esnek kompozisyonEklentiler, oyunlar veya yapılandırma betikleri için basit ve oldukça etkili bir yaklaşımdır.
Coroutines: işbirlikçi çoklu görev
W eşyordamlar Çok ince akış kontrolü sağlarlar: bunlar yield y resume belirli noktalarda pillerini koruyarak çalışırlar. işbirlikçi çoklu iş parçacığı, oyun mantığı, reaktif sistemler, basit planlayıcılar veya tembel yineleyicilerAyrıca, Lua ile ana bilgisayar kodu (örneğin C/C++) arasında zarif geçişlere izin verirler.
Pratik anlamda, bir eş zamanlı işlem (coroutine) sonlanana kadar çalışır , yeniden başlatan kişiye değerler döndürür ve ardından kaldığı yerden devam eder. Etkileşimli görevler, durum bilgisi içeren yapay zeka veya simülasyonlar için düşük maliyeti ve netliği nedeniyle çok değerli bir araçtır.
Standart Kitaplıklar ve Yardımcı Programlar
Lua, kompakt ancak çok kullanışlı bir standart kütüphane setiyle birlikte gelir: basic (assert, type, pairs, require…), string (patterns, gsub, gmatch, format), table (insert, remove, sort, concat), math (trigonometry, exponentials, random), io (files), os (dates, environment, processes) ve debug (hooks, traces, inspection). Bunlar, gerçek dünya ihtiyaçlarının %80'ini minimum ayak iziyle karşılamak üzere tasarlanmıştır.
Sistem dize desenleri tam düzenli ifadelere başvurmadan güçlü arama, yakalama ve değiştirme olanağı sunar; şu gibi özelliklerle gmatch o gsub Metin işlemenin en tipik durumları basit bir şekilde çözülür. Özlü.
C/C++ ve entegrasyon API'sine gömülü
Güçlü yönlerinden biri de C'de APIEv sahibi bir lua_State, yükleme parçaları (lua_load), işlevleri çağırır (lua_pcall korumalı kayıtları yürütmek için yerel işlevler Lua'dan erişilebilir ve verileri bir dizi boyunca taşır sanal yığınHata yönetimi, çöp toplama, metatablolar ve C-dünyası yapılarını ortaya çıkaran “kullanıcı verileri” için yardımcı programlar vardır.
Bu tasarım, Lua'yı C/C++ uygulamaları için genel amaçlı bir betik motoru haline getiriyor : mantık Lua'ya devrediliyor (tekrarlanması ve dağıtılması kolay), aynı zamanda yerel çekirdeğin performansı korunuyor. Küçük boyutu (uygulama yaklaşık 25.000 satır C kodu ve yüzlerce KB'lık ikili dosyalar) mütevazı cihazlara bile entegre edilmesine yardımcı oluyor.
IoT ve mikrodenetleyicilerde Lua (ESP8266/NodeMCU)
Lua, basitliği ve hızlı geliştirme döngüsü nedeniyle IoT için mükemmel bir uyumdur. ESP8266 için NodeMCU Lua'yı çalıştıran ve aşağıdaki gibi araçlara sahip bir aygıt yazılımı sunar Lua Yükleyici o ESPlorer Komut dosyalarını yükleyebilir, bir konsol açabilir, kod parçacıklarını test edebilir ve anında hata ayıklayabilirsiniz. Dosya init.lua genelde mantığı başlat cihazın (örneğin bir LED'in yanıp sönmesi veya GPIO'nun yapılandırılması)
Olasılığı kodun bölümlerini aşamalı olarak yürüt, her şeyi yeniden derlemeden, deney yapmayı çok rahat hale getirir: değişkenleri bildirin, bir print(a+b), geçiş pimleri vb. Arduino'dan gelenler için bu akış çevik ve öğreticive çoğu zaman küçük değişiklikler betikleri diğer uyumlu cihazlara taşımak için yeterlidir.
Video oyunları ve yazılımlarda dikkat çekici kullanımlar
Hafif yapısı, performansı ve esnek lisanslaması sayesinde Lua, oyun motorlarında ve modlarda favori bir dildir. Roblox gibi platformlar , türlendirilmiş bir varyantını (Luau) desteklemiştir; World of Warcraft , sandbox oyunu Garry's Mod (Half-Life 2'ye dayalı), RTS oyunu Supreme Commander , STALKER'ın bir parçası , LucasArts macera oyunları Grim Fandango ve Escape from Monkey Island , Worms 4: Mayhem ve LÖVE2D gibi çerçeveler , arayüz betikleme, oyun mantığı ve modlar için gücünü göstermiştir.
Ayrıca Tibia (XML ile birlikte kapsamlı özelleştirme seçenekleriyle ), Ragnarok Online (homunculus yapay zekası), Multi Theft Auto: San Andreas veya FiveM gibi sunucular ve modlar , Factorio (Lua tabanlı modlar), Hedgewars , Transformice , Minetest (mod veya oyun oluşturma), StepMania (animasyonlar ve komutlar) ve hatta The Binding of Isaac: Rebirth (DLC Afterbirth+ ile Lua mod desteği eklendi) gibi MMO'larda ve platformlarda da karşımıza çıkıyor.
Araçlar ve sistemler alanında, Ion ve Awesome gibi pencere yöneticileri yapılandırma ve genişletme için Lua kullanırken, REAPER , Rockbox ve Renoise DAW gibi uygulamalar ise betik yazımı ve derinlemesine özelleştirme (özel API, OSC, MIDI, menüler, yüzen pencereler, entegre terminal) için Lua'dan yararlanmaktadır . Ayrıca giriş verilerini işlemek , uygulamaları yapılandırmak, donanımı kontrol etmek ve görevleri otomatikleştirmek için de kullanılmıştır .
Performans, uygulama ve çöp toplama
Lua, bayt koduna derlenir ve verimli bir sanal makinede çalışır; zorlu senaryolar için LuaJIT , çalışma zamanı derlemesi ekler. Çöp toplayıcı artımlı, bayrak tabanlı , yapılandırılabilir (duraklatma ve adım çarpanı) ve kullanıcı verileri ve zayıf tablolar (bellek serbest bırakılmasını engellemeyen anahtarlar/değerler) için sonlandırıcıları (__gc) destekler.
Hız ve kontrolün bu birleşimi, oyunlar, eklentiler ve gömülü sistemler için kabul edilebilir düşük gecikme seviyeleri sağlar. Minimal boyutu , ifade yeteneklerinden ödün vermeden çok sınırlı kaynaklara sahip cihazlarda kullanıma olanak tanır .
Tasarım karşılaştırması ve öğrenme
Daha karmaşık dillerin aksine, Lua ekonomi ve birlikte çalışabilirliğe öncelik verir . Python veya JavaScript'in yerini "tam bir ekosistem" olarak almayı hedeflemez, bunun yerine C dilinde basitlik, taşınabilirlik ve genişletilebilirlik önemli olduğunda en iyi seçenek olmayı amaçlar. " Programming in Lua" kitabı ve teknik makaleler, zarif tasarımını açıklayan kararları ayrıntılı olarak ele almaktadır.
Pascal, C veya açık sözdizimi olan dillerden gelenler düzgün bir giriş eğrisi: bloklar ile do ... end, okunabilir koşullar, 20 iyi tanımlanmış anahtar kelime ve desen local paragraf yan etkileri sınırlamakC ile olan "yapıştırıcısı" ve esnek tablo semantiği, yalnızca gerekli olanın aşağıdan yukarıya doğru oluşturulmasını teşvik eder.
Sık karşılaşılan vakalar ve anekdotlar
Taşınabilirlik açısından, bir Lua uygulamasını işletim sistemleri arasında taşımak genellikle minimum değişiklik gerektirir. Konsollar ve cihazlarda, PSP , Wii ve SEGA Saturn için (belirli kütüphanelerle) sürümler mevcuttur ve ev yapımı yazılım geliştirme toplulukları, basitliği nedeniyle Lua'yı kullanmıştır.
Özel sunucularda ve modlarda (örneğin Tibia ), insanlar üst düzey sistemler, komut dosyaları ve eklentiler oluşturmak için Lua kullanıyor. Ve Friday Night Funkin' gibi yaratıcı platformlarda çalışıyorsanız, Lua, HUD'ları, mod şemalarını ve sahne dekorasyonlarını değiştirmek için kullanılır ve dinamik koreografi için çok yönlülüğünü gösterir.
Başarısını açıklayan güçlü yönler
Hafif ve hızlı : çok küçük ikili dosyalar, minimum bellek tüketimi ve verimli bir yorumlayıcı/sanal makine. Kaynak kısıtlı cihazlarda bu tutumluluk büyük fark yaratır.
Mükemmel C API'si : Yerel fonksiyonları kaydetmek ve yapıları kullanıma sunmak oldukça kolay. "Ana bilgisayarlara" dönüştürülen karmaşık uygulamalar için Lua, yerel çekirdek ile üst düzey mantık arasında ideal bir köprü görevi görüyor.
Çoklu paradigma ve modüler yapı : Tablolar, meta tablolar, fonksiyonlar ve eşzamanlı işlemlerle tam olarak ihtiyacınız olanı oluşturursunuz, ne fazla ne de eksik. Bu iyi düşünülmüş minimum yapı, gereksiz karmaşıklığı önler.
Topluluk ve dokümantasyon : Özlü bir referans kılavuzu, çok sayıda örnek ve birden fazla dilde (İngilizce, İspanyolca, Portekizce) materyaller. "Nasıl çalıştığını anla" kültürü, açık ve sağlam koda dönüşüyor.
Sözdizimi ayrıntıları ve hatırlanması gereken operatörler
Kısa devreli mantıksal operatörler işlenenleri (sadece boolean'ları değil) döndüren: a and b y a or b Boole olmayan değerler döndürebilir, varsayılan atamalar için çok kullanışlıdır (x = x or {}).
.. ile birleştirme, # ile uzunluk (dizelerde ve “dizi türü” tablolarda), ^ ile üs almave C'ye benzer öncelikler, örneğin sağ ilişkisellik gibi özellikler .. y ^ 'nda İspanyolca öğrenerek geçirmeye karar veriyor. zincir desenleri Dış bağımlılıklara gerek kalmadan kolay yakalama ve arama imkânı sunarlar.
Peki neden bu kadar çok motor ve araç bunu tercih ediyor?
Çünkü tasarım ve uygulama arasındaki sürtünmeyi azaltır : Lua'da yineleme hızlıdır, komut dosyalarının dağıtımı ve denetimi kolaydır ve yerel çekirdek sık değişikliklerden korunur. Dahası, izin verici bir lisansa sahip özgür bir yazılım olarak , ticari ürünlere ve topluluk projelerine mükemmel bir şekilde uyum sağlar.
Ayrıca önemli bir kültürel faktör de var: Dilin netliği, daha sonra diğer ortamlarda uygulanabilecek programlama kavramlarının (yüksek dereceli fonksiyonlar, closure'lar, yineleyiciler) öğrenilmesini teşvik ediyor. Karma ekipler (tasarım, betik yazma, motor) için bu, kaliteyi feda etmeden teslimatları hızlandırıyor .
Tarihini, tasarımını ve kullanım alanlarını inceledikten sonra, Lua'nın neden özel bir yere sahip olduğunu anlamak kolaydır: küçük bir dil olmasına rağmen büyük işler başarıyor . Video oyunlarından ve DAW'lardan IoT'ye ve yüzen pencerelere kadar, tablolar ve metatabloların, birinci sınıf fonksiyonların ve eşzamanlı işlemlerin birleşimi, temiz, modüler ve bakımı kolay çözümler ortaya çıkarıyor. Uygulamalarınıza entegre edebileceğiniz güvenilir bir betik motoru veya güçten ödün vermeden otomasyon için basit bir dil arıyorsanız, Lua olağanüstü bir ortaktır.
