7 puan yazan GN⁺ 2025-09-23 | 1 yorum | WhatsApp'ta paylaş
  • Luau, Lua 5.1'den türetilmiş hızlı, güvenli ve kademeli tiplendirmeyi destekleyen gömülü bir betik dilidir
  • Roblox platformundaki karmaşık oyunları ve büyük kod tabanlarını desteklemek için performans, dil araçları ve tip sistemi güçlendirilerek geliştirilmiştir
  • Temel Lua'dan farklı olarak, sandboxing özellikleri içerir ve farklı yetkilere sahip kodların yan yana çalışabilmesi için tasarlanmıştır
  • Sözdizimi Lua 5.1 ile uyumludur, ancak ek sözdizimi genişletmeleri ve analiz araçları (linter, tip denetleyici) sunarak kod kalitesini artırır
  • Performans optimizasyonu, özel bytecode, JIT desteği gibi özelliklerle LuaJIT düzeyinde çalışma hızı hedefler; Roblox'un ötesinde çeşitli gömülü ortamlarda da kullanım potansiyeli yüksektir

Motivation (ortaya çıkış nedeni)

  • Yaklaşık 2006'da Roblox, oyun betik dili olarak Lua 5.1'i benimsedi
  • Zaman içinde Roblox platformundaki oyunların karmaşıklığı arttıkça ve ekipler büyüdükçe, mevcut Lua'nın sınırlarını aşmak için dili ve uygulamasını kapsamlı biçimde geliştirdi
  • Platformun büyümesine paralel olarak performans optimizasyonu, kullanıcı dostuluğu ve dille ilgili araçların geliştirilmesine büyük yatırım yapıldı
  • Özellikle 2020 itibarıyla 1 milyondan fazla satırlık büyük kod tabanları yönetilirken kademeli tip sisteminin benimsenmesinin zorunlu olduğu fark edildi
  • Bu ihtiyaçlar doğrultusunda Roblox, Lua'dan türetilen Luau adlı dili geliştirdi; hızlı, küçük ve güvenli kalırken tiplerin kademeli olarak uygulanabilmesini sağlar
  • Daha ayrıntılı açıklama Why Luau belgesinde yer alır

Luau'ya genel bakış

  • Luau, Lua 5.1 tabanlı gömülü bir betik dilidir
    • Hızlı ve hafif bir runtime sunar
    • Kademeli tip sistemini destekleyerek dinamik ve statik analizin birlikte kullanılmasını sağlar
  • Roblox Studio'ya entegredir ve --!strict bayrağı ile strict mode etkinleştirilebilir
  • Geliştiriciler, Roblox ile bağlantılı belgelere Luau Creator Docs üzerinden ulaşabilir

Sandboxing (sandbox özellikleri)

  • Luau, dışa açılan standart kütüphaneyi sınırlar ve ek sandboxing özellikleri sunar
  • Bu sayede genel geliştiricilerin yazdığı yetkisiz kodlar ile platform içindeki yetkili kodlar güvenli biçimde paralel çalıştırılabilir
  • Bu nedenle temel Lua'dan farklı bir çalışma ortamına sahiptir
  • Ayrıntılar Sandbox açıklaması sayfasında bulunabilir

Compatibility (uyumluluk)

  • Mümkün olduğunca Lua 5.1 ile geriye dönük uyumluluk korunur; sonraki sürümlerdeki bazı özellikler de kısmen yansıtılmıştır
  • Ancak Luau, Lua'nın tüm tasarım kararlarını benimsemez; Roblox'a özgü kullanım senaryolarını ve kısıtları dikkate alır
  • Lua 5.1 sonrası sürümlerdeki özelliklerin destek durumu Compatibility belgesi içinde sunulmaktadır

Syntax (sözdizimi)

  • Lua 5.1 sözdizimiyle tamamen uyumludur
  • Buna ek olarak modern ve tanıdık sözdizimi genişletmeleri sunarak geliştirici deneyimini iyileştirir
  • Tüm sözdizimi Syntax belgesinde incelenebilir

Analysis (analiz araçları)

  • Doğru kod yazımını desteklemek için betik analiz araçları sunar

  • Bileşenler:

    • Linter: yaygın hataları tespit eder
    • Type Checker: tip doğrulaması yapar
  • luau-analyze CLI aracıyla çalıştırılabilir

  • Lint kuralları için Lint belgesi, tip denetimi rehberi için Typecheck belgesi referans alınabilir

Performance (performans)

  • Parser, linter ve tip denetleyiciyi içeren özel bir frontend ile optimize edilmiş bytecode, interpreter ve compiler sunar
  • Bazı durumlarda LuaJIT interpreter'ı ile yarışabilecek performans sağlayabilir
  • x64 ve ARM64 platformlarında manuel JIT compiler desteği sunar; belirli programların performansını önemli ölçüde artırabilir
  • Runtime sürekli optimize edilmekte ve bazı parçaları yeniden yazılarak verimlilik artırılmaktadır
  • Performansın ayrıntılı özellikleri Performance belgesinde sunulmaktadır

Libraries (kütüphaneler)

  • Dilin kendisi Lua 5.1'in tam bir üst kümesidir
  • Standart kütüphanede bazı işlevler kaldırılmış, bazı yeni işlevler eklenmiştir
  • Uygulamaya gömülü olduğunda uygulamaya özel genişletme kütüphanelerine de erişebilir
  • Kütüphanelerin tamamı Library belgesinde görülebilir

1 yorum

 
GN⁺ 2025-09-23
Hacker News görüşleri
  • Lumix Engine'de Lua ve LuaJIT kullanırken tip sistemi nedeniyle Luau'ya geçme deneyimi yaşamıştım, ancak Roblox dışındaki projelerde kullanmanın zor olduğunu hissettim; dokümantasyon zayıf ve topluluk neredeyse yok, bu yüzden sorun çözümünde hiç yardımcı olmuyor, Lua veya LuaJIT'e kıyasla boyutu daha büyük olduğu için derleme hızı 7 kat daha yavaş, API'nin asenkron işleme yapısı da pratikte senkron şekilde tıkanıyor ve STL kullanımı gibi pek çok rahatsızlık var, ayrıca analiz ve LSP ile ilgili hatalarla da sık sık karşılaşıyorum, bu yüzden başka alternatifler aramayı düşünüyorum
    • Roblox ekibi bundan sonra Luau'nun Roblox dışında da daha kolay kullanılabilmesine odaklanıyor, Remedy Entertainment (Alan Wake 2), Digital Extremes (Warframe), GIANTS Software (Farming Simulator 25) gibi çeşitli yerlerde zaten başarılı şekilde kullanılıyor, şu ana kadar yatırım ve destek Roblox içine odaklanmıştı ancak bundan sonra genel amaçlı bağımsız bir runtime olan Lute geliştiriliyor ve çeşitli Luau tabanlı geliştirici araçları da yapılarak ekosistem genişletilmek isteniyor, hâlâ erken aşamada ama dış kullanım ve farklı senaryoları desteklemek için aktif yatırım yapılıyor, Luau'nun sağlıklı büyümesi için daha çeşitli kullanıcılar ve kullanım örnekleri çekmenin önemli olduğuna inanılıyor
    • Bir Unity oyununun tüm oynanış kodunda (60 bin satırdan fazla) Luau kullanıyorum, dokümantasyonun özellikle özel entegrasyonlarla ilgili kısmının geliştirilmesini isterdim ve yeni tip sistemiyle LSP'nin de hâlâ pek uyumlu olmadığını düşünüyorum, zeux ekipten ayrıldıktan sonra uzun vadeli yön konusunda biraz endişeliyim, ama geliştirme deneyiminin kendisini çok seviyorum, Luau kodu oyun çalışırken bile neredeyse anında hot reload oluyor ve C++ projesi de hızlı derlenebiliyor, mod desteği için sandbox ortamı sunması da güzel, resmi Discord topluluğu da bir ölçüde aktif
    • Derlemenin yavaşladığı söylenmişti ama betik diliyse normalde kodu derlemeye gerek olmamalı diye merak ediyorum, acaba Luau VM'in kendisinin derlenmesi mi kastediliyor?
  • Roblox'un Node.js tarzı masaüstü için bir Luau runtime'ı geliştiriyor olması gerçekten ilginç: https://github.com/luau-lang/lute
    • Zaten daha olgun bir Luau runtime'ı olan Lune var, build script'leri ve Roblox place dosyası otomasyon işlerinde kullanıyorum ve benim kullanım amacım için gayet tatmin edici çalışıyor
    • Başka bir bağımsız Luau runtime'ı olarak Lune mevcut
  • Luau, Lua'ya göre çok daha karmaşık görünüyor, koda bakıldığında Luau C++ ile 120 bin satır, Lua 5.1 ise C ile 14 bin satır, kademeli ya da statik tip sistemi eklenince karmaşıklaşmanın kaçınılmaz olduğunu düşünüyorum, bir ölçüde tam teşekküllü tip sistemi varsa dinamik betik dilinden sonuçta daha büyük olmak zorunda
    • Lua (ve bir ölçüde Luau da) satır sayısı açısından değil, dilin kendisini öğrenme açısından küçük sayılır, çalıştırma için gereken runtime Analysis'a tamamen bağımlı olmak zorunda değil, Analysis içinde iki tam tip sistemi bulunuyor ve son 3 yıldır temel sınırlamaları çözmek için yeni bir tip sistemi geliştiriliyordu, artık eskisinin yakında kaldırılması planlanıyor, böylece kod da yaklaşık 30 bin satır azalabilir
    • Lua ve Luau'nun küçük ya da basit diller olduğunu düşünmüyorum, karmaşıklık her zaman gerekli de olmayabilir, Bau adlı daha basit ama ifade gücü yüksek bir dil üzerinde çalışıyorum ve Lua tarzı bir VM de geliştiriyorum, bu tür küçük diller Reddit'te de zaman zaman gündem oluyor Bau, Bau VM, r/ProgrammingLanguages
    • Statik tipleme ya da kademeli tipleme karmaşıklığı artırır ama artış düşündüğünüz kadar büyük değildir, hatta dinamik betik dilleri bazen daha karmaşık bile olabilir, Hindley–Milner tip denetleyicisi tek sayfalık kodla uygulanabilirken burada konuşulan 2 bin sayfalık karmaşıklık bana fazla geliyor, H–M yüksek dereceli fonksiyonları, generics'i (parametrik çok biçimlilik), null pointer'ı ele almadan da tamdır ve tüm çıkarımı yapabilir, genişletilebilir ve sadece temeliyle bile C veya Java 1.7 tip sisteminden çok daha güçlüdür
    • Lua için tip denetleyicisini bizzat yazdım ve kaynak kodunu da çok okudum, Lua'nın 14 bin satırı çok yüksek kod yoğunluğuna sahip, ortalama bir stille yazılsa 30-40 bin satır civarında olurdu, yani Lua özünde küçük olduğu için değil, son derece özlü yazıldığı için böyledir
    • tokei ile analiz edilen satır sayısını daha ayrıntılı yazarsak, Analysis dizini C++ 62 bin satır, C header 9 bin 200 satır, Ast C++ 8 bin 400 satır, CodeGen C++ 21 bin satır vb., Lua 5.1 ise src genelinde 11 bin satır C kodu ve 1.900 satır header içeriyor
  • Teal ile Luau arasındaki farkı merak ediyorum, ikisi de "statik tipli Lua lehçesi" olarak tanıtılıyor, o yüzden karşılaştırmak istiyorum https://teal-language.org/
    • Teal, Teal dosyalarını Lua'ya derliyor; dolayısıyla JS ile TS arasındaki ilişki gibi avantajlar ve dezavantajlar burada da geçerli, Luau ise Lua ile geriye dönük uyumlu kendi runtime'ına sahip ve sadece tip sistemini değil geliştirici deneyiminin kendisini de iyileştiriyor, bu yüzden ikisi oldukça farklı, Teal'in avantajı Lua'nın kullanılabildiği her yerde çalışabilmesi, buna karşılık Luau yalnızca Luau'ya özel runtime'da çalışıyor ama ayrı bir derleme aşaması gerektirmediği için geliştirici açısından daha iyi kullanılabilirlik sunabiliyor, ayrıca tip bilgisi kaybolmadan kullanılabiliyor
    • Teal Lua'ya transpile edilirken Luau, Lua'nın bir fork'u, kendi interpreter performansı, güvenlik, sözdizimi genişletilebilirliği gibi alanlarda kapsamlı değişiklik yapabiliyor, Roblox yaklaşık 100 milyar dolarlık piyasa değerine ulaşacak kadar büyük ve bu iş üzerinde çalışan birden fazla tam zamanlı geliştiriciye sahip
    • Luau, "Lua'ya sadece tip eklenmiş hâli" değil, kademeli tip sistemi ve tip çıkarımına büyük önem veriyor ve dilin kendisini de aşamalı olarak geliştiriyor, geliştirici deneyimi ve araç desteği merkezli tasarlanıyor, ikili dosya boyutu gibi konulara dikkat edilse de Lua'daki gibi katı sadelik öncelik değil, büyük C projelerini Lua'ya bağlamaktan çok geliştiricinin doğrudan bu dilde iyi bir deneyim yaşamasına odaklı
  • Lua'nın geçmişle uyumluluğu daha iyi koruyarak evrimleşememiş olması üzücü, 2000'lerin sonlarında Roblox dahil birçok proje Lua 5.1'i benimsedi ve bugün Lua 5.4'e gelmiş olsa da eski sürümlerle uyumluluk iyi korunmadı, LuaJIT gibi projeler de yalnızca 5.1'i destekliyor, Python 2.x/3.x durumuna benziyor ama Lua topluluğu çoğunlukla hâlâ 5.1 kullanmaya yatkın görünüyor
    • Aslında durum daha da kötü, luau ve luaJIT de resmi lua projesinden ayrı yönlere evrildi ve artık birbirleriyle de ince farklarla uyumsuzlar, hepsi Lua 5.1'den ayrılmış olsa da artık ortada resmi bir standart kalmamış gibi hissettiriyor
    • Büyük fark şu ki Lua topluluğu geriye dönük uyumluluğun korunmamasını açıkça yerden yere vurmuyor, bu yüzden farklı sürümler için kod yazmak oldukça kolay
    • Resmi istatistik bulmak zor ama hissiyat olarak 5.1 ve 5.2 kullanıcıları 5.4'ten fazla, hatta 5.3'ü bile geçmiş olabilir, LuaJIT'e ilgi çok ama pratikte sık karşıma çıkmıyor
    • LuaJIT, Lua'nın daha yeni sürümlerindeki (5.2, 5.3) bazı özellikleri de içeriyor ve daha fazlasına sahip https://luajit.org/extensions.html
  • En ilginç bulduğum şey, Luau interpreter'ının bazı durumlarda LuaJIT'le boy ölçüşebilmesi oldu, performans sayfasında bunu iyi anlatan açıklamalar var ve Roblox'un mühendislik gücünü hissettiriyor https://luau.org/performance
  • 13 yaşındaki çocuğum Roblox Studio'ya ilgi duymaya başlayınca Luau'yu öğrendim ve luau.org'u da ziyaret ettim, Roblox'un mühendisliği gerçekten etkileyici
    • Arseny Kapoulkine müthiş bir mühendis, blogunu ya da sosyal medya hesaplarını takip etmeye değer, luau ve Roblox'un render motorunun yanı sıra meshoptimizer'ı da yaptı; bu kütüphane grafik dünyasında neredeyse vazgeçilmez, volk ise Vulkan SDK'ya dahil edilecek kadar önemli
  • Second Life, mevcut Linden Scripting Language'den Luau'ya geçiş sürecinde, daha önce Mono tabanlı derleme kullanılıyordu ama Mono artık sürdürülemediği için yeni bir dil gerekiyordu, sadece Luau desteği eklenmedi, mevcut LSL derleyicisi de Luau yürütme motorunu hedefleyecek şekilde değiştirildi, performans da bir miktar arttı, Second Life sunucularında yüz binlerce olay tabanlı betiğin çalıştığı çok sıra dışı bir ortam ve burada kaynak yönetimi kolay değil, etkin olmayan programların kare başına 1 mikrosaniye harcaması bile birikince büyük sorun olabilir
    • Luau beta ortamı açıldığında bizzat denedim ve eski Mono sistemine göre performansın belirgin biçimde arttığını hissettim, özellikle kaydetme sırasında betik denetimi süresinin 10 saniyeden anında gerçekleşir hâle gelmesi geliştirme verimini çok artırdı, ancak FiveM'deki gibi coroutine'leri kolay yönetmek için CreateThread(fn), Wait(ms) gibi yardımcı fonksiyonlar ve Await/Promises desteği olsa daha da iyi olurdu (Luau Promise implementasyonu), FiveM'de bu tür wrapper'lar betik optimizasyonu ve coroutine yönetimini kolaylaştırıyor, FiveM'in Lua scheduler örneği
    • VM değiştirildikten sonra hemen göze çarpan şey, önceki overhead'in büyük kısmının scheduling, context switch ve kütüphane fonksiyonlarının implementasyonunda olmasıydı, Luau tasarımı gereği preemptive scheduling'i doğal biçimde destekliyor, bu yüzden basit glue code orkestrasyonu çok daha kolaylaşıyor, bunu VM üzerinde ele almak AST ya da bytecode aşamasında state machine dönüşümü yapmaktan çok daha ucuz ve uygulanması da daha kolay, idle programların mikrosaniye düzeyindeki overhead'i de sonuçta scheduler'ın optimize etmesi gereken bir hedef
  • Lua'nın o minimal cazibesi type inference yüzünden bir miktar zedelenmiş durumda, ama bu da tip güvenliğiyle yapılan bir takas, yine de --!strict bildirdikten sonra bile bariz tip ihlalleri olduğunda hiçbir hata ya da uyarı vermeden kodun çalışması beni şaşırttı, beklediğim davranış bu değildi
    • Şu anda Luau'nun tip sistemi "zorunlu (strict)" değil, tip denetimi yapmadan kod çalıştırmak mümkün ve demo ya da luau çalıştırılabilir dosyasıyla doğrudan çalıştırırsanız tip denetimi uygulanmıyor, eğer gömülü ortamda tüm kodu derlemeden önce zorunlu olarak tip denetiminden geçirirseniz beklediğiniz gibi tip hatalarının yakalandığı bir deneyim elde edebilirsiniz, bu da yüz milyonlarca satır Lua 5.1 kodunun bir anda Luau'ya dönüştürülmüş olmasının kaçınılmaz bir tasarım sonucu
  • Hep Typed Lua istemiştim ama dinamik bir dil için tip denetleyici ve LSP'yi tam anlamıyla uygulamak oldukça zordu, her dinamik dilde benzer yapısal tipleme sorunları var (TypeScript'te yaşananlara benzer), eğer TypeScript motoru yeniden kullanılsa, Luau kodu kısmen TypeScript'e çevrilse, tsc ile denetlense ve sonra hata/sonuçlar tekrar Luau'ya eşlense, çeşitli dinamik diller için hızlı bir tip denetleyici yapmak mümkün olabilir mi diye merak ediyorum
    • LLVM'in derleyiciler için ortak bir IR olması gibi, tip sistemleri için de ortak backend olarak TypeScript type system'ı kullanan bir "ara dil" mümkün olabilir, dinamik dilleri pek sevmem ama TypeScript düzeyinde tip denetimi ve araç desteği mümkün olursa ilgim artar, yapılamayan kısımlardan vazgeçmek de zaten kademeli tiplemenin özü, TypeScript tip sistemi Lua runtime'ına gelse kesinlikle kullanmak isterim, Luau'nun gidişatını da ilgiyle takip ediyorum
    • Luau için zaten harika bir Luau Language Server var; vscode, nvim, zed gibi ortamlarda mükemmel tanılamalar, otomatik tamamlama ve katı tip denetimi sağlıyor, Ruby ya da Python'da hissettiğimden çok daha iyi bir geliştirme deneyimi sunuyor, ben Luau'yu shell scripting'de ve genel programlamada kullanıyorum, ayrıca seal adında Node.js tarzı kendi runtime'ımı da yaptım, Roblox geliştiricilerinin CI/CD, test gibi işler için daha popüler olan Lune'u kullandığı söyleniyor
    • TypeScript ile dinamik dillerin her köşesini tiplemeye çalışmak sistemi fazla karmaşıklaştırır; bence Rescript ya da Gleam gibi hedef dilde bazı kısıtlar koyup Hindley–Milner tip sistemine gitmek daha iyi, HM tip sistemi uzun yıllara dayanan teori ve pratik sayesinde sağlam ve kullanışlı, kişisel olarak Lua kodu üreten küçük bir ML ailesi dil projesinin olmamasına şaşırıyorum, Gleam backend olarak Lua'yı desteklese gerçekten çok yakışırdı
    • Zaten mevcut bir proje var: TypeScriptToLua, Love2D ile oldukça iyi bir deneyim yaşamıştım