Swift डेवलपर्स के लिए WebAssembly का परिचय
\n\nWebAssembly (Wasm) एक निम्न-स्तरीय बाइनरी निर्देश है जो एक पृथक वर्चुअल मशीन में चलता है। iOS/macOS पर Swift डेवलपर के लिए, Wasm एकीकरण नए क्षितिज खोलता है: अन्य भाषाओं से कोड स्थानांतरण, तृतीय-पक्ष लाइब्रेरी के लिए सैंडबॉक्स, और देशी कोड के बिना उच्च-प्रदर्शन गणना चलाना। इस लेख में, हम Swift में WebAssembly के साथ काम करने की उन्नत तकनीकों पर चर्चा करेंगे: संकलन से लेकर सीधे मेमोरी प्रबंधन और फ़ंक्शन कॉल तक।
\n\nबुनियादी ट्यूटोरियल के विपरीत, हम वास्तविक कार्यों पर ध्यान केंद्रित करेंगे: जटिल डेटा प्रकारों का स्थानांतरण, मैन्युअल रूप से मेमोरी प्रबंधन, और प्रदर्शन अनुकूलन। यह माना जाता है कि आप Swift की मूल बातें और WebAssembly की बुनियादी अवधारणा से पहले से परिचित हैं।
\n\nSwift के लिए WebAssembly में कोड संकलन
\n\nउपकरण और सेटअप
\n\nतृतीय-पक्ष कोड (C/C++/Rust) को Wasm में संकलित करने के लिए Emscripten या wasm-pack (Rust के लिए) का उपयोग करें। शुद्ध Swift के लिए SwiftWasm प्रोजेक्ट है, लेकिन यह सीमित है। अक्सर, आप तैयार मॉड्यूल को एकीकृत करेंगे।
\n\nWasm में एक सरल C फ़ंक्शन को संकलित करने का उदाहरण:
\n\n// math.c\nint add(int a, int b) {\n return a + b;\n}\n\n\nकमांड:
\n\nemcc math.c -o math.wasm -s WASM=1 -s EXPORTED_FUNCTIONS='["_add"]' -Os\n\n\nमुख्य फ़्लैग: EXPORTED_FUNCTIONS — निर्दिष्ट करता है कि कौन से फ़ंक्शन निर्यात किए जाएं, -Os — आकार के लिए अनुकूलन। परिणामी math.wasm Swift में लोड करने के लिए तैयार है।
Swift में मॉड्यूल लोड करना
\n\niOS/macOS पर Wasm के साथ काम करने के लिए WasmKit या WKWebView का उपयोग करें। आइए उन्नत विकल्प पर विचार करें — सीधे मेमोरी प्रबंधन के साथ WasmKit।
\n\nimport WasmKit\n\nguard let wasmData = try? Data(contentsOf: URL(fileURLWithPath: "math.wasm")) else {\n fatalError("wasm लोड करने में विफल")\n}\n\nlet module = try WasmModule(data: wasmData)\nlet engine = WasmEngine()\nlet instance = try engine.instantiate(module: module)\n\n// निर्यातित फ़ंक्शन प्राप्त करें\nguard let addFunc = instance.export("add")?.function else {\n fatalError("फ़ंक्शन add नहीं मिला")\n}\n\n\nध्यान दें: WasmKit को आयात और मेमोरी के मैन्युअल प्रबंधन की आवश्यकता होती है। यह पूर्ण नियंत्रण देता है, लेकिन जटिलता बढ़ाता है।
सीधे मेमोरी के साथ कार्य: ऐरे और स्ट्रिंग का स्थानांतरण
\n\nWasm की रैखिक मेमोरी
\n\nWebAssembly रैखिक मेमोरी (linear memory) का उपयोग करता है — बाइट्स की एक सपाट सरणी। जटिल संरचनाओं (ऐरे, स्ट्रिंग) को स्थानांतरित करने के लिए, आपको Wasm के अंदर मेमोरी आवंटित करनी होगी और डेटा कॉपी करना होगा।
\n\nएक उदाहरण पर विचार करें: Swift से Wasm फ़ंक्शन में पूर्णांकों की एक सरणी स्थानांतरित करना जो योग की गणना करता है।
\n\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\nmalloc और free के निर्यात के साथ संकलित करें:
emcc sum_array.c -o sum_array.wasm -s WASM=1 -s EXPORTED_FUNCTIONS='["_sum_array", "_malloc", "_free"]' -s ALLOW_MEMORY_GROWTH=1\n\n\nSwift में, मेमोरी आवंटित करें, डेटा कॉपी करें और फ़ंक्शन को कॉल करें:
\n\nlet numbers = [10, 20, 30, 40, 50]\nlet count = numbers.count\n\n// ऐरे के लिए मेमोरी आवंटित करें (प्रति int 4 बाइट्स)\nguard let mallocFunc = instance.export("malloc")?.function else { return }\nlet ptrResult = mallocFunc.call(Int32(count * MemoryLayout<Int32>.size))\nguard let ptr = ptrResult?.i32 else { return }\n\n// Wasm मेमोरी में डेटा कॉपी करें\nlet memory = instance.memory!\nfor i in 0..<count {\n let offset = ptr + Int32(i * MemoryLayout<Int32>.size)\n memory.store(offset: Int(offset), value: Int32(numbers[i]))\n}\n\n// sum_array को कॉल करें\nguard let sumArrayFunc = instance.export("sum_array")?.function else { return }\nlet result = sumArrayFun