- 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
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.
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.rbiçin sonuçlar olup olmadığını merak ediyorum. README'de bu ilerlemeyi göstermek güzel olurdu. Harika bir proje.Projenin
README.mddosyası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."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.