4P by GN⁺ 13일전 | ★ favorite | 댓글 1개
  • Swift 커뮤니티는 WebAssembly(Wasm) 지원을 꾸준히 개발해 왔으며, 이를 바탕으로 장기적인 비전을 제안함
  • WebAssembly는 이식성, 보안성, 성능을 중시하는 가상 머신 명령어 집합으로, 다양한 플랫폼에서 실행 가능함
  • Swift에서 Wasm을 지원하면 브라우저를 포함한 새로운 환경에서 Swift를 사용할 수 있으며, 클라이언트/서버 애플리케이션 모두에서 활용 가능성 확대됨

보안 및 시스템 인터페이스 특성

  • Wasm은 직접적인 시스템 접근 없이 명시적으로 가져온 함수만 실행할 수 있어 보안에 유리함
  • WASI(WebAssembly System Interface) 는 Wasm이 호스트 OS와 상호작용할 수 있도록 표준 API를 제공
  • Swift는 wasm32-unknown-wasi 타겟에서 WASI libc를 기반으로 동작하며, C 인터롭을 통해 이미 사용 가능함
  • W3C는 Component Model을 통해 Wasm의 타입 시스템과 모듈 연동을 통합 관리하고 있음
    • wit-tool을 통해 Swift 선언에서 .wit 생성 가능, 반대 방향도 지원

주요 활용 사례

  • Swift 매크로를 Wasm으로 컴파일해 어디서나 실행 가능한 바이너리로 배포 가능
  • SwiftPM 플러그인, 매니페스트, 매크로 등의 실행을 가상화하여 보안성 강화
  • Wasm은 JIT 또는 AOT 컴파일로 최적화된 바이너리를 생성할 수 있어 성능 손실 최소화
  • Wasm으로 가상화된 Swift 컴포넌트는 별도 프로세스 없이 실행 가능, IPC 오버헤드 제거

제안된 목표

  1. Swift 표준 라이브러리의 WASI 지원 API 범위 확대
    • 테스트 자동화를 위한 CI 환경 구축 필요
  2. 크로스 컴파일 도구 개선
    • Swift SDK의 버전 관리와 설치 간소화
  3. Component Model 통합
    • 최신 WASI 사양이 Swift에서도 사용 가능하도록 지원
  4. 다른 Wasm 컴포넌트와의 인터롭 향상
    • Swift에서 Wasm 컴포넌트를 사용하는 경험을 C/C++와 동등하게 만드는 것이 목표
  5. Wasm에서의 Swift 디버깅 환경 개선

디버깅 관련 사항

  • Wasm의 디버깅은 제한적, 자체적으로 introspection 기능이 없음
  • 두 가지 주요 접근 방식이 존재
    1. LLDB와 GDB 프로토콜을 지원하는 Wasm 런타임
    2. Wasm 엔진에 내장된 디버거
  • 브라우저 환경과 비브라우저 환경은 서로 다른 디버깅 접근 필요
  • Chrome DevTools 등의 도구에서 DWARF 정보를 활용 가능하지만, Swift 메타데이터와 JIT 표현식 평가 기능은 추가 통합 필요

멀티스레딩 및 동시성

  • Wasm은 현재 순차적 일관성을 지원하는 원자 연산만 존재
  • 스레드 생성은 호스트 환경에 의존
  • 두 가지 스레딩 제안 존재:
    • wasi-threads (기존 방식, 일부 도구 및 런타임에서 지원됨)
    • shared-everything-threads (새로운 제안, 향후 표준이 될 가능성 있음)
  • Swift는 wasm32-unknown-wasi (단일 스레드), wasm32-unknown-wasip1-threads (멀티스레드) 지원
  • 현재는 libdispatch가 wasi-threads를 지원하지 않기 때문에 단일 스레드 기반의 Swift Concurrency 실행기를 사용 중

64비트 주소 공간

  • Wasm은 기본적으로 32비트 주소 공간을 사용
  • 64비트 메모리 제안(memory64) 은 구현 단계에 있음
  • Swift에서 이를 지원하려면 WebAssembly 도구 체인의 협조 또는 Swift 메타데이터 구조 변경 필요

공유 라이브러리

  • 두 가지 방식 존재
    1. Emscripten 스타일 동적 링크: 비표준적이며 런타임 기능 의존
    2. Component Model 기반 정적 링크: 런타임 특수 기능 없이도 사용 가능하나, 런타임 로딩은 불가
  • Swift에서 공유 라이브러리를 사용하려면 PIC(Position-Independent Code) 모드로 컴파일하고, 정해진 링크 규약을 따라야 함

스위프트 좋은데, 버려진 스위프트 다시 살아 날 수 있을까요..