asm.js และ WebAssembly แตกต่างกันอย่างไร


101

ฉันได้อ่านเกี่ยวกับ asm.js และ WebAssembly เมื่อเร็ว ๆ นี้:

http://ejohn.org/blog/asmjs-javascript-compile-target/

https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

ฉันยังคงสับสนเกี่ยวกับบางสิ่ง:

  1. โค้ด asm.js คอมไพล์ทันเวลาและรันหรือไม่ เรียบเรียงเป็นอะไร?
  2. นอกเหนือจาก asm.js ที่เป็นข้อความและ wasm (เว็บแอสเซมบลี) เป็นไบนารีความแตกต่างระหว่าง 2 คืออะไร?
  3. สิ่งนี้หมายความว่าอย่างไรสำหรับภาษาสคริปต์อื่น ๆ ที่ทำงานในเบราว์เซอร์ ยกตัวอย่าง python มันจะเป็นยังไง
    • รหัส python คอมไพล์เป็น wasm? หรือ
    • ล่ามหลาม (Cpython) รวบรวมเป็น wasm และตีความ python?

คำตอบ:


48

โค้ด asm.js คอมไพล์ทันเวลาและรันหรือไม่ เรียบเรียงเป็นอะไร?

asm.js เป็นโค้ดจาวาสคริปต์ปกติและถูกคอมไพล์เป็น bytecode โดยล่าม JS เช่นเคย อย่างไรก็ตามล่ามที่รองรับ asm ควรจะทำการรวบรวมล่วงหน้าและอาจสร้างการแสดงรหัสที่มีประสิทธิภาพมากขึ้นเนื่องจากการพิมพ์แบบคงที่ ดูรายละเอียดhttp://asmjs.org/

อะไรคือความแตกต่างระหว่าง asm และ wasm (นอกเหนือจาก text vs binary)?

ไม่มีสำหรับตอนนี้ wasm ควรจะเข้ากันได้แบบย้อนหลังคอมไพล์เป็นasm ได้ (ซึ่งเรียกใช้งานได้เหมือน JS ปกติอีกครั้ง) อย่างไรก็ตามอาจมีการขยายคุณสมบัติเพิ่มเติมในอนาคตเมื่อการสนับสนุนเพิ่มขึ้น

สิ่งนี้หมายความว่าอย่างไรสำหรับภาษาสคริปต์อื่น ๆ ที่ทำงานในเบราว์เซอร์

อย่างหลังค่อนข้างเนื่องจาก Python ยังคงต้องตีความ แน่นอนว่าภาษาสคริปต์ที่ไม่จำเป็นต้องใช้ล่ามสามารถคอมไพล์โดยตรงไปยัง (w) asm ได้เนื่องจากมีคอมไพเลอร์ (chain) ที่สนับสนุนเป็นเป้าหมาย


1
บันทึกคู่ ส่วนแรกของคำตอบของคุณดูเหมือนจะคลุมเครือเล็กน้อย ดูเหมือนคุณจะพูดว่า asm.js จะรวบรวม AOT ให้เป็น "bytecode ที่มีประสิทธิภาพมากขึ้น" ที่จริงแล้วการใช้งานไม่จำเป็นต้องกำหนดเป้าหมายเป็น bytecode และในความเป็นจริงหลายคนกำหนดเป้าหมายไปที่ISAดั้งเดิมโดยตรงและ AOT (ซึ่งเป็นประเด็นจริงๆ) คุณยังพูดว่า "compilable to asm and js" คุณอาจต้องการชี้แจงว่าคุณต้องการพูดว่า "แอสเซมบลีเนทีฟ" หรืออะไรสักอย่าง หรือบางทีคุณอาจหมายถึง "asm.js และ js" แต่นั่นก็ไม่เป็นประโยชน์มากนักเนื่องจากชุดหนึ่งเป็นส่วนย่อยของอีกชุดหนึ่ง
tne

1
@tne: ขอบคุณสำหรับข้อเสนอแนะฉันหวังว่าฉันจะสามารถแก้ไขปัญหาได้ - อย่าลังเลที่จะ (แนะนำและ) แก้ไขด้วยตัวคุณเองฉันจะขอบคุณ ถูกต้องฉันค่อนข้างหละหลวมกับ "bytecode ที่มีประสิทธิภาพมากกว่า" เนื่องจากฉันไม่คุ้นเคยกับสถาปัตยกรรมการคอมไพล์ที่แน่นอนเนื่องจาก ISA ทั้งหมดเป็นเพียง "ไบต์โค้ด" อื่นที่ประมวลผลตีความ โปรดอภัยคำศัพท์ที่ไม่ถูกต้อง :-)
Bergi

53

asm.jsเป็นส่วนย่อยของ JS ที่มีคำแนะนำ "ปรับให้เหมาะสมได้มาก" โดยทั่วไปคุณสามารถประกาศประเภท (int, float) และเอ็นจิน js (ในเบราว์เซอร์ แต่รวมถึง node.js ด้วย) จะดำเนินการตามคำสั่งได้เร็วขึ้น มีประโยชน์หากแอปของคุณทำการคำนวณหรือกราฟิกจำนวนมากหากใช้ร่วมกับ WebGL

web assemblyเป็นรูปแบบไบนารีสำหรับ JS, JS ทั้งหมดไม่ใช่เฉพาะ asm.js ไม่ใช่ bytecode แต่เป็นการเข้ารหัสไบนารีของ AST ที่ parser คำนวณ มี 2 ​​ประโยชน์ใหญ่:

  • เครื่องยนต์ JS สามารถข้ามขั้นตอนการแยกวิเคราะห์ได้
  • มีขนาดกะทัดรัดกว่าต้นฉบับ JS มาก

เราสามารถเขียนโค้ดสำหรับเบราว์เซอร์ที่ไม่ใช่ JS ได้แล้ว: EMSCripten สามารถรวบรวมโค้ด c ++ ในโค้ด JS ได้ ทรานคอมไพเลอร์อื่น ๆ พร้อมที่จะคอมไพล์โค้ดของคุณเป็น JS แล้ว การใช้ asm.js เพื่อให้โค้ดทำงานได้เร็วขึ้นเมื่อคำนวณ การใช้เว็บแอสเซมบลีจะทำให้โค้ดมีขนาดกะทัดรัดมากขึ้นและเบราว์เซอร์จะประมวลผลได้เร็วขึ้น (เพราะจะข้ามการแยกวิเคราะห์ได้) คุณจะไม่มีปลั๊กอินใหม่ให้โหลดเช่น DirectX, JavaApplets, Flash หรือ Silverlight เพราะทุกอย่างจะทำงานในแซนด์บ็อกซ์ JS


5
ข้ามการแยกวิเคราะห์ไหม ช้าลงที่นั่น การสนับสนุนฮาร์ดแวร์อยู่นอกแผนที่สำหรับอนาคตอันใกล้ สิ่งที่คุณหมายถึงคือการแยกวิเคราะห์กลายเป็นคอขวดด้วย asm.js และ wasm จะแก้ไขด้วยรูปแบบไบนารีที่มีประสิทธิภาพ เหตุผลของคุณสำหรับ asm.js / wasm ดูเหมือนจะเรียบง่าย แต่ก็ไม่เป็นไร อุปกรณ์ประกอบสำหรับชี้ bytecode! = AST
tne

5
@Cristian, WASM ไม่ใช่รูปแบบไบนารีสำหรับ JS จะใช้เว็บ API เดียวกันกับ JS แต่เป็นแบบพกพาและใช้งานทั่วไปได้มากกว่า JS รูปแบบไบนารีเดียวสำหรับ JS หรือ bytecodes คือรูปแบบที่ใช้ในเบราว์เซอร์เช่น Firefox ที่นี่developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…
LearningFast

20

โค้ด asm.js คอมไพล์ทันเวลาและรันหรือไม่ เรียบเรียงเป็นอะไร?

เบราว์เซอร์ต่างๆรวบรวมโค้ด asm.js ด้วยวิธีต่างๆ ณ เดือนสิงหาคม 2558:

  • Firefox รวบรวม asm.js เป็นรหัสเครื่อง (และแคชรหัสเครื่องสำหรับโหลด asm.js เดียวกันในอนาคต) [ 1 ]
  • ใน Windows 10 เป็นแฟล็กทดลอง Edge จะทำการตรวจสอบความถูกต้องล่วงหน้าและรวบรวม asm.js [ 2 ] ด้วย
  • Chrome จดจำคำสั่ง "use asm" เป็นพิเศษที่จุดเริ่มต้นของ asm.js เพื่อแยกวิเคราะห์และวิเคราะห์โค้ดอย่างกระตือรือร้นและปรับแต่งฮิวริสติกการคอมไพล์มากขึ้น
  • Safari ไม่มีการประมวลผลพิเศษของ asm.js

นอกเหนือจาก asm.js ที่เป็นข้อความและ wasm (เว็บแอสเซมบลี) เป็นไบนารีความแตกต่างระหว่าง 2 คืออะไร?

asm.js เป็นเพียง JavaScript ดังนั้นจึงต้องทำงานตามข้อกำหนดของ JavaScript ตามมาตรฐานใหม่ WebAssembly สามารถแก้ไขบางกรณีที่พฤติกรรมของ JavaScript ไม่เหมาะ (จากมุมมองด้านประสิทธิภาพหรือการคอมไพล์) [ 3 ] ในอนาคต [ 4 ] WebAssembly จะสามารถเพิ่มคุณสมบัติที่ยากต่อการแสดงใน JavaScript

สิ่งนี้หมายความว่าอย่างไรสำหรับภาษาสคริปต์อื่น ๆ ที่ทำงานในเบราว์เซอร์ ยกตัวอย่าง python มันจะเป็นยังไง

  • รหัส python คอมไพล์เป็น wasm? หรือ
  • ล่ามหลาม (Cpython) รวบรวมเป็น wasm และตีความ python?

ใน v.1 วิธีที่ง่ายที่สุดในการเรียกใช้ Python ในเบราว์เซอร์คือรวบรวมล่าม Python เป็น wasm ตามที่คุณกล่าว ซึ่งหมายความว่าเช่น Python GC กำลังทำงานในรหัส wasm และจัดการหน่วยความจำเชิงเส้น wasm ด้วยตนเอง มีโครงการทดลองเพื่อเพิ่มแบ็กเอนด์ asm.js ไปยัง PyPy [ 5 ] แล้ว (ซึ่งสามารถทำงานได้เช่นกันสำหรับ wasm) ปัจจุบันพบข้อ จำกัด ของ asm.js ที่สามารถแก้ไขได้โดยคุณลักษณะการเชื่อมโยงแบบไดนามิกในอนาคตของ wasm ยิ่งไปกว่านั้น wasm พยายามที่จะให้ทั้งการรวม GCและการสนับสนุนการรวบรวม JIT ซึ่งทั้งสองอย่างนี้จะช่วยให้สามารถรวมเข้ากับแพลตฟอร์มเว็บได้อย่างมีประสิทธิภาพและเป็นธรรมชาติมากขึ้น

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