WebAssembly - WASM: 초보자 가이드
안녕하세요, 미래의 코딩 슈퍼스타 여러분! WebAssembly, 짧게는 WASM이라고 부르는 세상으로의 흥미로운 여정을 안내해 드리게 되어 기쁩니다. 코드를 한 줄도 작성해 본 적이 없으신 분이라도 걱정 마세요 - 우리는 가장 기초적인 부분부터 함께 차근차근 진행할 것입니다. 당신의 좋아하는 음료를 한 잔 마시고 편안하게 앉아, 시작해 보겠습니다!
WebAssembly는 무엇인가요?
WebAssembly은 웹 브라우저가 이해하는 비밀의 언어입니다. 웹 애플리케이션이 더 빠르고 효율적으로 실행되도록 설계되었습니다. 웹사이트에서 복잡한 비디오 게임을 플레이하는 것을 생각해 보세요. WebAssembly 없이는 느리고 불편할 수 있습니다. 하지만 WebAssembly이 있다면, 게임기에서 플레이하는 것처럼 매끄럽게 실행될 수 있습니다!
간략한 역사
WebAssembly은 웹 애플리케이션이 더 강력해지기를 원하는 열망에서 탄생했습니다. 2015년에 최초로 발표되었고, 2017년에는 모든 주요 웹 브라우저에서 지원되었습니다. 기술 세계에서는 매우 빠른 속도입니다 - 당신의 좋아하는 소셜 미디어 앱이 새로운 기능을 갱신하는 것처럼 빠르죠!
스택 머신 모델
이제 조금 기술적이 보이지만 사실 매우 간단한 개념에 대해 이야기해 보겠습니다: 스택 머신 모델. 이것이 WebAssembly이 어떻게 작동하는 핵심입니다.
스택이란?
스택은 접시 쌓아놓은 것을 생각해 보세요. 접시는 쌓아놓거나 떼는 것은 쌓인 것의 정상에서만 할 수 있습니다. 컴퓨터 용어로는 스택에 추가하는 것을 "push"라고 하고, 스택에서 제거하는 것을 "pop"라고 합니다.
WebAssembly이 스택을 어떻게 사용하나요?
WebAssembly은 이 스택 개념을 사용하여 연산을 수행합니다. 매우 효율적인 요리사가 주방에서 일하는 것처럼, 항상 다음에 사용할 재료(또는 숫자)를 정확히 알고 있습니다.
간단한 예를 보겠습니다:
(module
(func $add (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add)
(export "add" (func $add))
)
이 것을 보고 당황하지 마세요! 지금은 이게 외계어처럼 보일 수 있지만, 차근차근 설명해 보겠습니다:
-
(module)
: "여기는 새로운 레시피책"이라고 말하는 것입니다. -
(func $add ...)
: "add"라는 새로운 함수(또는 레시피)를 정의합니다. -
(param $a i32) (param $b i32)
: 우리의 함수는 두 가지 재료(파라미터), 즉 32비트 정수를 받습니다. -
(result i32)
: 결과는 또한 32비트 정수입니다. -
local.get $a
: 첫 번째 숫자를 스택의 정상에 올립니다. -
local.get $b
: 두 번째 숫자를 첫 번째 숫자 위에 올립니다. -
i32.add
: 스택 정상의 두 숫자를 더하고, 그 결과로 대체합니다.
그래서 이 함수를 5와 3으로 호출하면, 스택은 다음과 같이 보입니다:
- 스택이 비어 있을 때:
[]
-
local.get $a
후:[5]
-
local.get $b
후:[5, 3]
-
i32.add
후:[8]
그렇게 하면! 우리는 WebAssembly의 스택 머신 모델을 사용하여 두 숫자를 더했습니다.
WebAssembly을 왜 사용하나요?
"이게 복잡해 보이는데, 왜 JavaScript를 그냥 사용하지 않나요?"라고 궁금해하실 수 있습니다.非常好的 질문입니다! WebAssembly은 다음과 같은 특별한 능력을 가지고 있습니다:
- 속도: 특정 작업에서 WebAssembly은 JavaScript보다 훨씬 빠를 수 있습니다.
- 효율성: 더 적은 메모리와 처리 능력을 사용합니다.
- 언어 유연성: C++나 Rust와 같은 언어로 코드를 작성하고 WebAssembly으로 변환할 수 있습니다.
sandcastle을 짓는 것을 생각해 보세요. JavaScript는 손으로 짓는 것처럼 - 유연하고 시작하기 쉬워요. WebAssembly은 특별한 도구 세트를 가지고 있는 것처럼 - 설정에는 시간이 걸리지만, 더 복잡하고 견고한 성을 짓는 데 사용할 수 있습니다!
첫 번째 WebAssembly 프로그램
이제 두 숫자를 더하는 간단한 프로그램을 작성해 보겠습니다. WebAssembly의 인간이 읽을 수 있는 형식인 WAT(WebAssembly Text Format)을 사용할 것입니다.
(module
(func $add (param $left i32) (param $right i32) (result i32)
local.get $left
local.get $right
i32.add)
(export "add" (func $add))
)
이 것은 우리의 이전 예제와 매우 유사합니다. 여기서는 다음을 합니다:
- 모듈(our program)을 정의합니다.
- 두 개의 32비트 정수를 받고 하나를 반환하는 함수
$add
를 생성합니다. - 첫 번째 숫자(
$left
)를 스택에 올립니다. - 두 번째 숫자(
$right
)를 첫 번째 숫자 위에 올립니다. - 스택에 있는 두 숫자를 더합니다.
- 함수를 내보내어 JavaScript에서 사용할 수 있도록 합니다.
이를 웹 페이지에서 사용하기 위해서는 다음과 같은 JavaScript 코드가 필요합니다:
fetch('add.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes))
.then(results => {
const add = results.instance.exports.add;
console.log(add(5, 3)); // 출력: 8
});
이 코드는 우리의 WebAssembly 모듈을 로드하고, 그 인스턴스를 생성한 다음, add
함수를 호출하여 숫자 5와 3을 더합니다.
결론
축하합니다! 지금까지 WebAssembly의 세상으로 첫 걸음을 냈습니다. 우리는 WebAssembly이 무엇인지, 스택 머신 모델을 어떻게 사용하는지, 그리고 첫 번째 WebAssembly 프로그램을 작성하는 방법을 다루었습니다.
코드를 배우는 것은 새로운 언어나 악기 배우는 것과 같아요 - 연습과 인내가 필요합니다. 모든 것이 한 번에 이해되지 않는다면 낙담하지 마세요. 계속 실험하고 배우면, 언제쯤 WebAssembly로 놀라운 것을 만들 수 있을 거예요!
다음 강의에서는 더 복잡한 WebAssembly 개념을 더 깊이 탐구하고, 정말 멋진 프로젝트를 시작해 보겠습니다. 그 전까지, 행복하게 코딩하세요!
WebAssembly 메서드 | 설명 |
---|---|
local.get |
로컬 변수나 파라미터를 검색합니다 |
local.set |
로컬 변수의 값을 설정합니다 |
i32.add |
두 개의 32비트 정수를 더합니다 |
i32.sub |
두 개의 32비트 정수를 뺍니다 |
i32.mul |
두 개의 32비트 정수를 곱합니다 |
i32.div_s |
두 개의 32비트 정수를 부호 있는除法합니다 |
i32.rem_s |
두 개의 32비트 정수의 부호 있는 나머지를 구합니다 |
i32.and |
두 개의 32비트 정수의 비트 연산 AND를 수행합니다 |
i32.or |
두 개의 32비트 정수의 비트 연산 OR를 수행합니다 |
i32.xor |
두 개의 32비트 정수의 비트 연산 XOR를 수행합니다 |
i32.shl |
32비트 정수를 왼쪽으로 이동합니다 |
i32.shr_s |
32비트 정수를 부호 있는 오른쪽으로 이동합니다 |
i32.eq |
두 개의 32비트 정수의 동등성을 비교합니다 |
i32.ne |
두 개의 32비트 정수의 불평등성을 비교합니다 |
i32.lt_s |
두 개의 32비트 정수의 부호 있는 작은 값 비교를 합니다 |
Credits: Image by storyset