어떤 크레이트들을 WebAssembly에서 바로 사용할 수 있나요?
가장 간단하게 어떤 기능들이 WebAssembly 환경에서 작동하지 않는지 목록을 한번 만들어 보겠습니다. 다음 내용에 해당하지 않는 크레이트들은 휴대성이 좋고 WebAssembly 환경에서 잘 작동한다고 생각해도 좋고, 임베디드 시스템과 #![no_std]
를 지원하는 크레이트들도 보통은 WebAssembly도 지원한다고 볼수 있습니다.
이러한 크레이트들은 WebAssembly 환경에서 작동하지 않을 수도 있습니다
C 언어와 시스템 라이브러리 종속성이 있는 경우
wasm에는 시스템 라이브러리가 없기 떄문에 시스템 라이브러리에 바인딩돼 있는 코드가 있다면 작동하지 않습니다.
wasm에는 언어 간 통신에 사용할 수 있는 안정된 버전의 ABI와 언어 간 링킹(linking)이 존재하지 않습니다. 그러므로 C 라이브러리를 사용하는 크레이트도 작동하지 않습니다. 특히 clang
컴파일러가 wasm32
타겟을 기본으로 제공하기 때문에 결국은 작동할 것으로 예상되지만, 현재로서는 완벽하지 않습니다.
파일 I/O
WebAssembly는 파일 시스템에 접근할 수 없습니다. — 파일 시스템을 필요로 하고 wasm에서 사용할 수 있도록 코드가 마련되지 않은 크레이트는 작동하지 않습니다.
스레드 생성
스레딩을 웹어셈블리에 지원하는 계획이 있긴 하지만 아직 준비가 완벽히 되지 않았습니다. wasm32-unknown-unknown
타겟에서 스레드를 생성하려고 시도하면 wasm 트랩 (wasm trap) 이 발생하면서 코드가 패닉하게 됩니다.
어떤 다목적 크레이트들이 WebAssembly에서 바로 작동하는 편인가요?
알고리즘과 자료 구조
A* 알고리즘나 splay trees처럼, 특정한 알고리즘이나 data structure의 구현을 제공하는 크레이트들은 WebAssembly와 잘 작동하는 편입니다.
#![no_std]
Rust 스탠다드 라이브러리를 사용하지 않는 크레이트들도 WebAssembly와 잘 작동하는 편입니다.
파서 (Parser)
입력을 받고 I/O 작업을 수행하지 않는 이상, 파서들은 보통 WebAssembly와 잘 작동하는 편입니다.
텍스트 처리
인간 언어를 텍스트 형태로 나타냈을 때 발생하는 복잡성을 다루는 크레이트들은 WebAssembly와 잘 작동하는 편입니다.
Rust 패턴
Rust 프로그래밍의 특정한 상황에 쓰도록 공유되는 해결책들은 WebAssembly와 잘 작동하는 편입니다.