WebAssembly और Swift: iOS/macOS पर उन्नत एकीकरण

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

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

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

Swift डेवलपर्स के लिए WebAssembly का परिचय

\n\n

WebAssembly (Wasm) एक निम्न-स्तरीय बाइनरी निर्देश है जो एक पृथक वर्चुअल मशीन में चलता है। iOS/macOS पर Swift डेवलपर के लिए, Wasm एकीकरण नए क्षितिज खोलता है: अन्य भाषाओं से कोड स्थानांतरण, तृतीय-पक्ष लाइब्रेरी के लिए सैंडबॉक्स, और देशी कोड के बिना उच्च-प्रदर्शन गणना चलाना। इस लेख में, हम Swift में WebAssembly के साथ काम करने की उन्नत तकनीकों पर चर्चा करेंगे: संकलन से लेकर सीधे मेमोरी प्रबंधन और फ़ंक्शन कॉल तक।

\n\n

बुनियादी ट्यूटोरियल के विपरीत, हम वास्तविक कार्यों पर ध्यान केंद्रित करेंगे: जटिल डेटा प्रकारों का स्थानांतरण, मैन्युअल रूप से मेमोरी प्रबंधन, और प्रदर्शन अनुकूलन। यह माना जाता है कि आप Swift की मूल बातें और WebAssembly की बुनियादी अवधारणा से पहले से परिचित हैं।

\n\n

Swift के लिए WebAssembly में कोड संकलन

\n\n

उपकरण और सेटअप

\n\n

तृतीय-पक्ष कोड (C/C++/Rust) को Wasm में संकलित करने के लिए Emscripten या wasm-pack (Rust के लिए) का उपयोग करें। शुद्ध Swift के लिए SwiftWasm प्रोजेक्ट है, लेकिन यह सीमित है। अक्सर, आप तैयार मॉड्यूल को एकीकृत करेंगे।

\n\n

Wasm में एक सरल C फ़ंक्शन को संकलित करने का उदाहरण:

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

कमांड:

\n\n
emcc math.c -o math.wasm -s WASM=1 -s EXPORTED_FUNCTIONS='["_add"]' -Os\n
\n\n

मुख्य फ़्लैग: EXPORTED_FUNCTIONS — निर्दिष्ट करता है कि कौन से फ़ंक्शन निर्यात किए जाएं, -Os — आकार के लिए अनुकूलन। परिणामी math.wasm Swift में लोड करने के लिए तैयार है।

\n\n

Swift में मॉड्यूल लोड करना

\n\n

iOS/macOS पर Wasm के साथ काम करने के लिए WasmKit या WKWebView का उपयोग करें। आइए उन्नत विकल्प पर विचार करें — सीधे मेमोरी प्रबंधन के साथ WasmKit।

\n\n
import 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\n

सीधे मेमोरी के साथ कार्य: ऐरे और स्ट्रिंग का स्थानांतरण

\n\n

Wasm की रैखिक मेमोरी

\n\n

WebAssembly रैखिक मेमोरी (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\n

malloc और free के निर्यात के साथ संकलित करें:

\n\n
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\n

Swift में, मेमोरी आवंटित करें, डेटा कॉपी करें और फ़ंक्शन को कॉल करें:

\n\n
let 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                

ब्लॉग

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