Asm.js का उपयोग करके ब्राउज़र में C ++ कोड कैसे चलाएं?


21

Asm.js एप्लिकेशन बहुत तेज़ है (देशी C ++ गति के पास):

यहाँ छवि विवरण दर्ज करें

http://kripken.github.io/mloc_emscripten_talk/micro4b.png

लेकिन C ++ में किसी एक को लिखना, उसे LLVM कोड में बदलना कैसे संभव है, फिर कुछ ट्रिक emscripten / asm.js के साथ करें? मुझे इसके बारे में कोई ट्यूटोरियल नहीं मिला है।

और अगर मैं सी ++ में कोड लिखता हूं, तो जेएस एपीआई-एस का उपयोग कैसे करें, उदाहरण के लिए XMLHttpRequest, WebSockets, Canvas या WebGL?


3
अपने शोध को साझा करना हर किसी की मदद करता है। हमें बताएं कि आपने क्या प्रयास किया है और यह आपकी आवश्यकताओं को पूरा क्यों नहीं करता है। यह दर्शाता है कि आपने खुद को मदद करने का प्रयास करने के लिए समय लिया है, यह हमें स्पष्ट उत्तरों को दोहराने से बचाता है, और सबसे अधिक यह आपको अधिक विशिष्ट और प्रासंगिक उत्तर प्राप्त करने में मदद करता है। यह भी देखें कैसे पूछें करने के लिए
कुटकी

यह तृतीय-पक्ष ट्यूटोरियल इन कुछ प्रश्नों को संबोधित करता प्रतीत होता है: devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

जवाबों:


36

मेरा मानना ​​है कि आप asm.js की अपनी समझ में गलत हैं ।

सबसे पहले, उनके FAQ से

Q. asm.js एक नई भाषा है?
नहीं, यह सिर्फ (एक उपसमुच्चय) जावास्क्रिप्ट है।

और आपने पूछा स्पष्टीकरण जोड़ा गया है :

लेकिन C ++ में एक [asm.js एप्लीकेशन] लिखना कैसे संभव है

आप "asm.js एप्लिकेशन" नहीं लिखते हैं, बल्कि asm.js आपके C ++ कोड को संकलित करने के लिए एक लक्ष्य 1 है।

जॉन रेजिग का यह लेख कई विवरण प्रदान करता है जो बेहतर तरीके से समझा सकते हैं कि asm.js का उपयोग कैसे किया जाएगा।

इस छवि के साथ शुरू:
C ++ => clang / LLVM => emscripten => JS इंजन

आप देख सकते हैं asm.js का अनुवाद लक्ष्य है कि emscripten । Emscripten जावास्क्रिप्ट में LLVM बाइटकोड का अनुवाद संभालती है , और asm.js जावास्क्रिप्ट का एक सबसेट है। जावास्क्रिप्ट के asm.js प्रतिबंधित सब्मिट के भीतर रहने से कोड को अनुकूलित किया जा सकता है और तेजी से चलाया जा सकता है।

आपने यह भी पूछा:

और अगर मैं सी ++ में कोड लिखता हूं, तो जेएस एपीआई-एस का उपयोग कैसे करें

फिर, आप इस बिंदु को याद कर रहे हैं। Asm.js जावास्क्रिप्ट में मौजूदा C / C ++ अनुप्रयोगों को पोर्ट करने में सक्षम बनाता है ताकि उन्हें एक ब्राउज़र के भीतर चलाया जा सके। आप सामान्य तौर पर अपने C / C ++ कोड में JS APIs का उपयोग नहीं कर पाएंगे, और ऐसा करने के लिए asm.js के बारे में कुछ भी जादुई नहीं है।

यदि आपके पास लिखने के लिए एक नया एप्लिकेशन है जिसे JS APIs की आवश्यकता है, तो आपको JS में एप्लिकेशन लिखना चाहिए और C ++ में लिखने की कोशिश करने और फिर जावास्क्रिप्ट में पोर्ट करने की कोशिश के साथ फ्यूज़ नहीं होना चाहिए।

और Resig के लेख पर वापस जा रहे हैं, आपके प्रश्न के लिए दो महत्वपूर्ण उद्धरण हैं:

इस तरह के अनुप्रयोग जो निकट भविष्य में Asm.js को लक्षित करने जा रहे हैं, वे हैं जो एक ब्राउज़र में चलने की पोर्टेबिलिटी से लाभान्वित होंगे, लेकिन उनमें जटिलता का एक स्तर है जिसमें जावास्क्रिप्ट के लिए एक सीधा पोर्ट संभव नहीं होगा

तथा

जैसा कि आप शायद ऊपर के कोड से देख सकते हैं Asm.js को हाथ से लिखे जाने के लिए डिज़ाइन नहीं किया गया है। ... अभी Asm.js के लिए सबसे आम उपयोग मामला C / C ++ से जावास्क्रिप्ट में संकलित अनुप्रयोगों में है। इनमें से लगभग कोई भी एप्लिकेशन वेबलॉग और लाइक का उपयोग करने से परे, सार्थक तरीके से DOM के साथ बातचीत नहीं करता है।

इसके बजाय आप जो करने पर विचार करना चाहते हैं, वह एक जावास्क्रिप्ट प्रोग्राम हो सकता है जो जेएस एपीआई को कॉल करता है जिसे आपको सी ++ को कॉल करने के साथ-साथ जावास्क्रिप्ट की आवश्यकता होती है। जावास्क्रिप्ट से C ++ कोड को कॉल करने के तरीके को देखने के लिए इस emscripten ट्यूटोरियल पर एक नज़र डालें ।


कुछ अतिरिक्त शोध के लिए, एम्सस्क्रिप्टेन के पास एक ट्यूटोरियल है जो आपको यह समझने में मदद कर सकता है कि सी ++ कोड कैसे लिया जाए, इसे एलएलवीएम के माध्यम से चलाएं और फिर asm.js. पर लक्षित करें।

1 कड़ाई से बोलना, यह सच नहीं है। C / C ++ कोड इस बात से अनजान है कि यह किसके संकलित होने वाला है, इसलिए मैं वास्तव में asm.js को लक्ष्य नहीं कह सकता। एक अन्य उपकरण (ईमस्क्रिप्टेन) LLVM आउटपुट लेता है और फिर asm.js के अनुरूप जावास्क्रिप्ट में अनुवाद करता है। लेकिन मैं इसे एक लक्ष्य कहने जा रहा हूं क्योंकि इसे समझना आसान है।


ASM.js C / C ++ का संकलन लक्ष्य है। तो आपका कोई नहीं लिख रहा है + + asm.js में अपने संकलन C ++ को asm.js पर लिख रहा है
केल्विन

स्क्रैच से शुरू किए गए अनुप्रयोगों के लिए केवल एक उल्लेख दिमाग में आता है। खेलों के मामले में, C ++ में कोड होने से कई प्लेटफार्मों पर तैनाती के लिए मददगार हो सकता है।
व्लाद निकुला

6

हां, आप C ++ कोड लिख सकते हैं और इसे emscripten का उपयोग करके asm.js पर संकलित कर सकते हैं। मैंने खुद इसकी कोशिश नहीं की है, और मुझे यकीन नहीं है कि यह प्राइम टाइम के लिए कितना तैयार है। यह खेल का एक गुच्छा चलाने के लिए काफी अच्छा लगता है।

यहाँ एक ट्यूटोरियल है: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html । ट्यूटोरियल को देखते हुए, C ++ कोड को संकलित करना काफी आसान लगता है:

// hello.cpp
#include<stdio.h>

int main() {
  printf("hello, world!\n");
  return 1;
}
$ ./emcc tests/hello.cpp -o hello.html

4
वह वास्तव में सी कोड है। C ++ संकलक परिमाण के दो या तीन आदेशों के बारे में अधिक जटिल है। सौभाग्य से, emscripten LLVM को संकलित करके उस कठिन समस्या से बचता है, और एक मौजूदा C ++ - to-LLVM कंपाइलर है।
एमएसलटर्स

3
@MSalters: यह मान्य C ++ कोड भी है। कल्पना करो कि! वाह!
थॉमस एडिंग

@ThomasEding: आप इस बिंदु से चूक गए। जितनी छोटी भाषा का आपको समर्थन करना है, उस भाषा को संकलित करना उतना ही आसान है। C और C ++ का प्रतिच्छेदन आवश्यक रूप से उन दोनों में से बड़ा नहीं है।
एमएसल्टर्स

मान लेते हैं कि यह कोड शुद्ध C ++ था, जो C संकलक संभाल नहीं सकता, क्या इसका उपयोग emccमान्य होगा?
हमजा औघड़

@ HamzaOuaghad - हाँ। C ++ के cout और string classes के साथ एक साधारण हैलो वर्ल्ड इस emcc कमांड लाइन के साथ ठीक काम करता है। संस्करण का उपयोग कर 1.35.0।
ओरियन एल्जेनिल

0

WCPP का उपयोग करने का सबसे आसान तरीका एक पैकेज है, जो आपको C ++ को सीधे अपने नोड प्रोजेक्ट में आयात करने देता है।

हमारे सी ++

// addTwo.cpp 

export int addTwo(int a, int b) {
  return a + b;
}

टर्मिनल में (हमारे C ++ को संकलित करने के लिए)

$ wcpp

हमारे जावास्क्रिप्ट

const ourModule = await require('wcpp')('./addTwo.cpp')

console.log(ourModule.addTwo(2, 3))

अधिक जानकारी के लिए, एनपीएम पैकेज या गिट रेपो देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.