WebAssembly 란 무엇입니까? 차세대 웹 플랫폼 설명

20 년 동안 웹 브라우저에서 기본적으로 사용할 수있는 프로그래밍 언어는 JavaScript뿐입니다. 서드 파티 바이너리 플러그인의 느린 죽음으로 인해 웹 개발의 일류 시민으로서 Java 및 Flash의 ActionScript와 같은 다른 언어가 배제되었습니다. CoffeeScript와 같은 다른 웹 언어는 JavaScript로 컴파일됩니다.

하지만 이제 새로운 가능성이 있습니다. WebAssembly 또는 줄여서 WASM입니다. WebAssembly는 웹 애플리케이션에 거의 네이티브 성능을 보장하는 작고 빠른 바이너리 형식입니다. 또한 WebAssembly는 모든 언어의 컴파일 대상이되도록 설계되었으며 JavaScript는 그중 하나 일뿐입니다. 이제 모든 주요 브라우저가 WebAssembly를 지원하므로 WebAssembly로 컴파일 할 수있는 웹용 클라이언트 측 앱을 작성하는 것에 대해 진지하게 생각할 때입니다.

WebAssembly 앱이 적어도 아직까지는 자바 스크립트 앱 을 대체하기 위한 것이 아니라는 점은 주목할 가치가 있습니다. 대신 WebAssembly 를 JavaScript 의 동반자 로 생각하십시오 . JavaScript가 유연하고 동적으로 입력되며 사람이 읽을 수있는 소스 코드를 통해 전달되는 경우 WebAssembly는 고속이고 강력한 형식이며 컴팩트 바이너리 형식을 통해 전달됩니다.

개발자는 게임, 음악 스트리밍, 비디오 편집 및 CAD 응용 프로그램과 같은 성능 집약적 사용 사례에 대해 WebAssembly를 고려해야합니다.

WebAssembly의 작동 원리

W3C에서 개발 한 WebAssembly는 제작자의 말로 "컴파일 대상"입니다. 개발자는 WebAssembly를 직접 작성하지 않습니다. 선택한 언어로 작성한 다음 WebAssembly 바이트 코드로 컴파일됩니다. 그런 다음 바이트 코드는 클라이언트 (일반적으로 웹 브라우저)에서 실행되며, 여기에서 원시 기계 코드로 변환되어 고속으로 실행됩니다.

WebAssembly 코드는 JavaScript보다로드, 구문 분석 및 실행이 더 빠릅니다. WebAssembly가 웹 브라우저에서 사용되는 경우에도 WASM 모듈을 다운로드하고 설정하는 오버 헤드가 있지만 다른 모든 항목이 동일하면 WebAssembly가 더 빠르게 실행됩니다. WebAssembly는 현재 JavaScript에 존재하는 동일한 보안 모델을 기반으로 샌드 박스 실행 모델도 제공합니다.

현재 웹 브라우저에서 WebAssembly를 실행하는 것이 가장 일반적인 사용 사례이지만 WebAssembly는 웹 기반 솔루션 그 이상입니다. 결국 WebAssembly 사양이 형성되고 더 많은 기능이 포함됨에 따라 모바일 앱, 데스크톱 앱, 서버 및 기타 실행 환경에서 유용 할 수 있습니다.

WebAssembly 사용 사례

WebAssembly의 가장 기본적인 사용 사례는 브라우저 내 소프트웨어를 작성하는 대상입니다. WebAssembly로 컴파일 된 구성 요소는 여러 언어로 작성할 수 있습니다. 최종 WebAssembly 페이로드는 JavaScript를 통해 클라이언트에 전달됩니다.

WebAssembly는 게임, 음악 스트리밍, 비디오 편집, CAD, 암호화 및 이미지 인식과 같은 성능 집약적 인 브라우저 기반 사용 사례를 염두에두고 설계되었습니다.

보다 일반적으로 특정 WebAssembly 사용 사례를 결정할 때 다음 세 가지 영역에 집중하는 것이 좋습니다.

  • 타겟 언어로 이미 존재하는 고성능 코드. 예를 들어 이미 C로 작성된 고속 수학 함수가 있고이를 웹 애플리케이션에 통합하려는 경우이를 WebAssembly 모듈로 배포 할 수 있습니다. 성능이 덜 중요하고 사용자에게 표시되는 앱 부분은 JavaScript에 남아있을 수 있습니다.
  • JavaScript가 이상적이지 않은 곳에서 처음부터 작성해야하는 고성능 코드. 이전에는 이러한 코드를 작성하기 위해 asm.js를 사용했을 수 있습니다. 여전히 그렇게 할 수 있지만 WebAssembly는 더 나은 장기 솔루션으로 포지셔닝되고 있습니다.
  • 데스크탑 애플리케이션을 웹 환경으로 포팅. asm.js 및 WebAssembly에 대한 많은 기술 데모가이 범주에 속합니다. WebAssembly는 HTML을 통해 제공되는 GUI보다 더 야심 찬 앱을위한 기판을 제공 할 수 있습니다. (WebDSP, Zen Garden 및 Tanks 데모를 참조하십시오.) 그러나 데스크톱 응용 프로그램이 사용자와 상호 작용하는 모든 방법을 WebAssembly / HTML / JavaScript 등가물에 매핑해야하기 때문에 이것은 사소한 연습이 아닙니다.

성능 한계를 밀어 붙이지 않는 기존 JavaScript 앱이있는 경우 WebAssembly 개발의이 단계에서 그대로 두는 것이 가장 좋습니다. 그러나 해당 앱이 더 빨리 작동해야하는 경우 WebAssembly가 도움이 될 수 있습니다.

WebAssembly 언어 지원 

WebAssembly는 직접 작성하기위한 것이 아닙니다. 이름에서 알 수 있듯이 이는 인간에게 친숙한 고급 프로그래밍 언어 라기보다는 기계가 소비하는 어셈블리 언어와 비슷합니다. WebAssembly는 C 또는 Java와 같은 것보다 LLVM 언어 컴파일러 인프라에 의해 생성 된 IR (중간 표현)에 더 가깝습니다.

따라서 WebAssembly 작업을위한 대부분의 시나리오에는 고급 언어로 코드를 작성하고이를 WebAssembly로 전환하는 작업이 포함됩니다. 이는 세 가지 기본 방법 중 하나로 수행 할 수 있습니다.

  • 직접 컴파일. 소스는 언어 고유의 컴파일러 도구 체인을 통해 WebAssembly로 변환됩니다. Rust, C / C ++, Kotlin / Native, D는 이제 모두 해당 언어를 지원하는 컴파일러에서 WASM을 내보내는 기본 방법을 가지고 있습니다.
  • 타사 도구. 이 언어는 도구 체인에 기본 WASM 지원이 없지만 타사 유틸리티를 사용하여 WASM으로 변환 할 수 있습니다. Java, Lua 및 .Net 언어 제품군은 모두 이와 같은 지원을 제공합니다.
  • WebAssembly 기반 인터프리터. 여기서 언어 자체는 WebAssembly로 번역되지 않습니다. 오히려 WebAssembly로 작성된 언어의 인터프리터가 해당 언어로 작성된 코드를 실행합니다. 이것은 인터프리터가 수 메가 바이트의 코드 일 수 있기 때문에 가장 성가신 접근 방식이지만 언어로 작성된 기존 코드를 변경하지 않고 모두 실행할 수 있습니다. Python과 Ruby에는 모두 WASM으로 번역 된 인터프리터가 있습니다.

WebAssembly 기능

WebAssembly는 아직 초기 단계입니다. WebAssembly 도구 체인 및 구현은 프로덕션 기술보다 개념 증명에 더 가깝습니다. 즉, WebAssembly의 관리자는 일련의 이니셔티브를 통해 WebAssembly를보다 유용하게 만드는 데 초점을 맞추고 있습니다.

가비지 콜렉션 프리미티브

WebAssembly는 가비지 수집 메모리 모델을 사용하는 언어를 직접 지원하지 않습니다. Lua 또는 Python과 같은 언어는 기능 집합을 제한하거나 전체 런타임을 WebAssembly 실행 파일로 포함하는 방식으로 만 지원할 수 있습니다. 그러나 언어 나 구현에 관계없이 가비지 수집 된 메모리 모델을 지원하기위한 작업이 진행 중입니다.

스레딩

스레딩에 대한 기본 지원은 Rust 및 C ++와 같은 언어에서 일반적입니다. WebAssembly에서 스레딩 지원이 없다는 것은 WebAssembly 대상 소프트웨어의 전체 클래스를 해당 언어로 작성할 수 없음을 의미합니다. WebAssembly에 스레딩을 추가하는 제안은 C ++ 스레딩 모델을 영감 중 하나로 사용합니다.

대량 메모리 작업 및 SIMD

대량 메모리 작업 및 SIMD (단일 명령어, 다중 데이터) 병렬 처리는 데이터 더미를 훑어보고 기계 학습 또는 과학 앱과 같이 질식을 방지하기 위해 기본 CPU 가속이 필요한 애플리케이션의 필수 요소입니다. 새로운 연산자를 통해 WebAssembly에 이러한 기능을 추가하기위한 제안이 테이블에 있습니다.

고급 언어 구조

WebAssembly에 대해 고려되는 다른 많은 기능은 다른 언어의 고급 구조에 직접 매핑됩니다.

  • 예외 는 WebAssembly에서 에뮬레이션 할 수 있지만 WebAssembly의 명령어 세트를 통해 기본적으로 구현할 수 없습니다. 제안 된 예외 계획에는 C ++ 예외 모델과 호환되는 예외 프리미티브가 포함되며, 이는 다시 WebAssembly로 컴파일 된 다른 언어에서 사용할 수 있습니다.
  • 참조 유형  을 사용하면 호스트 환경에 대한 참조로 사용되는 객체를 쉽게 전달할 수 있습니다. 이렇게하면 가비지 수집 및 기타 여러 고급 기능을 WebAssembly에서 구현하기가 더 쉬워집니다.
  • 다양한 언어로 사용되는 디자인 패턴 인 테일 콜 .
  • 예를 들어 Python 또는 C #의 튜플을 통해 여러 값을 반환하는 함수 .
  • 부호 확장 연산자 , 유용한 저수준 수학 연산입니다. (LLVM은 이것도 지원합니다.)

디버깅 및 프로파일 링 도구

트랜스 파일 된 자바 스크립트의 가장 큰 문제 중 하나는 트랜스 파일 된 코드와 소스 간의 상관 관계를 파악할 수 없기 때문에 디버깅 및 프로파일 링의 어려움이었습니다. WebAssembly에서도 비슷한 문제가 발생하며 유사한 방식으로 해결되고 있습니다 (소스 맵 지원). 계획된 툴링 지원에 대한 프로젝트의 노트를 참조하십시오.