2 puan yazan GN⁺ 2023-08-20 | 1 yorum | WhatsApp'ta paylaş
  • WebAssembly bulut ve edge bilişimde giderek daha önemli hale gelirken, Moonbit Wasm’ın verimlilik, güvenlik ve küçük boyut avantajlarından daha kolay yararlanmayı hedefleyen Wasm-first bir dil olmayı amaçlıyor
  • Moonbit, Rust ve C/C++’ın öğrenme zorluğu ile uzun derleme süreleri, Go’nun ise büyük ve verimsiz üretilen kod gibi sınırlamalarını hedef alıyor
  • Tasarım odağı hızlı derleme ve çalışma, küçük Wasm çıktısı ve kolay kullanılabilirlik; buna çoklu ara temsil optimizasyonu, fonksiyon düzeyinde paralel semantik analiz ve artımlı yeniden analiz dahil
  • Fibonacci örneğinde yerel fonksiyon tipi çıkarımı, en küçük Wasm çıktısı, Go’dan daha hızlı ve Rust’a benzer performans ile özyinelemeli closure ve exhaustive pattern match desteği vurgulanıyor
  • Şu anda çevrimiçi IDE, CLI araçları, dokümantasyon ve VSCode uzantısı sunuluyor; 2024’ün 2. çeyreği sonuna kadar beta status hedefleniyor ve beta kalitesine ulaştıktan sonra kaynak kodun açılması planlanıyor

WebAssembly öncelikli bir dil hedefi

  • WebAssembly, verimlilik, güvenlik, küçük boyut ve açık standart olma özellikleri nedeniyle bulut ve edge bilişimde önemi artan, platformlar arası bir komut kümesi mimarisidir
  • Mevcut seçeneklerin Wasm’ın potansiyelinden yeterince yararlanamadığı düşünülüyor
    • Rust ve C/C++ gibi düşük seviyeli Wasm dillerini öğrenmek zor ve uzun derleme süreleri geliştirme hızını yavaşlatabiliyor
    • Go gibi yüksek seviyeli dillerde üretilen kodun verimsiz ve büyük olması, Wasm’ın hız ve küçük boyut avantajlarını tam kullanmayı zorlaştırıyor
  • Moonbit, hızlı derlenip çalışan, küçük Wasm çıktıları üreten ve Go gibi öğrenmesi kolay bir Wasm-first dil olmayı hedefliyor

Dil tasarımı ve ekip

  • Moonbit, Hongbo Zhang ve dil tasarımı ile geliştirme konusunda 10 yıldan fazla deneyime sahip bir ekip tarafından yürütülüyor
  • Zhang; OCaml, ReScript ve Flow’a katkıda bulundu; ReScript araç zincirinde hızlı derleyici, standart kütüphane ve build sisteminde chief architect olarak görev yaptı
  • Dil tasarımı hem Go hem de Rust’tan etkileniyor
    • Go’nun sadeliği, özellikle paket sistemi benimsendi
    • Rust’ın ifade gücü; pattern matching, type inference, generics ve trait benzeri ad-hoc polymorphism dahil edildi
  • Hata toleranslı tip sistemi; hız, paralelleştirilebilirlik ve artımlı kontrol gözetilerek tasarlandı ve IDE desteği temel hedeflerden biri olarak konumlandırıldı

Hızlı derleme ve çalışma

  • Moonbit, hem geliştirme performansını hem de çalışma zamanı performansını kapsayan, uçtan uca hızlı bir dil olmayı hedefliyor
  • Tüm program optimizasyonu için çok seviyeli ara temsiller (IR) kullanılıyor
    • Bellek yerleşimini iyileştirerek cache miss sayısını azaltmayı amaçlıyor
    • Veri akışı ve kontrol akışı analizleri için daha iyi bağlam sağlıyor
    • Mevcut link-time optimization yapılarının çoğundan daha kapsamlı bir program yapısı anlayışıyla daha etkili optimizasyon sağladığı düşünülüyor
    • Düşük seviyede görünmeyen yüksek seviyeli tekrarlar bulunup kaldırılabiliyor
  • IDE işlevleri için kritik olan hızlı build performansı adına fonksiyon düzeyinde paralel semantik analize izin veriliyor
    • ReScript ve Rust’tan farklı olarak fonksiyon düzeyinde paralel semantic analysis mümkün
    • Aynı ayrıntı düzeyinde artımlı yeniden analiz yaparak büyük monorepo’ları işleyebildiği ve milisaniye düzeyinde yanıt süreleri sunabildiği belirtiliyor

Küçük Wasm çıktısı

  • Moonbit, etkili dead code elimination gözetilerek tasarlandı
  • Bu analizi engelleyen dil özellikleri hariç tutuldu ve standart kütüphane de ölü kod temizlemeyi kolaylaştıracak şekilde yapılandırıldı
  • Tüm program optimizasyonuyla nihai kod boyutunu önemli ölçüde azaltmayı hedefliyor
    • Kod boyutundaki küçülmenin güvenliği artırdığı ve saldırı yüzeyini azalttığı düşünülüyor
    • Serverless bilişim ortamlarında hızlı başlangıç sağladığı belirtiliyor

Kullanılabilirlik için özellikler ve araçlar

  • Moonbit, Rust’tan farklı olarak otomatik bellek yönetimi sunuyor
  • Go’dan farklı olarak pointer veya left value gibi riskli unsurlardan kaçındığını belirtiyor
  • Veri odaklı programlama için güvenli özellikler sunuyor
    • algebraic data types
    • ad-hoc polymorphisms
    • pattern match
  • Dilin ötesinde bir platform olmayı da hedefliyor ve erken aşamada bile bir araç seti sunuyor
    • yüksek hızlı build aracı
    • paket yöneticisi
    • derleyici
    • IDE
    • yalnızca tarayıcıyla her yerden erişilebilen, container gerektirmeyen Cloud IDE
    • bu Cloud IDE’nin çevrimdışı özellikler de sunduğu ve mevcut Cloud IDE’lerden ayrıştığı belirtiliyor

Fibonacci örneği üzerinden farklar

  • Fibonacci örneğinde MoonBit, Go ve Rust ile fib fonksiyonu uygulanarak karşılaştırılıyor
  • Benchmark sonuçlarına göre MoonBit; tip çıkarımı, kod boyutu, performans ve kullanılabilirlikte fark gösteriyor
    • Yerel tip çıkarımı: MoonBit, yerel aux fonksiyonunun tipini çıkarıyor
    • Küçük Wasm boyutu: MoonBit en küçük Wasm çıktısını üretiyor
    • Performans: Go’dan daha hızlı ve Rust’a benzer
    • Kullanılabilirlik: Go gibi özyinelemeli closure’ları destekliyor; Rust’ta bunun uygulanmasının çok zor olduğu belirtiliyor
    • Rust gibi exhaustive pattern match desteği sunuyor ve bunun Go’nun switch case yapısından çok daha güçlü olduğu ifade ediliyor

Mevcut durum ve yol haritası

  • Moonbit hızla değişen bir hedef olsa da şu anda kullanılabilecek giriş noktaları sunuyor
  • Dil araç zinciri geliştirmek geçmişte birkaç yıldan 10 yıla kadar sürebiliyordu; ancak birikmiş deneyim ve baştan oluşturulan özel ekip sayesinde geliştirmenin sadeleştirildiği belirtiliyor
  • 2024’ün 2. çeyreği sonuna kadar beta status seviyesine ulaşılması bekleniyor
    • beta status; görece kararlılık, az sayıda hata ve Wasm host ile etkileşim için sağlam bir FFI anlamına geliyor
  • Kaynak kodun, beta kalitesine ulaşıldıktan sonra açılması planlanıyor
  • Stratejik planda Wasm 2.0 için Wasm GC entegrasyonu ve Wasm 1.0 için kendi GC’si yer alıyor; bunun Wasm proposals ile uyumlu olduğu belirtiliyor

Topluluk kanalları

1 yorum

 
GN⁺ 2023-08-20
Hacker News yorumları
  • Bu projenin lideriyim. Şu anda çevrimiçi IDE https://try.moonbitlang.com üzerinden hemen deneyebilirsiniz; F5 ile çalıştırılabiliyor.
    Dokümantasyon https://github.com/moonbitlang/moonbit-docs adresinde; derleyici beta aşamasına geldiğinde yayımlanacak. Tahmini zaman 2024 2. çeyrek sonu.

    • Yeni bir programlama dili gördüğümde önce baktığım sorular şunlar: asenkron kod nasıl yazılıyor; algebraic effects, contexts/capabilities, linear types gibi daha az ana akım özellikler var mı; tip sistemi sağlam mı ve type cast gerekiyor mu; interface/trait/protocol destekliyor mu; generics ne kadar zengin?
      Örneğin tip parametrelerinde açık variance gösterimi, alt/üst sınır kısıtları, higher-kinded types, yapısal/nominal alt tiplemeden hangisinin daha merkezde olduğu, algebraic data types ve generalized algebraic data types olup olmadığına da bakmak isterim.
      Referans: https://v2.ocaml.org/manual/effects.html, https://docs.hhvm.com/hack/contexts-and-capabilities/introdu..., https://austral-lang.org/linear-types
    • Lisans, fiyatlandırma ve projenin kontrolü konusunda bilgi almak isteyecek çok kişi olacağını düşünüyorum. Bunları şimdi açıklamak ticari strateji açısından dezavantajlı olabilir ama gizlilik ve belirsizlik ilgiyi söndürebilir.
    • https://moonbitlang.com/docs/syntax/ dokümanı, yazı rengi ve arka plan rengi yüzünden okunması zor.
    • Özel bir fn anahtar sözcüğünün gerçekten gerekli olup olmadığını merak ediyorum. func ile fn arasındaki temel farkın ne olduğunu bilmiyorum.
    • func ile fn ayrımına gerek var mı, fonksiyon imzasında dönüş değerini gösteren -> okuna gerçekten ihtiyaç var mı merak ediyorum.
      Yeni tip sözdizimi struct User, ama bu durumda Go'daki gibi type User struct bence daha iyi olurdu. Böylece type AssignUser func(name: String, id: Int) -> Int gibi fn değişkenleri için fonksiyon tipi de oluşturulabilir.
      : işaretinin lexer'a veya parser'a yardımcı olup olmadığını da merak ediyorum. Fonksiyon imzasında func(name: String) yerine func(name String) yazılamaz mı; tip bildirimleri de mut elems: List[Int] yerine mut elems List[int] olamaz mı diye sormak isterim. Ufak tefek kusur arama gibi ama genel olarak hoşuma gitti.
  • Site Rust ve Go ile karşılaştırıyor ama bana AssemblyScript ile karşılaştırmak daha doğru görünüyor. AssemblyScript de WASM-native ve ekosisteminin hâlâ küçük olması da benzer.
    Ancak Moonbit'in aksine TypeScript kullanmış kişilere tanıdık gelen bir dil; bu yüzden AssemblyScript yerine Moonbit'i neden kullanmam gerektiğini merak ediyorum.

    • Çünkü Moonbit modern bir dil, AssemblyScript ise geçmişin hatalarını devralıyor. Örneğin Moonbit pattern matching destekliyor ve dil yapılarının çoğu expression.
      AssemblyScript'te pattern matching yok ve çoğunlukla statement'lardan oluşuyor. Moonbit'te algebraic data types var; AssemblyScript'te böyle bir şey var mı pek bilmiyorum. Runtime farkları da daha fazla olabilir ama yalnızca web sitesine bakarak değerlendirmek zor.
    • AssemblyScript'ten çok Grain'e daha yakın görünüyor: https://grain-lang.org/
    • Rust ve Go karşılaştırması sanırım ikisinin de popüler ve WASM desteği birinci sınıf olan diller olmasından kaynaklanıyor; yine de AssemblyScript ile karşılaştırılması gerektiğine katılıyorum.
  • Üst seviye fonksiyon tanımları için func, iç içe fonksiyon tanımları için fn anahtar sözcüğünü kullanmak iyi değil. Belirli bir bağlamdan bağımsız olarak ikisinden birinde birleşmek gerekir.

    • İç içe fonksiyon closure olduğu için böyle olabilir. Üst seviye bildirimlerden farklı olarak ad ve tip atlanabiliyor ve değer yakalayabiliyor; bu yüzden ayrı bir closure/lambda sözdizimi olan diller az değil.
      Bunun gerçekten gerekli ya da iyi bir tasarım olup olmadığı ayrı konu ama çok örneği var.
    • İç içe fonksiyonlarda daha kısa ve okunabilir fonksiyon tanımlarına izin verdiği için zarif bir tasarım olduğunu düşünüyorum. fn, ad ve tipin atlanabilmesini sağlıyor; kısa anahtar sözcük de fonksiyon tanımının daha kısa olabileceğini gösteriyor.
  • WASM'i hedefleyen modern bir garbage-collected dil çıktığı için heyecan verici. En yakın karşılaştırma muhtemelen Grain olur: https://grain-lang.org/

    • Grain derleyicisinin saf OCaml değil, ReasonML ile yazıldığı söyleniyor. Böyle niş teknolojilerin hiç çekinmeden kat kat üst üste yığılması biraz komik görünüyor.
  • “Tüm dil araç zincirini geliştirmek eskiden birkaç yıldan 10 yıla kadar sürerdi; ancak birikmiş deneyim ve Moonbit’in en başından beri oluşturduğu özel ve güçlü ekip sayesinde bu süreç sadeleştirildi. Moonbit’in 2024’ün 2. çeyreği sonuna kadar beta durumuna ulaşması bekleniyor; bu, nispeten kararlı, daha az hatalı ve Wasm host’larıyla etkileşime giren sağlam bir FFI’a sahip bir aşama anlamına geliyor. Beta kalitesine ulaştığında kaynak kodu açılacak. Stratejik olarak Wasm önerileriyle uyumlu biçimde, Wasm 2.0 için Wasm GC entegrasyonu ve Wasm 1.0 için kendi GC’miz planlanıyor” deniyor
    Bu yüzden şu anda https://github.com/moonbitlang/ boş

  • Buradaki yorumlara bakılırsa Moonbit’te garbage collection var gibi görünüyor. Ama Fibonacci sonucundaki ikili dosya 253 baytsa, muhtemelen GC dahil değildir
    Önerilen WASM yerel GC’yi mi kullanıyor, yoksa derleme sistemi burada gerekli olmadığını anlayıp GC’yi çıkaracak kadar akıllı mı, merak ediyorum

    • Dosyaya sağ tıklayıp sondan bir önceki menü olan Compile to Wat seçilirse WASM metni doğrudan görülebiliyor
      Fibonacci örneğinin çıktısında yalnızca print_i32 import’u, bellek ve fonksiyon tanımları ile _start export’u görünüyor; GC runtime’ının eklenmiş olduğu bir biçim değil
    • Muhtemelen akıllıca atlıyorlar. Çünkü kod boyutu hedeflerinden biri
  • Grain akla geliyor. O da Wasm öncelikli bir programlama dili olduğu için karşılaştırmaya Grain’i eklemek iyi olur
    https://grain-lang.org/

  • About Team bağlantısı Çince bir edu.cn sayfasına gidiyor. Üniversite projesi gibi görünüyor ama emin değilim. Join Us sayfası da Çince ve ana sayfadaki örnek baidu.com’dan JavaScript gerektiriyor gibi görünüyor

    • umatrix eklentisi açıkken de demo hâlâ çalışıyor. Gerekli script’ler unpkg ve msecnd’den (Microsoft alan adı) geliyor; baidu gerekli değil
  • Go’da Fibonacci böyle uygulanmaz

    • Go’yu sevmem ama o benchmark’ın mantıksız olduğunu kabul etmek gerekir. Tail-call optimization desteklemeyen bir dilde tail call kullanırsanız sonuçların kötü çıkması doğaldır
      Deyimsel uygulamaları karşılaştırıp ödünleşimleri ayrıntılı tartışmak yerine birkaç sayı ortaya atmak daha kolay olmuş gibi. Basit bir dil tanıtımı olsa bile insanları yanıltmamak için TCO hakkında bir not eklemek iyi olurdu
    • Zorlama bir örnekte WASM ve Go kullanıp TinyGo’dan bahsetmemek pek dürüst görünmüyor
    • Rust’ta da böyle uygulanmaz. Oldukça kötü bir benchmark. Deneyimime göre sebep tail recursion eksikliği ve switch ifadesi olabilir; Go’da bu yavaş olabiliyor
      Yine de Moonbit’i tanıtan bir teaser olarak fena değil
  • Bu projenin Meta ile bağlantılı olup olmadığını merak ediyorum. Geliştiricisi Hongbo Zhang, Meta’da ReasonML ve Flow gibi açık kaynak programlama dili projelerinde çalışmış; LinkedIn’e göre hâlâ Meta’da çalışıyor