2 puan yazan GN⁺ 2024-11-11 | 1 yorum | WhatsApp'ta paylaş
  • JavaScript’i WebAssembly’ye derleyen bir araçtır; bağımsız çalıştırılabilir WASM ikili dosyaları üretmesi bakımından porffor’a benzer. Rust ile yazılmıştır
  • Deneysel bir araçtır; henüz prodüksiyonda kullanıma hazır değildir ve birçok dil özelliği ile yerleşik tür eksik ya da tamamlanmamıştır
  • Hedef, dilin %100 desteğine ulaşmaktır.

Neden Jawsm?

  • Jawsm projesi, WebAssembly senaryolarını çalıştıran bir stres testi aracı olan Crowst üzerinde çalışılırken başladı.
  • Yalnızca Rust’tan WASM’a derlenmiş kod destekleniyor, ancak Rust yaygın kullanılan bir dil değil.
  • Betik dillerini WASM üzerinde çalıştırmak şu anda ideal değil. Ya bir yorumlayıcıyı dahil etmek ya da hedef dilin değiştirilmiş bir türevini kullanmak gerekiyor.
  • Modern WASM önerileriyle, derlenmiş bir yorumlayıcı olmadan JavaScript özelliklerinin %100 uygulanmasının mümkün olduğuna inanılıyor.

Çalışanlar

  • Amaç, dilin %100’ünü uygulamak ve şu anda anlamsal yapının uygulanmasına odaklanılıyor.
  • Uygulaması zor olan 4 madde: scope/closure, try/catch, async/await, generator’lar.
  • Jawsm şu anda closure kullanan kodların derlenmesini, try/catch’i, sınırlı Promise API’sini ve asynci uyguluyor.
  • Çalışan özellikler: değişken bildirimi ve atama, while, string literal’ları, sayılar ve temel operatörler, boolean’lar ve temel boolean operatörleri, dizi literal’ları, nesne literal’ları, new anahtar sözcüğü.

Host gereksinimleri

  • Jawsm, yeni WASM önerileri üzerine inşa edilmiştir; bu yüzden üretilen ikili dosyalar çalışma zamanları arasında çok taşınabilir değildir.
  • Uygulama WASIp2 düşünülerek geliştiriliyor ve WASIp2 işlevleri için JavaScript polyfill’leriyle birlikte V8 kullanılıyor.
  • Jawsm’in ürettiği ikili dosyaları çalıştırabilen run.js betiği bulunuyor.

Nasıl kullanılır

  • Katkı vermeyecekseniz kullanmamanız önerilir.
  • Depoyu clone ettikten sonra execute.sh betiğiyle WAT dosyası üretilebilir, ikiliye derlenebilir ve ardından Node.js ile çalıştırılabilir.
  • Rust’ın cargo aracı, güncel wasm-tools sürümü ve Node.js v23.0.0 veya üzeri gereklidir.

Sonraki adımlar

  • Önce uygulanması zor özelliklerin tamamlanması planlanıyor; sıradaki hedefler generator’lar ve await anahtar sözcüğü desteği.
  • Stack switching önerisini kullanmak isteniyor, ancak şu anda devamlılığı simüle etmek için CPS dönüşümü kullanılıyor.
  • Daha sonra sözdizimi ile yerleşik türler ve API’ler uygulanacak.

Nasıl çalışır

  • Proje, JavaScript sözdizimini WASM komutlarına dönüştürüyor ve WASM GC, exception handling ve tail call optimization önerilerinden yararlanıyor.
  • JavaScript’in scope ve closure yapısını WASM içinde simüle etmek için ek WASM kodu yazılıyor.

1 yorum

 
GN⁺ 2024-11-11
Hacker News görüşleri
  • Bu, yeni WASM GC önerisinin akıllıca bir kullanım biçimi. Mevcut JS -> WASM derleyicileri tüm JS motorunu içeri alıyordu, ancak bu proje JS yapılarını doğrudan WASM temel öğelerine eşlemeye çalışıyor.

    • Geçmişte neredeyse TypeScript'e yakın bir ARM gömülü derleyici yapmıştım. Bazı teknikler faydalı olabilir.
  • Rust yazmayı seviyorum, ancak yaygın olarak kullanılan bir dil değil. Rust bugünlerde çok ilgi görüyor ve çeşitli yerlerde kullanılıyor gibi görünüyor.

  • JavaScript spesifikasyonunun %100'ünü kapsayabileceğinden eminim. Fikirler, sorular veya eleştiriler memnuniyetle karşılanır.

    • test262_runner.rb için sonuçlar olup olmadığını merak ediyorum. README'de bu ilerlemeyi göstermek güzel olurdu. Harika bir proje.
  • Projenin README.md dosyasını okudum, ancak beklenen kullanımın ne olduğundan emin olamadım. Üretilen WASM kodunun runtime ile nasıl etkileşime girdiğini merak ediyorum. Bunun tarayıcı ve diğer WASM runtime'larıyla uyumlu bir araç olarak mı tasarlandığını, yoksa yalnızca projeye bağlı runtime ile mi uyumlu olduğunu merak ediyorum.

    • JavaScript kodu içinde web API'leri veya yalnızca belirli ortamlarda tanımlı global tanımlayıcılarla karşılaştığında nasıl tepki verdiğini merak ediyorum. Eğer o ortam için değilse, bunu kullanırken I/O'nun nasıl yapılacağını da merak ediyorum.
  • "Tarayıcı runtime'ı olmadan JS çalıştırma" yaklaşıyor. perforr, jaws ya da başka bir proje sonunda başarılı olacak.

  • String encoding uyumsuzluklarının ve ilgili yardımcı araçların nasıl ele alındığını merak ediyorum. WASM UTF-8'i destekliyor, JS ise (potansiyel olarak hatalı) UTF-16'yı destekliyor.

  • Bu yaklaşımı gerçekten çok beğendim. Doğrudan binary üretmeye çalışmak yerine doğrudan WASM için derlemek, bunun WASM GC'ye ve WASI 0.3'ün bir parçası olarak beklenen asenkron desteğe dayanabileceği anlamına geliyor.

  • Bazı insanlar buna derleyici diyor. Harika iş.

  • Bu kodun, aynı kodu JS'te çalıştırmaktan daha hızlı çalışıp çalışmadığını, yoksa bunun diğer dillerle birlikte çalışabilirlik için mi olduğunu merak ediyorum.