[javascript] asm.js와 WebAssembly의 차이점은 무엇입니까?

최근에 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으로 컴파일되고 파이썬을 해석합니까?


답변

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

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

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

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

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

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


답변

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와 같은로드 할 새 플러그인이 없습니다.


답변

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 컴파일 지원을 모두 제공하려고 합니다.


답변