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. 이것은 브라우저에서 실행되는 다른 스크립팅 언어에 대해 무엇을 의미합니까? 예를 들어 파이썬을 생각해보십시오.
    • wasm으로 컴파일 된 파이썬 코드? 또는
    • 파이썬 인터프리터 (Cpython)는 wasm으로 컴파일되고 파이썬을 해석합니까?

답변:


47

asm.js 코드는 시간 내에 컴파일되고 실행됩니까? 무엇으로 컴파일?

asm.js는 일반 자바 스크립트 코드이며 언제나처럼 JS 인터프리터에 의해 바이트 코드로 컴파일됩니다. 그러나 asm을 지원하는 인터프리터는 사전 컴파일을 수행해야하며 정적 유형 지정으로 인해 더 효율적인 코드 표현을 생성 할 수 있습니다. 자세한 내용은 http://asmjs.org/ 를 참조하십시오.

asm과 wasm의 차이점은 무엇입니까 (텍스트 대 바이너리 제외)?

지금은 없습니다. wasm은 이전 버전과 호환 되며 asm으로 컴파일 할 수 있어야합니다 (다시 일반 JS로 실행 가능). 그러나 지원이 증가함에 따라 향후 더 많은 기능 으로 확장 될 수 있습니다 .

이것은 브라우저에서 실행되는 다른 스크립팅 언어에 대해 무엇을 의미합니까?

후자는 오히려 파이썬이 여전히 해석되어야하기 때문입니다. 인터프리터가 필요하지 않은 스크립팅 언어는 대상으로 지원하는 컴파일러 (체인)가 있다는 점을 고려하면 (w) asm으로 직접 컴파일 할 수 있습니다.


몇 가지 메모. 답변의 첫 번째 부분이 약간 모호한 것 같습니다. asm.js가 AOT를 "더 효율적인 바이트 코드"로 컴파일한다고 말하는 것처럼 들립니다. 실제로 구현은 바이트 코드를 대상으로 할 필요가 없으며 실제로 많은 사람들이 네이티브 ISA 와 AOT를 대상으로합니다 (실제로 는 일종의 요점입니다). 또한 "asm 및 js로 컴파일 가능"이라고 말합니다. "네이티브 어셈블리"또는 그 밖의 것을 말하려는 의도를 명확히하고 싶을 수 있습니다. 또는 "asm.js 및 js"를 의미했을 수도 있지만, 하나는 다른 하나의 하위 집합이기 때문에 그다지 도움이되지 않습니다.
tne

1
@tne : 의견을 보내 주셔서 감사합니다. 문제를 해결할 수 있기를 바랍니다. 자유롭게 수정 (제안) 해주시면 감사하겠습니다. 맞습니다. 모든 ISA는 프로세서에 의해 해석되는 또 다른 "바이트 코드"이기 때문에 정확한 컴파일 아키텍처에 익숙하지 않았기 때문에 "보다 효율적인 바이트 코드"에 대해 약간 느슨했습니다. 부정확 한 용어를 용서하십시오 :-)
Bergi

53

asm.js 는 "매우 최적화 가능한"지침이있는 JS의 하위 집합입니다. 기본적으로 유형 (int, float)을 선언 할 수 있으며 js 엔진 (브라우저에서뿐만 아니라 node.js에서도)은 명령을 더 빠르게 실행합니다. WebGL과 함께 사용하면 앱이 많은 계산이나 그래픽을 수행하면 이점이 있습니다.

웹 어셈블리 는 asm.js뿐만 아니라 JS, 모든 JS의 바이너리 형식입니다. 이것은 바이트 코드가 아니라 파서가 계산하는 AST의 바이너리 인코딩입니다. 두 가지 큰 이점이 있습니다.

  • JS 엔진은 구문 분석 단계를 건너 뛸 수 있습니다.
  • JS 원본 소스보다 훨씬 더 간결합니다.

우리는 이미 JS가 아닌 브라우저 용 코드를 작성할 수 있습니다. EMSCripten은 JS 코드에서 C ++ 코드를 컴파일 할 수 있습니다. 다른 트랜스 컴파일러는 이미 코드를 JS로 컴파일하는 데 사용할 수 있습니다. asm.js를 사용하면 코드가 수학을 할 때 더 빨리 실행될 수 있습니다. 웹 어셈블리를 사용하면 코드가 더 압축되고 브라우저가 더 빠르게 처리 할 수 ​​있습니다 (파싱을 건너 뛸 수 있기 때문). 모든 것이 JS 샌드 박스에서 실행되기 때문에 DirectX, JavaApplets, Flash 또는 Silverlight와 같은로드 할 새 플러그인이 없습니다.


5
파싱을 건너 뛰시겠습니까? 천천히, 거기. 하드웨어 지원은 가까운 장래에지도에서 벗어났습니다. 의미하는 바는 구문 분석이 asm.js의 병목 현상이되었고 wasm은 효율적인 바이너리 형식으로 문제를 해결했습니다. asm.js / wasm에 대한 이론적 근거는 약간 미니멀 한 것 같지만 괜찮습니다. 바이트 코드! = AST를 지적하기위한 소품.
tne

4
@Cristian, WASM은 JS의 바이너리 형식이 아닙니다. JS와 동일한 웹 API를 사용하지만 JS보다 훨씬 더 이식 가능하고 일반화됩니다. : JS, 또는 바이트 코드의 이진 형식은 해당 파이어 폭스의 여기처럼 브라우저에서 구현 developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/...
LearningFast

20

asm.js 코드는 시간 내에 컴파일되고 실행됩니까? 무엇으로 컴파일?

다른 브라우저는 다른 방식으로 asm.js 코드를 컴파일합니다. 2015 년 8 월 현재 :

  • Firefox는 asm.js를 기계 코드로 컴파일합니다 (그리고 동일한 asm.js의 향후로드를 위해 기계 코드를 캐시합니다) [ 1 ].
  • Windows 10에서 실험용 플래그로 Edge는 asm.js [ 2 ] 의 Ahead-of-Time 유효성 검사 및 컴파일도 수행 합니다.
  • Chrome은 특히 asm.js 시작 부분에있는 "use asm"지시문을 인식하여 코드를 더 열심히 파싱하고 분석하고 컴파일 휴리스틱을 조정합니다.
  • Safari는 asm.js를 특수 처리하지 않습니다.

asm.js가 텍스트이고 wasm (웹 어셈블리)이 이진 인 것 외에 2의 차이점은 무엇입니까?

asm.js는 JavaScript 일 뿐이므로 JavaScript 사양에 따라 정확하게 작동해야합니다. 새로운 표준으로서 WebAssembly는 JavaScript 동작이 이상적이지 않은 일부 코너 케이스를 수정할 수 있습니다 (성능 또는 컴파일 관점에서) [ 3 ]. 미래 [에 4 ], WebAssembly 그렇지 않으면 자바 스크립트로 표현하기 어려울 것 기능을 추가 할 수 있습니다.

이것은 브라우저에서 실행되는 다른 스크립팅 언어에 대해 무엇을 의미합니까? 예를 들어 파이썬을 생각해보십시오.

  • wasm으로 컴파일 된 파이썬 코드? 또는
  • 파이썬 인터프리터 (Cpython)는 wasm으로 컴파일되고 파이썬을 해석합니까?

v.1에서 브라우저에서 Python을 실행하는 가장 간단한 방법은 말했듯이 Python 인터프리터를 wasm으로 컴파일하는 것입니다. 이것은 예를 들어 Python GC가 wasm 코드에서 실행되고 wasm 선형 메모리를 수동으로 관리한다는 것을 의미합니다. 이미 asm.js 백엔드를 PyPy [ 5 ] 에 추가하는 실험적인 프로젝트가 있습니다 (wasm에서도 잘 작동 할 수 있음). 현재 wasm의 동적 연결 미래 기능 으로 해결할 수있는 asm.js의 한계에 부딪 힙니다. 나아가 wasm 은 웹 플랫폼과의보다 효율적이고 자연스러운 통합을 가능하게하는 GC 통합JIT 컴파일 지원을 모두 제공하려고 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.