WebAssembly और Swift का उन्नत स्तर पर परिचय
\n\nWebAssembly (Wasm) एक निम्न-स्तरीय बाइनरी इंस्ट्रक्शन फॉर्मेट है, जिसे ब्राउज़र और सर्वर पर नेटिव के करीब प्रदर्शन के साथ चलाने के लिए डिज़ाइन किया गया है। iOS और macOS पर काम करने वाले Swift डेवलपर्स के लिए, Wasm एकीकरण उच्च-प्रदर्शन वाली गणनाओं (क्रिप्टोग्राफी, इमेज प्रोसेसिंग, सिमुलेशन) को वेब वातावरण से नेटिव ऐप्स में स्थानांतरित करने की संभावनाएं खोलता है। इस लेख में, हम उन्नत तकनीकों पर चर्चा करेंगे: Swift से Wasm फ़ंक्शंस को सीधे कॉल करना, Wasm की लीनियर मेमोरी के माध्यम से मेमोरी प्रबंधन, ABI (एप्लिकेशन बाइनरी इंटरफ़ेस) अनुकूलन और जटिल डेटा प्रकारों को संभालना।
\n\nयह माना जाता है कि आप Swift की मूल बातों से परिचित हैं और आपको C/C++ कोड को Wasm में कंपाइल करने का अनुभव है (जैसे, Emscripten या wasi-sdk के माध्यम से)। हम Swift (iOS/macOS) और कंपाइल किए गए Wasm मॉड्यूल के बीच संबंध पर ध्यान केंद्रित करेंगे, न्यूनतम निर्भरता का उपयोग करते हुए - केवल Foundation की मानक लाइब्रेरी और मेमोरी के साथ काम करने के लिए Swift की बुनियादी क्षमताएं।
\n\n1. C/C++ कोड को WebAssembly में कंपाइल करना और ABI तैयार करना
\n\nपहला कदम - स्पष्ट रूप से परिभाषित ABI के साथ Wasm मॉड्यूल तैयार करना। Swift के लिए यह महत्वपूर्ण है कि एक्सपोर्ट किए गए फ़ंक्शंस में फ्लैट सिग्नेचर हों (केवल संख्याएं: i32, i64, f32, f64) और वे जटिल स्ट्रक्चर का उपयोग न करें। नीचे एक ऐरे का योग निकालने के लिए C फ़ंक्शन का उदाहरण दिया गया है:
\n\n// sum.c\n#include <stdint.h>\n\nint32_t sum_array(int32_t* arr, int32_t len) {\n int32_t sum = 0;\n for (int32_t i = 0; i < len; i++) {\n sum += arr[i];\n }\n return sum;\n}\n\n// Wasm के अंदर मेमोरी आवंटित करने का फ़ंक्शन\nint32_t* allocate_array(int32_t size) {\n return (int32_t*)malloc(size * sizeof(int32_t));\n}\n\n\nwasi-sdk (Wasm के लिए CLang) का उपयोग करके कंपाइल करें:
\n\nclang \\\n --target=wasm32-wasi \\\n -O3 \\\n -nostartfiles \\\n -Wl,--export=sum_array \\\n -Wl,--export=allocate_array \\\n -Wl,--export=__heap_base \\\n -o sum.wasm sum.c\n\n\nफ़्लैग --export स्पष्ट रूप से एक्सपोर्ट किए जाने वाले फ़ंक्शंस को निर्दिष्ट करता है। __heap_base Wasm का एक मानक सिंबल है, जो हीप की शुरुआत को इंगित करता है, Swift से मेमोरी प्रबंधन के लिए आवश्यक है।
2. Swift में Wasm मॉड्यूल लोड करना और फ़ंक्शंस को निष्पादित करना
\n\niOS/macOS पर Swift में Wasm के साथ काम करने के लिए, हम WebKit फ्रेमवर्क (WKWebView) या JavaScriptCore मॉड्यूल के माध्यम से निम्न-स्तरीय C API का उपयोग करते हैं। हालांकि, बिना UI के शुद्ध Swift समाधान के लिए, SwiftWasm से WasmInterpreter लाइब्रेरी का उपयोग करना अधिक सुविधाजनक है (SPM के माध्यम से उपलब्ध)। आइए JavaScriptCore का उपयोग करने वाले विकल्प पर विचार करें - यह iOS/macOS में अंतर्निहित है।
2.1. इनिशियलाइज़ेशन और बाइनरी फ़ाइल लोड करना
\n\nimport JavaScriptCore\n\nclass WasmEngine {\n private let context: JSContext\n\n init?(wasmData: Data) {\n guard let ctx = JSContext() else { return nil }\n self.context = ctx\n\n // WebAssembly ऑब्जेक्ट बनाएं\n let wasmObj = ctx.evaluateScript("WebAssembly")\n guard let wasm = wasmObj else { return nil }\n\n // मॉड्यूल कंपाइल करें\n let compileFunc = wasm.objectForKeyedSubscript("compile")\n guard let compile = compileFunc else { return nil }\n\n let promise = compile.call(withArguments: [wasmData])\n // प्रॉमिस को हैंडल करें (प्रदर्शन के लिए सरलीकृत)\n context.evaluateScript("""\n var wasmModule = null;\n \\(promise?.toString() ?? "").then(m => { wasmModule = m; });\n """)\n }\n\n func callFunction(name: String, args: [JSValue]) -> JSValue? {\n let instance = context.objectForKeyedSubscript("wasmModule")\n let exports = instance?.objectForKeyedSubscript("exports")\n let funcToCall = exports?.objectForKeyedSubscript(name)\n return funcToCall?.call(withArguments: args)\n }\n}\n\n\nमहत्वपूर्ण: यह कोड सरलीकृत है। वास्तविक प्रोजेक्ट में, JSVirtualMachine का उपयोग करें और प्रॉमिस को ठीक से हैंडल करें।