Lua fazlasıyla hafife alınan bir dil
(nflatrea.bearblog.dev)- Lua’nın tasarımını ve implementasyonunu öğrendikçe daha da etkileniyorum. Az kodla çok iş yapan yazılımlar nadirdir
- Ancak Lua, diğer diller kadar pazarlanmadı ve ilgi görmedi. Bu yüzden Lua’nın özelliklerini ve avantajlarını bilen geliştirici sayısı az
- Çoğunlukla oyunlar ve gömülü sistemlerde kullanılan niş bir dil olarak görülüyor
[Lua'nın özellikleri ve avantajları]
Anlaması kolay bir dil
- Lua ücretsiz, yansıtmalı ve imperatif bir betik dilidir. 1993’te oluşturuldu ve diğer uygulamalara gömülerek genişletilebilir olacak şekilde tasarlandı.
- Tasarımı temizdir ve kodu hızlıdır. C API’si kullanımı kolaydır ve performansı iyidir.
- Söz dizimi sade ve minimalisttir; bu da onu yeni başlayanlar için erişilebilir kılar.
Olağanüstü gömülebilirlik
- Lua, diğer dillere, özellikle de C ve C++ ile yazılmış uygulamalara kolayca gömülmek üzere tasarlanmıştır.
- Oyunlar ve gömülü uygulamalarda betik yazımı ve genişletme için mükemmel bir seçimdir.
- Örnek: Lua’yı bir C programına gömmek
#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; }
Birden fazla programlama paradigmasını desteklemesi
- Lua, tek başına ya da uygun kütüphanelerle birlikte imperatif, fonksiyonel ve nesne yönelimli programlamayı destekler.
- Kullanıcının ihtiyaçlarına göre programlama stilini seçebilmesini sağlayan bir esneklik sunar
[Lua'nın olası dezavantajları]
İndeksleme geleneği
- Lua’da indeksleme genellikle 1’den başlar, ancak bu bir gelenektir. Diziler 0, negatif ya da başka değerlerle de indekslenebilir.
- Lua’da aslında gerçek diziler yoktur; her zaman anahtar-değer hash yapısı olan tablolar vardır ve bunlar 0, negatif veya başka değerlerle indekslenebilir
- Standart kütüphane ve yerleşik fonksiyonlar, indeksleri 1’den başlayan dizi benzeri tabloları varsayar.
Hata yönetimi
- Lua’nın hata yönetimi, başka dillerden gelen geliştiriciler için sezgisel olmayabilir.
- Lua’da hatalar bir değer olarak ele alınabilir.
pcallkullanılarak hatalar yakalanabilir.function risky_function() error("Something went wrong!") end local status, err = pcall(risky_function) if not status then print("Error: " .. err) end
Nil ile sonlanan diziler
- Lua’daki diziler (dizi olarak kullanılan tablolar) bir
nildeğeriyle karşılaşıldığında sona erer; bu da beklenmedik davranışlara yol açabilirlocal arr = {10, 20, 30, nil, 50} for i, v in ipairs(arr) do print(v) -- output: 10, 20, 30 (stops at nil) end ipairsfonksiyonu birnildeğeriyle karşılaştığında yinelemeyi durdurur- Dizide boşluklar varsa
ipairsyerinepairskullanmak daha iyidir. Böyleceniliçerenler de dahil tüm öğeler dolaşılabilir
[Özet]
- Lua, daha fazla takdiri hak eden güçlü, verimli ve çok yönlü bir programlama dilidir.
- Sadelik, gömülebilirlik ve performans sayesinde oyunlar ve gömülü sistemler gibi çeşitli uygulamalar için uygundur.
- Hafife alınsa da sadeliği ve performansı sayesinde denemeye değerdir
- nvim’in eklenti sisteminde kullanılır ve verimlidir.
7 yorum
> Lua'da aslında dizi yok; her zaman anahtar-değer hash'i olan tablolar var, bu yüzden 0 veya negatif sayılar gibi çeşitli değerlerle indeksleme yapılabiliyor
WoW addon'ları yüzünden Lua'yı kısa süreliğine kullanmıştım; en çok aklımda kalan kısım da buydu. Neredeyse tüm veri yapılarında hep tablo kullanıyorlardı.
Sadece Lua'nın adını biliyordum ama bu yazıyı görünce pek de iyi olmadığını düşünmeye başladım haha..
Pek iyi bilmiyorum ama sürüm geriye dönük uyumluluğunun berbat olduğuna dair şeyler duydum..
Bana kalırsa Ruby’ye göre, en azından “eski kod ilk etapta çalışıyor mu??” sorusunda biraz daha iyi ama özellikle 5.3’te
numberele alış biçimi önceki sürümlerden değiştiği için 5.1’den 5.3’e yükseltince içeride takibi zor bir sürü bug ortaya çıkıyor...Bir de LuaJIT kullanan yer çok ve bunun arayüzü de yine hafif farklı; sanırım en ciddi sorun da bu ince farklardan kaynaklanan problemler. İç çalışma biçimi değişen epey kısım var, o yüzden pek yapılacak bir şey de olmuyor.. =m =.
Lua ile SmartThings için Edge driver yazma deneyimim oldu.
Fena sayılmazdı ama benim zevkime uygun bir dil değildi.
Bence geliştirme ortamı ve DE de dilin bir parçası,
öncelikle toplulukta bir miktar bölünmüşlük var gibi görünüyor
Ayrıca birkaç farklı language server var ama her birinde bazı özellikler eksik ya da kod indeksleme yavaş; bir değişiklik olunca da baştan yeniden yapıyor gibiydi.
1 tabanlı indeksleme ya da yorumlarla tip ipucu yazmak da pek iyi değil,
üstelik tip ipuçları için de bir standart yok gibiydi; sanki her language server farklı davranıyordu.
Coroutine'ler de bana eski Python'dakileri hatırlatıyor...
Ama embedding ve FFI'nin gerçekten kullanışlı olduğu kesin gibi.
Bu aralar sumneko’nun yaptığı Lua language server harika 'm'... (sanırım 22 ya da 23’te yapmıştı) Bunun indeksleme tarafı bayağı isabetli geldi bana.
Bence Lua’nın avantajı da (ve dezavantajı da) daha çok tuhaf şeyler yaparken ortaya çıkıyor; başka nesnelerin metotlarını saçma denecek kadar kolay overwrite edebiliyorsun. Bu yüzden de çok plansız, aklına geldiği gibi yazmak için gerçekten iyi bir dil bence.
Type hinting ise... dediğiniz gibi ortaya çıkan çözüm gerçekten çok ama düzgün şekilde yerleşmiş bir çözüm neredeyse yok, o yüzden Roblox ekibinin yaptığı luau’dan umutluyum..
Hacker News görüşü
Lua gömmek için iyi, ancak Redis'te betik dili olarak seçilmesinden çok pişmanlık duydum. Dilin kendisini sevmiyorum. Beklediğim soyutlama seviyesiyle karşılaştırınca sanki sürtünme varmış gibi geliyor. Küçük tasarım kararları birikerek dili bir miktar kullanıcıya karşıt hale getiriyor. Yine de hızlı olması, entegrasyonunun kolay olması, az bellek kullanması ve güvenilirliği nedeniyle hâlâ seçmeye değer. C API düzeyinde bile yığın erişim yaklaşımı nedeniyle benzer bir zorluk hissi var. FORTH benzeri yığın dillerine maruz kalmış olsam da bağlayıcı yazarken hâlâ zihinsel efor gerektiriyordu.
Lua'yı seviyorsanız Terra'ya bakmanızı öneririm. Terra, Lua'ya gömülen ve Lua ile meta programlanan düşük seviyeli bir sistem programlama dilidir. C/C++ gibi statik tipli, derlenen bir dildir ve manuel bellek yönetimine izin verir. Ancak C/C++'tan farklı olarak en baştan Lua ile meta programlanmak üzere tasarlanmıştır. Terra programları, Apple'ın C derleyicisinde kullanılan aynı LLVM backend'ini kullanır. Bu da Terra kodunun eşdeğer C koduna benzer performans verdiği anlamına gelir.
Yakın zamanda Lua'yı özel bir oyun motoruyla entegre etme işi yaptım ve diğer dillerle entegrasyonunun ne kadar temiz olduğuna katılıyorum. Arayüz temiz olduğu için otomatik bağlayıcı üretmek kolay. Roslyn Incremental Source Generators kullanarak C# ile Lua arasındaki bağlayıcıları otomatik ürettim ve arayüz tasarımı sayesinde hiç zor olmadı. Lua yığını, dinamik tipleme ve "table" sayesinde C# ile Lua arasındaki keyfi veri sınıfları için marshaller üretmek kolaydı. Ancak dilin kendisine yönelik geçerli birçok eleştiri var. Özellikle 1 tabanlı indekslemeyi sevmiyorum. Bu sorunları çözerken benzer arayüze sahip gömülü bir betik dili tasarlamayı düşünüyorum.
Lua'ya karşı daha fazla sevgi geliştirmedim. Aksine memnuniyetsizliğim güçlendi. Lua ile kod yazmayalı uzun zaman oldu ama hiçbir zaman sezgisel bulmadım. Dizilerin neden table olduğunu, neden nil ile sonlandığını ve neden 1'den başladığını anlayamıyorum. Lua'nın küçümsendiğini düşünmüyorum. (Eski) oyun motorlarında betik yazmak için oldukça popüler.
Lua eklenti komutlarıyla bir sohbet botu yaptım ama bunu bir C++ programına entegre etmek korkunç bir deneyimdi. İnsanların neden gömmenin kolay olduğunu söylediğini anlayamıyorum. Çok fazla yığın manipülasyonu yapmanız gerekiyor. Dilin kendisi külfetli ve hata yaptığınızda size hiç yardımcı olmuyor. Bir daha asla Lua kullanmayacağım ve Lua kullanan projelerden kaçınacağım.
Lua; zayıf tipleme, tip ipuçlarının olmaması ve hata işleme eksikliği nedeniyle kayda değer miktarda kod yazmayı zorlaştırıyor. Küçümsenmiyor. Zamanla statik tipli dillere ve tip ipuçlarına (Python, TypeScript) giderek daha fazla değer vermeye başladım. Topluluk içinde ipuçsuz Python ya da JS kodu yazmak zararlı. Yakın zamanda 1.5k cloc JS kodunu TypeScript'e yeniden yazdım. Sürekli eksik null kontrolleri, null özellik erişimleri veya anlam olarak şüpheli onlarca null vardı.
Betik gerektiren çoğu uygulamanın JavaScript gömmesi gerektiğini düşünüyorum. Mevcut ekosistemden gelen büyük bir avantaj var. İnsanlar her zaman sevmese de bunu zaten milyonlarca kişi biliyor. Dizi indeksleme, nil ile sonlandırma gibi tuhaflıkları ve Lua'nın ancak çalışma zamanında ortaya çıkan onlarca başka özelliğini yeniden öğrenmek gerekmiyor. Her ölçekte JS motoru var ve çoğu işletim sistemi kurulum gerektirmeden erişilebilen yüksek kaliteli motorlar ve gömme çerçeveleri sunuyor. Kullanıcıya yeni bir dil öğretmek yerine standart bir dil kullanmak daha iyi. Hem kullanıcıya hem de kendinize zaman kazandırabilir.
Lua ile çalışmaktan keyif aldım ve onun çok iyi bir dil olduğunu düşünüyorum. Özellikle C/C++ içine gömme arayüzü temiz ve esnek. Performansla ilgili sorunlar var ama yüksek performanslı video oyunlarında oyun mantığı için Lua'nın yaygın kullanımı düşünüldüğünde bunlar aşılabilir görünüyor. Ancak kafa karıştırıcı ve dili zorlaştıran başka sorunlar da var. Lua'yı ve C arayüzünü öğrenmek neredeyse Lua'nın kendisini öğrenmek kadar emek istediği için dağıtımlar arasında geçiş yapmak diğer dillere göre daha kafa karıştırıcı. Buna rağmen dilin küçümsendiğini düşünüyorum.
Lua gömmek eğlenceliydi ama wasm'de olduğu gibi tüm ikiliyi yeniden derlemeden yeni kod çalıştırmanız gereken durumlar çok nadirdi. En eğlenceli deneyim C++ ile bir oyun motoru yapmak ve tüm oyun mantığında Lua kullanmaktı. Hızlı debug döngüsü çok faydalıydı. İkinci en eğlenceli şey, Lua mantığını yeniden yükleyebilen bir IRC botu yapmaktı. Üçüncü olarak en eğlenceli şey, Lua'yı Turing-tam bir yapılandırma dili olarak kullanmaktı. Dizi gerektiğinde Lua'da dizi yaptım. En az eğlenceli olan ise Blender eklentisinin 3D modelleri üretilmiş Lua olarak dışa aktarmasıydı.
Lua'nın abartıldığını düşünüyorum. Çünkü oyun endüstrisinde yaygın olarak kullanılıyor. Lua'nın tek avantajı C++ içine kolayca gömülebilmesi. Bunun dışında bir kâbus.