Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

WIT 월드

WIT 월드(또는 간단히 “월드”)는 단일 인터페이스보다 더 넓은 범위를 갖는 계약입니다. 월드는 컴포넌트가 제공하는 기능과 컴포넌트가 동작하기 위해 필요로 하는 기능을 기술합니다.

월드는 어떤 임포트와 익스포트를 지정하는지에 따라 컴포넌트를 기술하는 데에도, 다른 컴포넌트를 위한 호스팅 환경을 기술하는 데에도 사용할 수 있습니다. 컴포넌트는 합성될 수 있으므로 월드는 컴포넌트와 호스트 환경 중 어느 쪽이든 나타낼 수 있습니다. 즉, 호스트 환경과 마찬가지로 컴포넌트도 다른 컴포넌트가 필요로 하는 기능을 제공할 수 있습니다.

컴포넌트로 월드를 충족하는 경우와 호스트로 월드를 충족하는 경우

한편으로 월드는 컴포넌트가 다른 컴포넌트와 어떻게 관계를 맺는지를 기술합니다. 즉, 컴포넌트가 노출하는 기능을 기술하고, 컴포넌트가 실행되기 위해 의존하는 기능을 선언합니다. 기능은 익스포트할 인터페이스를 정의하여 노출하고, 의존성은 인터페이스를 임포트하여 선언합니다. 월드는 컴포넌트의 겉면만 정의할 뿐, 내부 동작은 정의하지 않습니다.

다른 한편으로 월드는 컴포넌트를 위한 호스팅 환경, 즉 컴포넌트를 인스턴스화하고 그 기능을 호출할 수 있는 환경을 정의합니다.

  • WebAssembly에서 인스턴스화란 모듈의 정적인 기술을 메모리 안의 동적인 구조로 바꾸는 것을 의미합니다. 이는 실행 파일을 로드하는 것과 유사합니다.

호스팅 환경은 모든 임포트에 대한 구현을 제공하고, 선택적으로 하나 이상의 익스포트를 호출함으로써 월드를 지원합니다. 컴포넌트를 만드는 애플리케이션 또는 라이브러리 개발자라면 컴포넌트가 대상으로 하는 월드를 지정하게 됩니다. 컴포넌트는 직접 만든, 사용 사례에 맞춘 고유한 임포트와 익스포트 집합을 가진 사용자 정의 월드 정의를 대상으로 할 수도 있고, 다른 사람이 이미 지정해 둔 기존 월드 정의를 대상으로 할 수도 있습니다. 어느 경우든 월드는 컴포넌트가 필요로 하는 모든 외부 기능을 지정합니다. 월드를 대상으로 하는 것은 특정 버전의 표준 라이브러리에 의존하는 것과 유사하지만, 컴포넌트를 사용하면 코드가 정확히 어떤 함수에 의존하는지를 정밀하게 지정할 수 있다는 점이 다릅니다.

예시: wasi:cli 월드

예를 들어, WASI(WebAssembly 시스템 인터페이스)는 명령줄 프로그램이 일반적으로 사용할 수 있으리라 기대하는 인터페이스(예: 파일 입출력, 난수 생성, 시계)를 임포트하는 “명령줄” 월드를 정의합니다. 이 월드에는 명령줄 도구를 실행하기 위한 익스포트가 하나 있습니다. 이 월드를 대상으로 하는 컴포넌트는 이 하나의 익스포트에 대한 구현을 반드시 제공해야 하며, 선택적으로 어떤 임포트든 호출할 수 있습니다. 예를 들어 특정 디렉터리에 있는 파일 크기의 요약을 출력하는 컴포넌트(Unix의 du 명령처럼)는 “명령줄” 월드를 대상으로 할 수 있으며, 월드가 임포트하는 파일 입출력 인터페이스에 의존하게 됩니다. 이 월드를 지원하는 호스팅 환경은 모든 임포트에 대한 구현을 반드시 제공해야 하며, 하나뿐인 익스포트를 호출할 수 있습니다. 예시로 든 디스크 사용량 컴포넌트를 실행한다는 것은 “명령줄” 월드를 지원하는 호스팅 환경에서 이 컴포넌트를 호출한다는 의미입니다.

월드와 인터페이스

월드는 인터페이스의 모음이며, 각 인터페이스는 방향성을 갖습니다. 각 인터페이스는 익스포트 또는 임포트 중 하나로 명시적으로 표시됩니다. 익스포트된 인터페이스는 외부 코드가 호출할 수 있는 반면, 임포트된 인터페이스는 외부 코드가 충족해야 합니다. 이러한 인터페이스는 컴포넌트의 엄격한 경계를 정의합니다. 컴포넌트가 자신 외부의 무언가와 상호 작용하는 방법은 자신의 익스포트가 호출되거나 자신의 임포트를 호출하는 것뿐입니다. 이 경계는 매우 강력한 샌드박싱을 제공합니다. 예를 들어 컴포넌트에 비밀 저장소에 대한 임포트가 없다면, 해당 저장소가 같은 프로세스에서 실행 중이더라도 컴포넌트는 그 비밀 저장소에 접근할 수 없습니다.

컴포넌트가 실행되려면 호스트 또는 다른 컴포넌트가 해당 컴포넌트의 임포트를 충족해야 합니다. 컴포넌트의 임포트 중 일부 또는 전부를 다른 컴포넌트의 일치하는 익스포트에 연결하는 것을 합성이라고 합니다.

월드는 WIT 파일에 정의되며, 하나의 WIT 파일에 여러 월드를 포함할 수 있습니다.

월드 예시

  • (간단한) “HTTP 프록시” 월드는 “HTTP 요청 처리” 인터페이스를 익스포트하고 “HTTP 요청 전송” 인터페이스를 임포트합니다. 호스트 또는 다른 컴포넌트는 익스포트된 “처리” 인터페이스를 호출하여 HTTP 요청을 전달하고, 컴포넌트는 임포트된 “전송” 인터페이스를 통해 해당 요청을 전달합니다. 유용한 프록시가 되려면 컴포넌트는 I/O 및 시계 시간과 같은 인터페이스도 임포트해야 할 수 있습니다. 이러한 임포트가 없으면 컴포넌트는 디스크 캐싱이나 기타 필요한 기능을 수행할 수 없습니다.
  • “정규식 파서” 월드는 “정규식 파싱” 함수를 익스포트하며, 아무것도 임포트하지 않습니다. 이는 이 월드를 구현하는 컴포넌트가 정규식을 파싱할 수 있다는 것뿐만 아니라 다른 API를 전혀 호출하지 않는다는 것도 선언합니다. 이러한 파서의 사용자는 구현을 살펴보지 않고도 파서가 파일 시스템에 접근하지 않으며 사용자의 정규식을 네트워크 서비스로 전송하지도 않는다는 것을 알 수 있습니다.

WIT 월드가 무엇인지에 대한 보다 공식적인 정의는 WIT 월드 명세를 참조하십시오.


원문 © 2023 The Bytecode Alliance Contributors · WebAssembly Components Documentation · CC BY 4.0
Yeokja 한국어 번역·편집 · Anthropic 사의 claude-sonnet-5 모델을 활용하여 번역되었으며 학습을 모두 비허용한 상태로 작업하였습니다 · 이 번역은 원문을 수정한 문서이며 CC BY 4.0으로 제공합니다.