- JavaScript को WebAssembly में compile करने वाला एक टूल, जो standalone WASM binary बनाता है; इस मायने में यह porffor जैसा है। यह Rust में लिखा गया है
- यह एक experimental टूल है, अभी production में इस्तेमाल के लिए तैयार नहीं है, और कई language features तथा built-in types अनुपस्थित हैं या अधूरे हैं
- लक्ष्य language का 100% support हासिल करना है।
Jawsm क्यों?
- Jawsm प्रोजेक्ट की शुरुआत Crowst पर काम करते समय हुई, जो WebAssembly scenarios चलाने के लिए एक stress test टूल है।
- Rust में WASM के लिए compile किया गया code ही supported है, लेकिन Rust कोई व्यापक रूप से इस्तेमाल की जाने वाली language नहीं है।
- scripting language को WASM पर चलाना अभी आदर्श नहीं है। इसके लिए या तो interpreter शामिल करना पड़ता है, या target language का कोई variant इस्तेमाल करना पड़ता है।
- इनका मानना है कि modern WASM proposals के जरिए compiled interpreter के बिना JavaScript features का 100% implementation संभव है।
क्या काम करता है
- लक्ष्य language का 100% implementation है, और फोकस semantics implementation पर है।
- implementation के लिए कठिन 4 चीज़ें: scope/closure, try/catch, async/await, generators।
- फिलहाल Jawsm closure वाले code compilation, try/catch, सीमित
Promise API और async को implement करता है।
- जो features काम करते हैं: variable declaration और assignment,
while, string literals, numbers और basic operators, booleans और basic boolean operators, array literals, object literals, new keyword।
host requirements
- Jawsm हाल की WASM proposals पर बना है, इसलिए generated binaries अलग-अलग runtimes के बीच कम portable हैं।
- इसे WASIp2 को ध्यान में रखकर implement किया जा रहा है, और WASIp2 features के लिए JavaScript polyfill के साथ V8 का उपयोग किया जाता है।
- एक script
run.js उपलब्ध है, जो Jawsm द्वारा बनाए गए binaries चला सकती है।
उपयोग कैसे करें
- जब तक आप contribute नहीं कर रहे, इसे इस्तेमाल न करना ही बेहतर है।
- repository clone करने के बाद
execute.sh script का उपयोग करके WAT file बनाई जा सकती है, उसे binary में compile किया जा सकता है, और फिर Node.js से चलाया जा सकता है।
- Rust का
cargo, wasm-tools का latest version, और Node.js v23.0.0 या उससे ऊपर चाहिए।
अगले कदम
- पहले implementation में कठिन features पूरे करने की योजना है; अगला लक्ष्य generators और
await keyword support है।
- वे stack switching proposal का उपयोग करना चाहते हैं, लेकिन अभी CPS transform का उपयोग करके continuations को simulate कर रहे हैं।
- इसके बाद syntax, built-in types और APIs implement किए जाएंगे।
यह कैसे काम करता है
- यह प्रोजेक्ट JavaScript syntax को WASM instructions में बदलता है, और WASM GC, exception handling, तथा tail-call optimization proposals का उपयोग करता है।
- JavaScript के scope और closures को WASM में simulate करने के लिए अतिरिक्त WASM code लिखा जाता है।
1 टिप्पणियां
Hacker News टिप्पणियाँ
यह नए WASM GC प्रस्ताव का एक चतुर उपयोग है। पहले के JS -> WASM compilers पूरे JS engine को शामिल करते थे, लेकिन यह प्रोजेक्ट JS structures को सीधे WASM primitives पर map करने की कोशिश करता है।
मुझे Rust लिखना पसंद है, लेकिन यह व्यापक रूप से इस्तेमाल की जाने वाली भाषा नहीं है। Rust इन दिनों काफी ध्यान खींच रहा है, और लगता है कि कई जगहों पर इस्तेमाल हो रहा है।
मुझे भरोसा है कि यह JavaScript spec के 100% को cover कर सकता है। ideas, questions या criticism का स्वागत है।
मैंने प्रोजेक्ट का README.md पढ़ा, लेकिन मैं अब भी निश्चित नहीं हूँ कि इसका अपेक्षित उपयोग क्या है। मैं सोच रहा हूँ कि generated WASM code runtime के साथ कैसे interact करता है। क्या यह browser और अन्य WASM runtimes के साथ compatible tool के रूप में सोचा गया है, या केवल प्रोजेक्ट से जुड़े runtime के साथ compatible है?
"browser runtime के बिना JS चलाना" अब करीब आ रहा है। perforr, jaws या कोई और प्रोजेक्ट आखिरकार सफल होगा।
मैं जानना चाहता हूँ कि string encoding mismatch और उससे जुड़ी utilities को कैसे handle किया जाता है। WASM UTF-8 को support करता है और JS (संभवतः invalid) UTF-16 को support करता है।
मुझे यह approach बहुत पसंद है। सीधे binary generate करने की कोशिश करने के बजाय, WASM के लिए सीधे build करना यह मतलब रखता है कि यह WASM GC और WASI 0.3 के हिस्से के रूप में अपेक्षित async support पर निर्भर कर सकता है।
कुछ लोग इसे compiler कह रहे हैं। शानदार काम है।
मैं जानना चाहता हूँ कि क्या यह code, JS में वही code चलाने की तुलना में तेज़ चलता है, या फिर यह दूसरी languages के साथ interoperability के लिए है।