WebAssembly और Node.js में इसकी भूमिका का परिचय
\n\nWebAssembly (WASM) एक निम्न-स्तरीय बाइनरी निर्देश प्रारूप है जो लगभग देशी प्रदर्शन के साथ वर्चुअल मशीन में निष्पादित होता है। Node.js इकोसिस्टम में, WebAssembly नए क्षितिज खोलता है: यह C, C++, Rust या Go में लिखे गए कोड को सीधे सर्वर वातावरण में चलाने की अनुमति देता है। यह विशेष रूप से उन कार्यों के लिए प्रासंगिक है जिनमें उच्च प्रदर्शन की आवश्यकता होती है: इमेज प्रोसेसिंग, क्रिप्टोग्राफी, डेटा पार्सिंग, बड़े संख्या सरणियों के साथ काम करना।
\n\nइस लेख में, हम Node.js में WebAssembly के साथ काम करने के पूरे चक्र को कवर करेंगे: स्रोत कोड के संकलन से लेकर JavaScript एप्लिकेशन में तैयार मॉड्यूल के एकीकरण तक।
\n\nमूल अवधारणाएँ और वातावरण तैयार करना
\n\nशुरू करने से पहले क्या जानना चाहिए
\nWebAssembly मॉड्यूल एक बाइनरी फ़ाइल है जिसका एक्सटेंशन .wasm है। इसकी DOM या फ़ाइल सिस्टम तक सीधी पहुँच नहीं है - सभी इंटरैक्शन "आयातित फ़ंक्शन" के माध्यम से होते हैं जिन्हें आप JavaScript से पास करते हैं। Node.js में, यह सीमा विशेष रैपरों की मदद से हटा दी जाती है।
उपकरण स्थापित करना
\nकोड को WASM में कंपाइल करने के लिए हमें Emscripten SDK की आवश्यकता है। Linux/macOS पर स्थापना:
\ngit clone https://github.com/emscripten-core/emsdk.git\ncd emsdk\n./emsdk install latest\n./emsdk activate latest\nsource ./emsdk_env.sh\n\nRust प्रोजेक्ट्स के लिए, wasm-pack का उपयोग करें:
npm install -g wasm-pack\n\nपहला WASM मॉड्यूल बनाना और कंपाइल करना
\n\nC में उदाहरण - जोड़ फ़ंक्शन
\nआइए C में एक सरल फ़ंक्शन बनाएँ जो दो संख्याओं को जोड़ता है:
\n// math.c\n#include <emscripten.h>\n\nEMSCRIPTEN_KEEPALIVE\nint add(int a, int b) {\n return a + b;\n}\n\nEMSCRIPTEN_KEEPALIVE\nint multiply(int a, int b) {\n return a * b;\n}\n\nEmscripten का उपयोग करके WASM में कंपाइल करें:
\nemcc math.c -o math.js -s EXPORTED_FUNCTIONS="['_add', '_multiply']" -s WASM=1 -s MODULARIZE=1 -s EXPORT_NAME="createMathModule"\n\nआउटपुट में हमें दो फ़ाइलें मिलती हैं: math.wasm और math.js - लोड करने के लिए एक रैपर।
Node.js में मॉड्यूल लोड करना
\nअब JavaScript में मॉड्यूल का उपयोग करें:
\n// index.js\nconst createMathModule = require('./math.js');\n\ncreateMathModule().then(module => {\n const add = module._add;\n const multiply = module._multiply;\n\n console.log('5 + 3 =', add(5, 3)); // 8\n console.log('4 * 7 =', multiply(4, 7)); // 28\n});\n\nचलाएँ:
\nnode index.js\n\nमेमोरी और जटिल डेटा प्रकारों के साथ काम करना
\n\nस्ट्रिंग और ऐरे पास करना
\nWASM केवल संख्याओं के साथ काम करता है। स्ट्रिंग या ऐरे पास करने के लिए, मॉड्यूल की रैखिक मेमोरी में मेमोरी आवंटित करनी होती है। आइए C में एक उदाहरण देखें जो एक स्ट्रिंग लेता है और उसकी लंबाई लौटाता है:
\n// string_ops.c\n#include <string.h>\n#include <emscripten.h>\n\nEMSCRIPTEN_KEEPALIVE\nint string_length(char* str) {\n return strlen(str);\n}\n\nEMSCRIPTEN_KEEPALIVE\nvoid to_upper(char* str) {\n for (int i = 0; str[i]; i++) {\n if (str[i] >= 'a' && str[i] <= 'z') {\n str[i] -= 32;\n }\n }\n}\n\nकंपाइल करें:
\nemcc string_ops.c -o string_ops.js -s EXPORTED_FUNCTIONS="['_string_length', '_to_upper']" -s WASM=1 -s MODULARIZE=1 -s EXPORT_NAME="createStringModule"\n\nमेमोरी के साथ काम करने के लिए JavaScript कोड:
\nconst createStringModule = require('./string_ops.js');\n\ncreateStringModule().then(module => {\n const { _string_length, _to_upper, heap } = module;\n \n // स्ट्रिंग के लिए मेमोरी आवंटित करें\n const input = "hello world";\n const ptr = module._malloc(input.length + 1);\n \n // स्ट्रिंग को WASM मेमोरी में कॉपी करें\n for (let i = 0; i < input.length; i++) {\n heap[i + ptr] = input.charCodeAt(i);\n }\n heap[ptr + input.len