Asm.js ve WebAssembly arasındaki fark nedir?


101

Son zamanlarda asm.js ve WebAssembly hakkında okuyorum:

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

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

Hala birkaç konuda kafam karışık:

  1. Asm.js kodu zamanında derlenip çalıştırılıyor mu? Neye derledim?
  2. Asm.js'nin metin ve wasm (web derlemesi) ikili olması dışında, 2 arasındaki farklar nelerdir?
  3. Tarayıcıda çalışan diğer komut dosyası dilleri için bu ne anlama geliyor? Örneğin python alın,
    • python kodu wasm için derlendi mi? veya
    • python yorumlayıcısı (Cpython) wasm'de derlenmiş ve python'u yorumluyor mu?

Yanıtlar:


47

Asm.js kodu zamanında derlenip çalıştırılıyor mu? Neye derledim?

asm.js normal bir javascript kodudur ve her zaman olduğu gibi JS yorumlayıcısı tarafından bayt kodu olarak derlenir. Ancak, asm desteğine sahip bir yorumlayıcının önceden derleme yapması ve muhtemelen statik yazım nedeniyle daha verimli kod gösterimi oluşturması beklenir. Ayrıntılar için http://asmjs.org/ adresine bakın.

asm ve wasm arasındaki farklar nelerdir (metin ve ikili dışında)?

Şimdilik yok. wasm'nin geriye dönük uyumlu olması, asm'ye derlenebilir (ki bu da normal JS olarak çalıştırılabilir) olması gerekiyordu. Bununla birlikte , destek arttıkça gelecekte daha fazla özellikle genişletilebilir .

Tarayıcıda çalışan diğer komut dosyası dilleri için bu ne anlama geliyor?

İkincisi, daha ziyade, Python olarak hala yorumlanması gerekiyor. Bir yorumlayıcıya ihtiyaç duymayan komut dosyası dilleri, onu hedef olarak destekleyen bir derleyici (zincir) olması koşuluyla, elbette doğrudan (w) asm olarak derlenebilir.


1
Birkaç not. Cevabınızın ilk kısmı biraz belirsiz görünüyor; asm.js'nin AOT'yi "daha verimli bir bayt kodu" olarak derleyeceğini söylüyormuşsunuz gibi geliyor. Aslında, uygulamaların bir bayt kodunu hedeflemesi gerekmez ve aslında çoğu kişi yerel ISA'yı ve AOT'yi (gerçekten önemli olan bir tür) hedef alır . Ayrıca "asm ve js'ye derlenebilir" diyorsunuz. "Yerel montaj" veya başka bir şey demek istediğinizi açıklığa kavuşturmak isteyebilirsiniz. Ya da belki "asm.js ve js" yi kastetmişsinizdir, ancak biri diğerinin alt kümesi olduğu için bu pek yardımcı olmaz.
tne

1
@tne: Geri bildiriminiz için teşekkürler, umarım sorunları çözebilirim - kendiniz düzenlemekten (bir öneride bulunabilirsiniz), memnun olurum. Doğru, tam derleme mimarisine aşina olmadığım için "daha verimli bayt kodu" konusunda biraz gevşek davrandım, ne de olsa ISA, işlemci tarafından yorumlanan başka bir "bayt kodu". Lütfen yanlış terminolojiyi affedin :-)
Bergi

53

asm.js , "yüksek düzeyde optimize edilebilir" talimatlara sahip bir JS alt kümesidir. Temel olarak türü (int, float) bildirebilirsiniz ve js motoru (tarayıcılarda ve ayrıca node.js'de) talimatları daha hızlı çalıştıracaktır. WebGL ile birlikte kullanıldığında uygulamanız çok fazla hesaplama veya grafik yaparsa faydalar vardır.

web derlemesi , yalnızca asm.js için değil, JS, tüm JS için ikili bir biçimdir. Bu bir bayt kodu değil, ayrıştırıcının hesapladığı AST'nin ikili bir kodlaması. 2 büyük faydası vardır:

  • JS motoru ayrıştırma adımını atlayabilir
  • JS orijinal kaynağından çok daha kompakt

JS olmayan tarayıcılar için kod yazabiliriz: EMSCripten, JS kodunda c ++ kodunu derleyebilir. Kodunuzu JS'ye derlemek için başka transcompiler zaten mevcut. Asm.js kullanarak bu kod matematik yaptığında daha hızlı çalışabilir. Web derlemesini kullanarak bu kod daha kompakt olacak ve tarayıcı onu daha hızlı işleyebilecektir (çünkü ayrıştırmayı atlayabilecektir). DirectX, JavaApplets, Flash veya Silverlight gibi yüklenecek yeni bir eklentiniz olmayacak, çünkü her şey JS korumalı alanında çalışacak.


5
Ayrıştırma atlansın mı? Orada yavaşla. Öngörülebilir gelecek için donanım desteği haritanın dışında. Demek istediğin, ayrıştırmanın asm.js ile darboğaz haline geldiği ve wasm bunu verimli bir ikili formatla düzelttiğidir. Asm.js / wasm için gerekçeniz biraz minimalist görünüyor, ama sorun değil. Bayt kodunu göstermek için aksesuarlar! = AST.
tne

5
@Cristian, WASM, JS için ikili bir format değildir. JS ile aynı web API'lerini kullanacak, ancak JS'den çok daha taşınabilir ve genelleştirilmiştir. JS veya bayt kodlar için tek ikili formatlar, Firefox'ta olduğu gibi tarayıcılarda uygulananlardır: developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…
LearningFast

20

Asm.js kodu zamanında derlenip çalıştırılıyor mu? Neye derledim?

Farklı tarayıcılar asm.js kodunu farklı şekillerde derler. Ağustos 2015 itibariyle:

  • Firefox, asm.js'yi makine koduna derler (ve aynı asm.js'nin gelecekteki yükleri için makine kodunu önbelleğe alır) [ 1 ].
  • Windows 10'da deneysel bir bayrak olarak, Edge ayrıca asm.js [ 2 ] için bazı Zaman Öncesi doğrulama ve derleme yapacaktır .
  • Chrome, kodu daha hevesle ayrıştırmak ve analiz etmek ve derleme buluşsallarını ayarlamak için asm.js'nin başlangıcındaki "asm kullan" yönergesini özellikle tanır.
  • Safari, asm.js için özel bir işlem yapmaz.

Asm.js'nin metin ve wasm (web derlemesi) ikili olması dışında, 2 arasındaki farklar nelerdir?

asm.js yalnızca JavaScript'tir ve bu nedenle tam olarak JavaScript spesifikasyonuna göre davranmalıdır. Yeni bir standart olarak WebAssembly, JavaScript davranışının ideal olmadığı (performans veya derleme açısından) [ 3 ] bazı köşe durumlarını düzeltebilir . Gelecekte [ 4 ], WebAssembly aksi takdirde JavaScript'te ifade edilmesi zor olan özellikler ekleyebilecek.

Tarayıcıda çalışan diğer komut dosyası dilleri için bu ne anlama geliyor? Örneğin python alın,

  • python kodu wasm için derlendi mi? veya
  • python yorumlayıcısı (Cpython) wasm'de derlenmiş ve python'u yorumluyor mu?

V.1'de, Python'u bir tarayıcıda çalıştırmanın en basit yolu, söylediğiniz gibi bir Python yorumlayıcısını wasm'ye derlemek olacaktır. Bu, örneğin, Python GC'nin wasm kodunda çalıştığı ve wasm doğrusal belleğini manuel olarak yönettiği anlamına gelir. PyPy [ 5 ] ' e bir asm.js arka ucu eklemek için deneysel projeler zaten var (wasm için de işe yarayabilir). Şu anda, wasm'nin dinamik bağlanma gelecekteki özelliği tarafından ele alınabilecek asm.js sınırlamalarıyla karşılaşmaktadır. İleri giderek, wasm hem sağlamaya çalışır GC entegrasyonu ve JIT derleme desteği Web platformu daha etkin ve doğal entegrasyonunu sağlayacak her ikisi de.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.