ผมเชื่อว่าคุณจะเข้าใจผิดในความเข้าใจของasm.js
ก่อนอื่นจากคำถามที่พบบ่อย
Q. asm.js เป็นภาษาใหม่หรือไม่?
ตอบไม่ได้มันเป็นเพียงแค่ส่วนย่อยของ JavaScript
และคุณถามเพิ่มการชี้แจง :
แต่เป็นไปได้อย่างไรที่จะเขียนหนึ่ง [แอปพลิเคชัน asm.js] ใน C ++
คุณไม่ได้เขียน "แอปพลิเคชัน asm.js" แต่เป็น asm.js เป็นเป้าหมาย1ในการรวบรวมรหัส C ++ ของคุณไปที่
นี้บทความโดยจอห์น Resigให้จำนวนของรายละเอียดที่ดีกว่าอาจจะอธิบายวิธี asm.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 แต่ฉันจะเรียกมันว่าเป้าหมายเพราะเข้าใจง่ายกว่า