วิธีการเรียกใช้รหัส C ++ ในเบราว์เซอร์โดยใช้ asm.js?


21

แอปพลิเคชัน asm.js นั้นเร็วมาก (ใกล้กับความเร็ว C ++ ดั้งเดิม):

ป้อนคำอธิบายรูปภาพที่นี่

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

แต่มันเป็นไปได้อย่างไรที่จะเขียนมันใน C ++, แปลงเป็นรหัส LLVM, แล้วใช้เล่ห์เหลี่ยมกับ emscripten / asm.js? ฉันไม่พบบทช่วยสอนเกี่ยวกับเรื่องนี้

และถ้าฉันเขียนโค้ดใน C ++ แล้วจะใช้ js API-s เช่น XMLHttpRequest, WebSockets, Canvas หรือ WebGL ได้อย่างไร


3
การแชร์งานวิจัยของคุณช่วยให้ทุกคน บอกเราว่าคุณได้ลองทำอะไรและทำไมมันถึงไม่ตรงกับความต้องการของคุณ สิ่งนี้แสดงให้เห็นว่าคุณใช้เวลาในการพยายามช่วยตัวเองมันช่วยให้เราไม่ต้องย้ำคำตอบที่ชัดเจนและส่วนใหญ่จะช่วยให้คุณได้คำตอบที่เฉพาะเจาะจงและเกี่ยวข้องมากขึ้น ดูวิธีถาม
gnat

บทช่วยสอนบุคคลที่สามนี้ปรากฏขึ้นเพื่อตอบคำถามเหล่านี้: devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

คำตอบ:


36

ผมเชื่อว่าคุณจะเข้าใจผิดในความเข้าใจของasm.js

ก่อนอื่นจากคำถามที่พบบ่อย

Q. asm.js เป็นภาษาใหม่หรือไม่?
ตอบไม่ได้มันเป็นเพียงแค่ส่วนย่อยของ JavaScript

และคุณถามเพิ่มการชี้แจง :

แต่เป็นไปได้อย่างไรที่จะเขียนหนึ่ง [แอปพลิเคชัน asm.js] ใน C ++

คุณไม่ได้เขียน "แอปพลิเคชัน asm.js" แต่เป็น asm.js เป็นเป้าหมาย1ในการรวบรวมรหัส C ++ ของคุณไปที่

นี้บทความโดยจอห์น Resigให้จำนวนของรายละเอียดที่ดีกว่าอาจจะอธิบายวิธี asm.js จะถูกนำมาใช้

เริ่มต้นด้วยภาพนี้:
C ++ => clang / LLVM => emscripten => เครื่องยนต์ JS

คุณสามารถดู asm.js ที่เป็นเป้าหมายการแปลของemscripten Emscripten จัดการการแปลLLVM bytecode เป็น JavaScript และ asm.js เป็นส่วนย่อยของ JavaScript การอยู่ภายใน JavaScript ส่วนย่อยที่ จำกัด ของ asm.js ช่วยให้โค้ดสามารถปรับให้เหมาะสมและทำงานได้เร็วขึ้น

คุณถามด้วย:

และถ้าฉันเขียนโค้ดใน C ++ แล้ววิธีใช้ js API-s

อีกครั้งที่คุณพลาดจุดนี้ Asm.js เปิดใช้งานการย้ายแอปพลิเคชัน C / C ++ ที่มีอยู่ลงใน JavaScript เพื่อให้สามารถเรียกใช้ภายในเบราว์เซอร์ ตามปกติคุณจะไม่สามารถใช้ JS API ภายในรหัส C / C ++ ของคุณและไม่มีอะไรน่าอัศจรรย์เกี่ยวกับ asm.js ที่จะอนุญาต

หากคุณมีแอปพลิเคชันใหม่ในการเขียนที่ต้องการ JS APIs คุณควรเขียนแอปพลิเคชันใน JS และไม่ใช่ futz โดยพยายามเขียนใน C ++ จากนั้นพอร์ตไปยัง JavaScript

และกลับไปที่บทความของ Resig มีคำพูดสองคำหลักสำหรับคำถามของคุณ:

ประเภทของแอปพลิเคชันที่จะกำหนดเป้าหมายเป็น Asm.js ในอนาคตอันใกล้นี้คือแอปพลิเคชั่นที่จะได้รับประโยชน์จากการพกพาในการทำงานในเบราว์เซอร์ แต่มีระดับความซับซ้อนที่พอร์ตโดยตรงไปยัง JavaScript

และ

อย่างที่คุณเห็นจากโค้ดด้านบน Asm.js นั้นไม่ได้ออกแบบมาให้เขียนด้วยมือ ... กรณีการใช้งานทั่วไปสำหรับ Asm.js ตอนนี้อยู่ในแอปพลิเคชันที่ได้มาตรฐานจาก C / C ++ ถึง JavaScript แอปพลิเคชันเหล่านี้แทบไม่มีการโต้ตอบกับ DOM อย่างมีความหมายนอกเหนือจากการใช้ WebGL และอื่น ๆ

สิ่งที่คุณอาจต้องการพิจารณาดำเนินการแทนคือการมีโปรแกรม JavaScript ที่เรียกใช้ JS APIs ที่คุณต้องการพร้อมกับการโทรไปยัง C ++ ที่คุณรวบรวมไปยัง JavaScript ดูบทช่วยสอนนี้เพื่อดูวิธีการเรียกรหัส C ++ จาก JavaScript


สำหรับการวิจัยเพิ่มเติมemscripten มีบทช่วยสอนที่อาจช่วยให้คุณเริ่มต้นด้วยการทำความเข้าใจวิธีการใช้รหัส C ++ เรียกใช้ผ่าน LLVM แล้วกำหนดเป้าหมายเป็น asm.js

1 พูดอย่างเคร่งครัดนั่นไม่ใช่ความจริง รหัส C / C ++ ไม่ทราบว่ามันจะถูกรวบรวมไปด้วยดังนั้นฉันจึงไม่สามารถเรียก asm.js เป้าหมายได้ เครื่องมืออื่น (emscripten) ใช้เอาต์พุต LLVM แล้วแปลเป็น JavaScript ที่สอดคล้องกับ asm.js แต่ฉันจะเรียกมันว่าเป้าหมายเพราะเข้าใจง่ายกว่า


ASM.js เป็นเป้าหมายการรวบรวมสำหรับ C / C ++ ดังนั้นไม่มีคุณไม่ได้เขียน C ++ ใน asm.js การคอมไพล์ C ++ ของคุณไปยัง asm.js
Calvin

มีเพียงการกล่าวถึงเพียงคำเดียวที่นึกถึงสำหรับแอปพลิเคชันที่เริ่มต้นจากศูนย์ ในกรณีของเกมการมีรหัสใน C ++ อาจเป็นประโยชน์สำหรับการปรับใช้กับหลายแพลตฟอร์ม
Vlad Nicula

6

ใช่คุณสามารถเขียนรหัส C ++ และรวบรวมเป็น asm.js โดยใช้ emscripten ฉันยังไม่ได้ลองด้วยตัวเองและฉันก็ไม่แน่ใจว่ามันพร้อมสำหรับเวลาสำคัญ ดูเหมือนว่าจะดีพอที่จะเล่นเกมมากมาย

นี่คือการกวดวิชา: 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 จริงๆ คอมไพเลอร์ C ++ นั้นมีความซับซ้อนมากกว่าสองหรือสามคำสั่ง โชคดีที่ emscripten หลีกเลี่ยงปัญหาที่ยากลำบากด้วยการรวบรวม LLVM และมีคอมไพเลอร์ C ++ - to-LLVM ที่มีอยู่
MSalters

3
@MSalters: นอกจากนี้ยังเป็นรหัส C ++ ที่ถูกต้อง ลองจินตนาการดูสิ! ว้าว!
Thomas Eding

@ThomasEding: คุณพลาดประเด็นไป ยิ่งภาษามีขนาดเล็กลงคุณจะต้องรวบรวมภาษานั้นได้ง่ายขึ้น จุดตัดของ C และ C ++ นั้นไม่จำเป็นต้องใหญ่กว่าของทั้งสองอย่างนั้น
MSalters

สมมติว่ารหัสนี้บริสุทธิ์ C ++ ที่คอมไพเลอร์ C จะไม่จัดการการใช้งานemccจะถูกต้องหรือไม่
Hamza Ouaghad

@HamzaOuaghad - ใช่ สวัสดีชาวโลกง่าย ๆ กับคลาส cout & string ของ c ++ ทำงานได้ดีกับบรรทัดคำสั่ง emcc นี้ ใช้เวอร์ชั่น 1.35.0
orion elenzil

0

วิธีที่ง่ายที่สุดคือการใช้WCPPซึ่งเป็นแพคเกจที่ให้คุณสามารถนำเข้า C ++ เข้าสู่โครงการโหนดของคุณได้โดยตรง

C ++ ของเรา

// addTwo.cpp 

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

ใน terminal (เพื่อรวบรวม C ++ ของเรา)

$ wcpp

จาวาสคริปต์ของเรา

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

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

สำหรับข้อมูลเพิ่มเติมดูแพคเกจ NPMหรือGit Repo

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.