6P by neo 13시간전 | ★ favorite | 댓글 2개
  • Wasm 2.0 스펙이 공식적으로 발표됨
  • Wasm Community와 Working Groups가 2022년부터 스펙을 완성했고, 주요 구현체는 이미 2.0을 지원하고 있었음
  • 2.0부터는 에버그린 모델이 도입되어, Candidate Recommendation 문서가 지속적으로 최신 상태로 갱신됨
  • 새 버전이 발표될 때마다 최종 권고안으로 이동시키지 않고, 현재의 권고안 초안이 표준으로 간주됨

Wasm 2.0의 주요 기능 및 추가 사항

  • 벡터 명령어(SIMD): 236개의 새로운 명령어 추가로 현대 CPU의 128비트 SIMD 기능 활용 가능, 고성능 오디오/비디오 코덱, 머신러닝, 암호화 등에 효율적임
  • 벌크 메모리 명령어: 메모리와 테이블의 빠른 복사 및 초기화가 가능한 명령어 세트 추가됨
  • 멀티-밸류 반환: 함수와 블록에서 여러 값을 반환할 수 있어 호출 규약이 개선되고, 추가적인 프로그램 변환이 가능해짐
  • 레퍼런스 타입: 함수에 대한 참조나 외부 객체(예: JavaScript 값) 포인터를 불투명한 1급 값으로 지원, 테이블이 이 레퍼런스 값의 저장소로 활용될 수 있음, 테이블을 다루는 명령어 및 다중 테이블 정의가 가능해짐
  • 논트래핑 변환: 부동소수점에서 정수로의 변환 시 예기치 않은 트랩이 발생하지 않는 변환 명령어 도입됨
  • 서명 확장 명령어: 부호 있는 정수의 폭을 직접 확장하는 명령어가 추가되어 이전보다 메모리 접근 없이 확장이 가능해짐

하위 호환성 및 향후 전망

  • Wasm 2.0은 1.0과 완벽하게 호환되어 기존 프로그램이 그대로 동작함
  • Wasm 3.0 출시도 곧 예정되어 있음
Hacker News 의견
  • 2025년 3월 WASM 2.0 발표 소식을 요약해보면, 128비트 SIMD 등 236개의 신규 벡터 명령어로 영상/음성 코덱, 머신러닝과 암호화 응용의 성능을 크게 높였음, 버크 메모리 명령어로 빠른 메모리 복사/초기화 지원, 함수가 이제 다중 결과를 반환할 수 있어 빠른 호출 규약과 간접참조 감소 지원, 참조 타입으로 외부 객체(JavaScript 값 등)에 대한 포인터를 첫급 값으로 취급, 여러 타입의 테이블 선언 가능, 비트폭 확장 명령어 및 예기치 않은 트랩 없는 부동소수점 변환 추가 등으로 대폭적 업그레이드임
    • Rust+LLVM은 ABI 호환성 문제로서 다중 결과 반환 지원을 실제론 아직 활용하지 못하고 있음, Clang 쪽 상황은 잘 모르겠음
    • 벡터 명령어(SIMD) 부분은 너무 일찍 최적화를 추구해 복잡해진 것 같음, 그냥 유연 사이즈 벡터 제안을 썼으면 더 우아했을 것임
    • 다중 결과 반환 기능은 Common Lisp 런타임 개발에도 매우 유익할 것임
    • 공식 포스트 마지막에 “곧 Wasm 3.0 소개 예정”이라 쓰여있으니, 정말로 Wasm 3.0이 머지않아 등장할 듯함
    • 아키텍처에 독립적이고 범용적인 ISA와, 특정 CPU SIMD를 최대한 활용하는 ISA는 양립이 불가함, 어느 한쪽을 골라야 함, 현재 Wasm2 SIMD 명령어가 충분히 범용적인지 GitHub의 rate limit 탓에 확인을 못 해봄
  • WebAssembly 사양은 꽤 읽기 쉬움, 하지만 사양 전문을 보고 싶지 않은 입문자에겐 WebAssembly from the Ground Up라는 온라인 책을 추천함, JavaScript로 컴파일러를 직접 만들며 단계별로 배우는 구성이 실습에 적합함, 무료 샘플도 있음, 참고로 내가 저자 중 한 명임
    • 개인적으로 Ada를 좋아하는 이유는, JavaScript처럼 번거로운 U32 체크 함수 코드를 Ada에선 서브타입(subtype)이나 모듈로 아주 깔끔하게 처리가 가능하기 때문임
    • WASM 코드를 인스트루먼트해서 인프로세스 디버깅이 가능한지 궁금함, 즉 커스텀 언어를 실시간으로 WASM으로 변환해, 웹에서 break point 및 메모리 인스펙션까지 한 번에 구현할 수 있을까 하는 궁금증임
  • 최근 1년간 WebAssembly 런타임 개발 작업을 하면서 스펙(사양)의 엄밀함과 잘 제공되는 테스트에 감명 받았음, 익숙해지는 데 시간이 좀 필요하지만 한 번 익히면 참 똑똑한 언어 사양임, 애매한 상황에선 사양에서 직접 생성된 레퍼런스 인터프리터가 큰 도움이 되고, 일관성 검증을 위한 스펙 테스트도 굉장히 유익함
  • 최근 Wasm Constant Time 제안이 비활성화(inactive)로 이동함, 실제 작업의 대부분은 2018년에 이루어졌으나, SIMD 연동과 공식 확장 통합이 미뤄진 상태임, 누군가 이 아주 중요한 작업을 이어받지 않는 한 모든 Wasm 암호화는 타임 어택(타이밍 공격) 에 매우 취약한 상황임
  • Wasm은 WebAssembly의 축약이며 약어가 아니므로 대문자 WASM으로 쓰지 않는다는 점이 인상적임
    • 그런 논리면 WAsm이 맞는 것 아닌지 궁금함
    • 실제로 약어더라도 다 소문자(예: scuba, radar, laser)로 쓰는 사례도 많음
    • 잘 되기를 바람 ㅋㅋ
  • 실제로 작동하는 WASM 앱 목록이 궁금함, 아이디어는 좋은데 마치 DAPPs처럼 “재미로만 있는 것” 같다는 느낌이 있음, 실제 예가 있으면 좋겠음
    • madewithwebassembly.com과 Awesome-WebAssembly-Applications 깃허브 추천함. 실제 WASM 앱이 잘 정리된 자료임
  • 이번 WASM2 릴리즈는 훌륭하지만, 고정크기 SIMD(128비트) 도입은 아쉬움이 남음, ARM SVE처럼 컴파일러가 기기별 성능에 따라 SIMD 폭을 조절하는 유연한 방식이 더 나았을 것임
    • 그러나 나는 오히려 고정크기 SIMD가 더 많은 활용처를 열어준다고 생각함, 벡터 명령어는 고정크기 SIMD로도 비교적 쉽게 대체할 수 있음, SIMD가 무조건 필요한 것은 아니지만 레지스터 크기 덕에 벡터화 되는 기회적(opportunistic) 용도도 많음, 이런 경우 상당히 유용하게 쓸 수 있음
    • 너무 일찍 최적화를 하는 것이 문제의 근원임, 이 SIMD 이슈도 차라리 가변크기 벡터 제안만 따랐다면 훨씬 우아했을 것임
  • C 함수가 값을 struct로 반환할 때 WASM으로 컴파일이 되는지 궁금함
    • 가능은 하지만, 현재로서는 JS로 “내보내기(export)”는 안 되는 것으로 알고 있음
  • WASM2 기능을 이미 구현한 런타임이 있는지 궁금함
    • 대부분 이미 오래 전부터 구현해오고 있음, Wasm 커뮤니티와 워킹그룹이 2022년 초에 스펙을 확정했고, 주요 구현체들은 그 전부터 2.0을 제공해왔음, 3.0도 곧 공식화될 예정이고, 기능 중 일부는 이미 feature flag를 통한 상태임
  • 웹용 바이트코드는 오래된 꿈이란 생각임, C# 개발자로서 Blazor가 초창기부터 WASM을 과감하게 선도한 점이 인상 깊음, .NET은 WASM에서 상당히 앞서나가고 있고, 이번 2.0 변화를 기대 중임