Node.js में WebAssembly और JavaScript के साथ उन्नत तकनीकें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Node.js में WebAssembly और JavaScript के साथ उन्नत कार्य का परिचय

\n\n

WebAssembly (Wasm) अब केवल ब्राउज़रों के लिए एक विदेशी तकनीक नहीं रह गई है। Node.js इकोसिस्टम में, यह C/C++, Rust या Go में लिखे गए हाई-परफॉरमेंस कंप्यूटेशन को न्यूनतम ओवरहेड के साथ निष्पादित करने की अनोखी क्षमता प्रदान करता है। उन्नत स्तर पर, Node.js में Wasm के साथ काम करने के लिए मेमोरी मैनेजमेंट, एसिंक्रोनस कॉल और रनटाइम के बीच डेटा ट्रांसफर ऑप्टिमाइज़ेशन की गहरी समझ आवश्यक है। इस लेख में, हम Node.js का उपयोग करके WebAssembly को JavaScript के साथ इंटीग्रेट करने के व्यावहारिक उदाहरणों पर चर्चा करेंगे।

\n\n

1. Node.js में Wasm मॉड्यूल का कंपाइलेशन और लोडिंग

\n\n

Wasm फ़ाइल तैयार करना

\n

शुरुआत में हमें एक कंपाइल किया हुआ Wasm मॉड्यूल चाहिए। मान लीजिए, हमारे पास C में एक सरल फंक्शन है जो दो संख्याओं को जोड़ता है:

\n\n
// sum.c\nint add(int a, int b) {\n    return a + b;\n}
\n\n

Emscripten या wasm-pack का उपयोग करके कंपाइल करें:

\n
emcc sum.c -O3 -o sum.wasm --no-entry -s EXPORTED_FUNCTIONS="['_add']"
\n\n

Node.js में मॉड्यूल लोड करना

\n

Node.js में, हम Wasm मॉड्यूल को दो तरीकों से लोड कर सकते हैं: सिंक्रोनस readFileSync या एसिंक्रोनस WebAssembly.instantiate के माध्यम से। आइए इम्पोर्ट के साथ उन्नत एसिंक्रोनस विकल्प देखें:

\n\n
const fs = require('fs');\nconst path = require('path');\n\nasync function loadWasmModule(filePath, imports = {}) {\n    const wasmBuffer = fs.readFileSync(path.resolve(filePath));\n    const result = await WebAssembly.instantiate(wasmBuffer, imports);\n    return result.instance;\n}\n\n(async () => {\n    const instance = await loadWasmModule('./sum.wasm');\n    const { add } = instance.exports;\n    console.log('परिणाम:', add(5, 7)); // 12\n})();
\n\n

यहाँ imports एक ऑब्जेक्ट है जिसमें Wasm से कॉल किए जाने वाले JavaScript फंक्शन हो सकते हैं (जैसे, लॉगिंग या मेमोरी के साथ काम करने के लिए)।

\n\n

2. मेमोरी मैनेजमेंट: Wasm की लीनियर मेमोरी के साथ काम करना

\n\n

Wasm के साथ उन्नत कार्य की प्रमुख चुनौतियों में से एक लीनियर मेमोरी का प्रबंधन है। Wasm मॉड्यूल की अपनी अलग मेमोरी (ArrayBuffer) होती है, जिसे JavaScript instance.exports.memory के माध्यम से सीधे एक्सेस कर सकता है। आइए एक उदाहरण देखें जहां हम JS से Wasm में संख्याओं की एक सरणी भेजते हैं, उसे प्रोसेस करते हैं और परिणाम वापस प्राप्त करते हैं।

\n\n

उदाहरण: C में सरणी का योग

\n
// sum_array.c\nint sum_array(int* arr, int len) {\n    int sum = 0;\n    for(int i = 0; i < len; i++) {\n        sum += arr[i];\n    }\n    return sum;\n}
\n\n

मेमोरी एक्सपोर्ट के साथ कंपाइल करें:

\n
emcc sum_array.c -O3 -o sum_array.wasm --no-entry \\\n  -s EXPORTED_FUNCTIONS="['_sum_array']" \\\n  -s EXPORTED_RUNTIME_METHODS="['cwrap', 'getValue']"
\n\n

डेटा ट्रांसफर के लिए JavaScript कोड

\n
async function sumArrayWithWasm(numbers) {\n    const instance = await loadWasmModule('./sum_array.wasm');\n    const memory = instance.exports.memory;\n    const sumArray = instance.exports.sum_array;\n\n    // सरणी के लिए मेमोरी आवंटित करें (प्रति int 4 बाइट्स)\n    const bytesPerElement = 4;\n    const offset = instance.exports.malloc ? \n                   instance.exports.malloc(numbers.length * bytesPerElement) : \n                   0; // यदि malloc नहीं है, तो फिक्स्ड एड्रेस का उपयोग करें\n\n    // डेटा लिखने के लिए Uint32Array बनाएं\n    const buffer = new Uint32Array(memory.buffer, offset, numbers.length);\n    buffer.set(numbers);\n\n    // Wasm फंक्शन को कॉल करें\n    const result = sumArray(offset, numbers.length);\n\n    // मेमोरी मुक्त करें (यदि free उपलब्ध है)\n    if (instance.exports.free) {\n        instance.exports.free(offset);\n    }\n\n    return result;\n}\n\n(async () => {\n    const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n    const sum = await sumArrayWithWasm(arr);\n    console.log('सरणी का योग:', sum); // 55                

ब्लॉग

पुस्तक अनुशंसाएँ