{"componentChunkName":"component---src-templates-blog-post-js","path":"/javascript/WebAssembly-WASM-브라우저와-서버를-넘나드는-범용-런타임/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"345f2c99-b70a-5993-87bc-fefdc16cbc50","excerpt":"WebAssembly (WASM) - 브라우저와 서버를 넘나드는 범용 런타임 WebAssembly(WASM)는 웹에서 네이티브에 가까운 성능으로 코드를 실행할 수 있게 해주는 바이너리 명령어 형식이다. JavaScript와 함께 작동하며, C/C++, Rust, Go…","html":"<h1 id=\"webassembly-wasm---브라우저와-서버를-넘나드는-범용-런타임\" style=\"position:relative;\"><a href=\"#webassembly-wasm---%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84\" aria-label=\"webassembly wasm   브라우저와 서버를 넘나드는 범용 런타임 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>WebAssembly (WASM) - 브라우저와 서버를 넘나드는 범용 런타임</h1>\n<p>WebAssembly(WASM)는 웹에서 네이티브에 가까운 성능으로 코드를 실행할 수 있게 해주는 바이너리 명령어 형식이다. JavaScript와 함께 작동하며, C/C++, Rust, Go 등 다양한 언어로 작성된 코드를 웹에서 실행할 수 있게 한다. 이 글은 WebAssembly의 모든 것을 다룬다.</p>\n<h2 id=\"1-webassembly-개요\" style=\"position:relative;\"><a href=\"#1-webassembly-%EA%B0%9C%EC%9A%94\" aria-label=\"1 webassembly 개요 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. WebAssembly 개요</h2>\n<h3 id=\"1-1-webassembly란\" style=\"position:relative;\"><a href=\"#1-1-webassembly%EB%9E%80\" aria-label=\"1 1 webassembly란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-1. WebAssembly란?</h3>\n<p>WebAssembly는 다음과 같은 특징을 가진다:</p>\n<ul>\n<li><strong>고성능</strong>: 네이티브에 가까운 실행 속도</li>\n<li><strong>안전성</strong>: 샌드박스 환경에서 실행</li>\n<li><strong>다국어 지원</strong>: C/C++, Rust, Go, AssemblyScript 등</li>\n<li><strong>표준화</strong>: W3C 표준</li>\n<li><strong>브라우저/서버 지원</strong>: 모든 주요 브라우저와 Node.js 지원</li>\n</ul>\n<h3 id=\"1-2-javascript-vs-webassembly\" style=\"position:relative;\"><a href=\"#1-2-javascript-vs-webassembly\" aria-label=\"1 2 javascript vs webassembly permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-2. JavaScript vs WebAssembly</h3>\n<table>\n<thead>\n<tr>\n<th>구분</th>\n<th>JavaScript</th>\n<th>WebAssembly</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>타입</strong></td>\n<td>동적 타입</td>\n<td>정적 타입</td>\n</tr>\n<tr>\n<td><strong>파싱</strong></td>\n<td>텍스트 파싱 필요</td>\n<td>바이너리 직접 실행</td>\n</tr>\n<tr>\n<td><strong>성능</strong></td>\n<td>인터프리터/JIT</td>\n<td>네이티브에 가까움</td>\n</tr>\n<tr>\n<td><strong>메모리 관리</strong></td>\n<td>가비지 컬렉션</td>\n<td>수동 관리</td>\n</tr>\n<tr>\n<td><strong>디버깅</strong></td>\n<td>쉬움</td>\n<td>상대적으로 어려움</td>\n</tr>\n<tr>\n<td><strong>용도</strong></td>\n<td>범용</td>\n<td>계산 집약적 작업</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"1-3-webassembly-사용-사례\" style=\"position:relative;\"><a href=\"#1-3-webassembly-%EC%82%AC%EC%9A%A9-%EC%82%AC%EB%A1%80\" aria-label=\"1 3 webassembly 사용 사례 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-3. WebAssembly 사용 사례</h3>\n<ul>\n<li><strong>이미지/비디오 처리</strong>: 이미지 필터, 비디오 인코딩</li>\n<li><strong>게임 엔진</strong>: Unity, Unreal Engine</li>\n<li><strong>과학 계산</strong>: 수학 연산, 시뮬레이션</li>\n<li><strong>암호화</strong>: 암호화/복호화 작업</li>\n<li><strong>데이터 처리</strong>: 대용량 데이터 파싱</li>\n</ul>\n<h2 id=\"2-webassembly-기본-사용법\" style=\"position:relative;\"><a href=\"#2-webassembly-%EA%B8%B0%EB%B3%B8-%EC%82%AC%EC%9A%A9%EB%B2%95\" aria-label=\"2 webassembly 기본 사용법 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. WebAssembly 기본 사용법</h2>\n<h3 id=\"2-1-간단한-wasm-모듈-wat-형식\" style=\"position:relative;\"><a href=\"#2-1-%EA%B0%84%EB%8B%A8%ED%95%9C-wasm-%EB%AA%A8%EB%93%88-wat-%ED%98%95%EC%8B%9D\" aria-label=\"2 1 간단한 wasm 모듈 wat 형식 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-1. 간단한 WASM 모듈 (Wat 형식)</h3>\n<div class=\"gatsby-highlight\" data-language=\"wat\"><pre class=\"language-wat\"><code class=\"language-wat\">;; add.wat\n(module\n  (func $add (param $a i32) (param $b i32) (result i32)\n    local.get $a\n    local.get $b\n    i32.add)\n  (export &quot;add&quot; (func $add))\n)</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># Wat를 WASM으로 컴파일</span>\nwat2wasm add.wat <span class=\"token parameter variable\">-o</span> add.wasm</code></pre></div>\n<h3 id=\"2-2-javascript에서-wasm-로드\" style=\"position:relative;\"><a href=\"#2-2-javascript%EC%97%90%EC%84%9C-wasm-%EB%A1%9C%EB%93%9C\" aria-label=\"2 2 javascript에서 wasm 로드 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-2. JavaScript에서 WASM 로드</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// add.js</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">loadWasm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> wasmModule <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> WebAssembly<span class=\"token punctuation\">.</span><span class=\"token function\">instantiateStreaming</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'add.wasm'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> add <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> wasmModule<span class=\"token punctuation\">.</span>instance<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">;</span>\n  \n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 8</span>\n  <span class=\"token keyword\">return</span> wasmModule<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">loadWasm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"2-3-메모리-관리\" style=\"position:relative;\"><a href=\"#2-3-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC\" aria-label=\"2 3 메모리 관리 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-3. 메모리 관리</h3>\n<div class=\"gatsby-highlight\" data-language=\"wat\"><pre class=\"language-wat\"><code class=\"language-wat\">;; memory.wat\n(module\n  (memory 1)  ;; 1 페이지 (64KB) 메모리 할당\n  (export &quot;memory&quot; (memory 0))\n  \n  (func $store (param $offset i32) (param $value i32)\n    local.get $offset\n    local.get $value\n    i32.store)\n  \n  (func $load (param $offset i32) (result i32)\n    local.get $offset\n    i32.load)\n  \n  (export &quot;store&quot; (func $store))\n  (export &quot;load&quot; (func $load))\n)</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// memory.js</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">useMemory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> wasmModule <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> WebAssembly<span class=\"token punctuation\">.</span><span class=\"token function\">instantiateStreaming</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'memory.wasm'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> memory<span class=\"token punctuation\">,</span> store<span class=\"token punctuation\">,</span> load <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> wasmModule<span class=\"token punctuation\">.</span>instance<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// 메모리에 값 저장</span>\n  <span class=\"token function\">store</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">42</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">store</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// 메모리에서 값 읽기</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">load</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 42</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">load</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 100</span>\n  \n  <span class=\"token comment\">// JavaScript에서 직접 메모리 접근</span>\n  <span class=\"token keyword\">const</span> memoryView <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Int32Array</span><span class=\"token punctuation\">(</span>memory<span class=\"token punctuation\">.</span>buffer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>memoryView<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 42</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>memoryView<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 100</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"3-rust로-webassembly-빌드\" style=\"position:relative;\"><a href=\"#3-rust%EB%A1%9C-webassembly-%EB%B9%8C%EB%93%9C\" aria-label=\"3 rust로 webassembly 빌드 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Rust로 WebAssembly 빌드</h2>\n<h3 id=\"3-1-rust-프로젝트-설정\" style=\"position:relative;\"><a href=\"#3-1-rust-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%A4%EC%A0%95\" aria-label=\"3 1 rust 프로젝트 설정 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-1. Rust 프로젝트 설정</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># Rust 설치 확인</span>\nrustc <span class=\"token parameter variable\">--version</span>\n\n<span class=\"token comment\"># wasm-pack 설치</span>\n<span class=\"token function\">cargo</span> <span class=\"token function\">install</span> wasm-pack\n\n<span class=\"token comment\"># 새 프로젝트 생성</span>\n<span class=\"token function\">cargo</span> new <span class=\"token parameter variable\">--lib</span> wasm-example\n<span class=\"token builtin class-name\">cd</span> wasm-example</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"toml\"><pre class=\"language-toml\"><code class=\"language-toml\"><span class=\"token comment\"># Cargo.toml</span>\n<span class=\"token punctuation\">[</span><span class=\"token table class-name\">package</span><span class=\"token punctuation\">]</span>\n<span class=\"token key property\">name</span> <span class=\"token punctuation\">=</span> <span class=\"token string\">\"wasm-example\"</span>\n<span class=\"token key property\">version</span> <span class=\"token punctuation\">=</span> <span class=\"token string\">\"0.1.0\"</span>\n<span class=\"token key property\">edition</span> <span class=\"token punctuation\">=</span> <span class=\"token string\">\"2021\"</span>\n\n<span class=\"token punctuation\">[</span><span class=\"token table class-name\">lib</span><span class=\"token punctuation\">]</span>\n<span class=\"token key property\">crate-type</span> <span class=\"token punctuation\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"cdylib\"</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token punctuation\">[</span><span class=\"token table class-name\">dependencies</span><span class=\"token punctuation\">]</span>\n<span class=\"token key property\">wasm-bindgen</span> <span class=\"token punctuation\">=</span> <span class=\"token string\">\"0.2\"</span></code></pre></div>\n<h3 id=\"3-2-rust-코드-작성\" style=\"position:relative;\"><a href=\"#3-2-rust-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1\" aria-label=\"3 2 rust 코드 작성 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-2. Rust 코드 작성</h3>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">// src/lib.rs</span>\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">wasm_bindgen<span class=\"token punctuation\">::</span>prelude<span class=\"token punctuation\">::</span></span><span class=\"token operator\">*</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">i32</span> <span class=\"token punctuation\">{</span>\n    a <span class=\"token operator\">+</span> b\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">struct</span> <span class=\"token type-definition class-name\">Calculator</span> <span class=\"token punctuation\">{</span>\n    value<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">impl</span> <span class=\"token class-name\">Calculator</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token attribute attr-name\">#[wasm_bindgen(constructor)]</span>\n    <span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">new</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Calculator</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">Calculator</span> <span class=\"token punctuation\">{</span> value <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n    <span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">add</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> <span class=\"token keyword\">self</span><span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">:</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">i32</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>value <span class=\"token operator\">+=</span> n<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>value\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n    <span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">get_value</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token keyword\">self</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">i32</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>value\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">fibonacci</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">:</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">u64</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> n <span class=\"token keyword\">as</span> <span class=\"token keyword\">u64</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> a <span class=\"token operator\">=</span> <span class=\"token number\">0u64</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> b <span class=\"token operator\">=</span> <span class=\"token number\">1u64</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token number\">2</span><span class=\"token punctuation\">..=</span>n <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> temp <span class=\"token operator\">=</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n        a <span class=\"token operator\">=</span> b<span class=\"token punctuation\">;</span>\n        b <span class=\"token operator\">=</span> temp<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    b\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"3-3-빌드-및-사용\" style=\"position:relative;\"><a href=\"#3-3-%EB%B9%8C%EB%93%9C-%EB%B0%8F-%EC%82%AC%EC%9A%A9\" aria-label=\"3 3 빌드 및 사용 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-3. 빌드 및 사용</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># WASM 빌드</span>\nwasm-pack build <span class=\"token parameter variable\">--target</span> web\n\n<span class=\"token comment\"># 또는 Node.js용</span>\nwasm-pack build <span class=\"token parameter variable\">--target</span> nodejs\n\n<span class=\"token comment\"># 또는 브라우저 번들용</span>\nwasm-pack build <span class=\"token parameter variable\">--target</span> bundler</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// main.js</span>\n<span class=\"token keyword\">import</span> init<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> add<span class=\"token punctuation\">,</span> Calculator<span class=\"token punctuation\">,</span> fibonacci <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./wasm-example.js'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// WASM 모듈 초기화</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// 간단한 함수 호출</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 8</span>\n  \n  <span class=\"token comment\">// 클래스 사용</span>\n  <span class=\"token keyword\">const</span> calc <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Calculator</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>calc<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 15</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>calc<span class=\"token punctuation\">.</span><span class=\"token function\">get_value</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 15</span>\n  \n  <span class=\"token comment\">// 성능 비교</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token string\">'JavaScript Fibonacci'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">jsFibonacci</span><span class=\"token punctuation\">(</span><span class=\"token number\">40</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">timeEnd</span><span class=\"token punctuation\">(</span><span class=\"token string\">'JavaScript Fibonacci'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  console<span class=\"token punctuation\">.</span><span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token string\">'WASM Fibonacci'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span><span class=\"token number\">40</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">timeEnd</span><span class=\"token punctuation\">(</span><span class=\"token string\">'WASM Fibonacci'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">jsFibonacci</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> n<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">jsFibonacci</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token function\">jsFibonacci</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">-</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"3-4-javascript와-상호작용\" style=\"position:relative;\"><a href=\"#3-4-javascript%EC%99%80-%EC%83%81%ED%98%B8%EC%9E%91%EC%9A%A9\" aria-label=\"3 4 javascript와 상호작용 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-4. JavaScript와 상호작용</h3>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">// src/lib.rs</span>\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">wasm_bindgen<span class=\"token punctuation\">::</span>prelude<span class=\"token punctuation\">::</span></span><span class=\"token operator\">*</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">wasm_bindgen<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">JsValue</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">extern</span> <span class=\"token string\">\"C\"</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token attribute attr-name\">#[wasm_bindgen(js_namespace = console)]</span>\n    <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">log</span><span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">str</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token attribute attr-name\">#[wasm_bindgen(js_namespace = Math)]</span>\n    <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">f64</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">greet</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">str</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token macro property\">format!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello, {}!\"</span><span class=\"token punctuation\">,</span> name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">get_random_number</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token keyword\">f64</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// JavaScript 객체 사용</span>\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">process_array</span><span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">i32</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Vec</span><span class=\"token operator\">&lt;</span><span class=\"token keyword\">i32</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    arr<span class=\"token punctuation\">.</span><span class=\"token function\">iter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token closure-params\"><span class=\"token closure-punctuation punctuation\">|</span>x<span class=\"token closure-punctuation punctuation\">|</span></span> x <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">collect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// JavaScript 콜백</span>\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">process_with_callback</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">i32</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> callback<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token namespace\">js_sys<span class=\"token punctuation\">::</span></span><span class=\"token class-name\">Function</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">for</span> item <span class=\"token keyword\">in</span> data <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> callback<span class=\"token punctuation\">.</span><span class=\"token function\">call1</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token class-name\">JsValue</span><span class=\"token punctuation\">::</span><span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span><span class=\"token class-name\">JsValue</span><span class=\"token punctuation\">::</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span><span class=\"token operator\">*</span>item<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token macro property\">format!</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Callback result: {:?}\"</span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// main.js</span>\n<span class=\"token keyword\">import</span> init<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> greet<span class=\"token punctuation\">,</span> get_random_number<span class=\"token punctuation\">,</span> process_array<span class=\"token punctuation\">,</span> process_with_callback <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./wasm-example.js'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token function\">greet</span><span class=\"token punctuation\">(</span><span class=\"token string\">'WebAssembly'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">get_random_number</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">const</span> input <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> output <span class=\"token operator\">=</span> <span class=\"token function\">process_array</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [2, 4, 6, 8, 10]</span>\n  \n  <span class=\"token function\">process_with_callback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">x</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> x <span class=\"token operator\">*</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"4-go로-webassembly-빌드\" style=\"position:relative;\"><a href=\"#4-go%EB%A1%9C-webassembly-%EB%B9%8C%EB%93%9C\" aria-label=\"4 go로 webassembly 빌드 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. Go로 WebAssembly 빌드</h2>\n<h3 id=\"4-1-go-webassembly-설정\" style=\"position:relative;\"><a href=\"#4-1-go-webassembly-%EC%84%A4%EC%A0%95\" aria-label=\"4 1 go webassembly 설정 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-1. Go WebAssembly 설정</h3>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token comment\">// main.go</span>\n<span class=\"token keyword\">package</span> main\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"syscall/js\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>this js<span class=\"token punctuation\">.</span>Value<span class=\"token punctuation\">,</span> args <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>js<span class=\"token punctuation\">.</span>Value<span class=\"token punctuation\">)</span> <span class=\"token keyword\">interface</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> <span class=\"token punctuation\">{</span>\n    a <span class=\"token operator\">:=</span> args<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">Int</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    b <span class=\"token operator\">:=</span> args<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">Int</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>this js<span class=\"token punctuation\">.</span>Value<span class=\"token punctuation\">,</span> args <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>js<span class=\"token punctuation\">.</span>Value<span class=\"token punctuation\">)</span> <span class=\"token keyword\">interface</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> <span class=\"token punctuation\">{</span>\n    n <span class=\"token operator\">:=</span> args<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">Int</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> n\n    <span class=\"token punctuation\">}</span>\n    \n    a<span class=\"token punctuation\">,</span> b <span class=\"token operator\">:=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token operator\">:=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;=</span> n<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span> <span class=\"token punctuation\">{</span>\n        a<span class=\"token punctuation\">,</span> b <span class=\"token operator\">=</span> b<span class=\"token punctuation\">,</span> a<span class=\"token operator\">+</span>b\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> b\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    js<span class=\"token punctuation\">.</span><span class=\"token function\">Global</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">Set</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"wasmAdd\"</span><span class=\"token punctuation\">,</span> js<span class=\"token punctuation\">.</span><span class=\"token function\">FuncOf</span><span class=\"token punctuation\">(</span>add<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    js<span class=\"token punctuation\">.</span><span class=\"token function\">Global</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">Set</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"wasmFibonacci\"</span><span class=\"token punctuation\">,</span> js<span class=\"token punctuation\">.</span><span class=\"token function\">FuncOf</span><span class=\"token punctuation\">(</span>fibonacci<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\">// Go 프로그램이 종료되지 않도록 대기</span>\n    <span class=\"token operator\">&lt;-</span><span class=\"token function\">make</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">chan</span> <span class=\"token builtin\">bool</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># WASM 빌드</span>\n<span class=\"token assign-left variable\">GOOS</span><span class=\"token operator\">=</span>js <span class=\"token assign-left variable\">GOARCH</span><span class=\"token operator\">=</span>wasm go build <span class=\"token parameter variable\">-o</span> main.wasm main.go\n\n<span class=\"token comment\"># wasm_exec.js 복사 (Go 런타임)</span>\n<span class=\"token function\">cp</span> <span class=\"token string\">\"<span class=\"token variable\"><span class=\"token variable\">$(</span>go <span class=\"token function\">env</span> GOROOT<span class=\"token variable\">)</span></span>/misc/wasm/wasm_exec.js\"</span> <span class=\"token builtin class-name\">.</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&lt;!-- index.html --></span>\n<span class=\"token doctype\"><span class=\"token punctuation\">&lt;!</span><span class=\"token doctype-tag\">DOCTYPE</span> <span class=\"token name\">html</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">charset</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>utf-8<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>wasm_exec.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\">\n        <span class=\"token keyword\">const</span> go <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Go</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        WebAssembly<span class=\"token punctuation\">.</span><span class=\"token function\">instantiateStreaming</span><span class=\"token punctuation\">(</span><span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"main.wasm\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> go<span class=\"token punctuation\">.</span>importObject<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n                go<span class=\"token punctuation\">.</span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">.</span>instance<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                \n                <span class=\"token comment\">// Go 함수 호출</span>\n                console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">wasmAdd</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 8</span>\n                console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">wasmFibonacci</span><span class=\"token punctuation\">(</span><span class=\"token number\">40</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    </span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h3 id=\"4-2-go에서-dom-조작\" style=\"position:relative;\"><a href=\"#4-2-go%EC%97%90%EC%84%9C-dom-%EC%A1%B0%EC%9E%91\" aria-label=\"4 2 go에서 dom 조작 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-2. Go에서 DOM 조작</h3>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token comment\">// dom.go</span>\n<span class=\"token keyword\">package</span> main\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"syscall/js\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token function\">updateDOM</span><span class=\"token punctuation\">(</span>this js<span class=\"token punctuation\">.</span>Value<span class=\"token punctuation\">,</span> args <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>js<span class=\"token punctuation\">.</span>Value<span class=\"token punctuation\">)</span> <span class=\"token keyword\">interface</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> <span class=\"token punctuation\">{</span>\n    document <span class=\"token operator\">:=</span> js<span class=\"token punctuation\">.</span><span class=\"token function\">Global</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">Get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"document\"</span><span class=\"token punctuation\">)</span>\n    element <span class=\"token operator\">:=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">Call</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"getElementById\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"output\"</span><span class=\"token punctuation\">)</span>\n    element<span class=\"token punctuation\">.</span><span class=\"token function\">Set</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"innerHTML\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Hello from WebAssembly!\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">nil</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    js<span class=\"token punctuation\">.</span><span class=\"token function\">Global</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">Set</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"updateDOM\"</span><span class=\"token punctuation\">,</span> js<span class=\"token punctuation\">.</span><span class=\"token function\">FuncOf</span><span class=\"token punctuation\">(</span>updateDOM<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token operator\">&lt;-</span><span class=\"token function\">make</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">chan</span> <span class=\"token builtin\">bool</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"5-assemblyscript\" style=\"position:relative;\"><a href=\"#5-assemblyscript\" aria-label=\"5 assemblyscript permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. AssemblyScript</h2>\n<h3 id=\"5-1-assemblyscript-프로젝트-설정\" style=\"position:relative;\"><a href=\"#5-1-assemblyscript-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%A4%EC%A0%95\" aria-label=\"5 1 assemblyscript 프로젝트 설정 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-1. AssemblyScript 프로젝트 설정</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># AssemblyScript 설치</span>\n<span class=\"token function\">npm</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">-g</span> assemblyscript\n\n<span class=\"token comment\"># 프로젝트 초기화</span>\n<span class=\"token function\">mkdir</span> as-project <span class=\"token operator\">&amp;&amp;</span> <span class=\"token builtin class-name\">cd</span> as-project\n<span class=\"token function\">npm</span> init <span class=\"token parameter variable\">-y</span>\n<span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev assemblyscript\nnpx asinit <span class=\"token builtin class-name\">.</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// assembly/index.ts</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> i32<span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> i32<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> i32 <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">:</span> i32<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> i32 <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> n<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">let</span> a<span class=\"token operator\">:</span> i32 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> b<span class=\"token operator\">:</span> i32 <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i<span class=\"token operator\">:</span> i32 <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;=</span> n<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> temp <span class=\"token operator\">=</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n    a <span class=\"token operator\">=</span> b<span class=\"token punctuation\">;</span>\n    b <span class=\"token operator\">=</span> temp<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">return</span> b<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 메모리 조작</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">processArray</span><span class=\"token punctuation\">(</span>arr<span class=\"token operator\">:</span> Int32Array<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> i32 <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> sum<span class=\"token operator\">:</span> i32 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> arr<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    sum <span class=\"token operator\">+=</span> arr<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> sum<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># 빌드</span>\n<span class=\"token function\">npm</span> run asbuild</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// loader.js</span>\n<span class=\"token keyword\">const</span> fs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fs\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> loader <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"@assemblyscript/loader\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> imports <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">/* imports */</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> wasmModule <span class=\"token operator\">=</span> loader<span class=\"token punctuation\">.</span><span class=\"token function\">instantiateSync</span><span class=\"token punctuation\">(</span>\n  fs<span class=\"token punctuation\">.</span><span class=\"token function\">readFileSync</span><span class=\"token punctuation\">(</span>__dirname <span class=\"token operator\">+</span> <span class=\"token string\">\"/build/optimized.wasm\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  imports\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> wasmModule<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"6-nodejs에서-webassembly-사용\" style=\"position:relative;\"><a href=\"#6-nodejs%EC%97%90%EC%84%9C-webassembly-%EC%82%AC%EC%9A%A9\" aria-label=\"6 nodejs에서 webassembly 사용 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. Node.js에서 WebAssembly 사용</h2>\n<h3 id=\"6-1-nodejs에서-wasm-로드\" style=\"position:relative;\"><a href=\"#6-1-nodejs%EC%97%90%EC%84%9C-wasm-%EB%A1%9C%EB%93%9C\" aria-label=\"6 1 nodejs에서 wasm 로드 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-1. Node.js에서 WASM 로드</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// node-wasm.js</span>\n<span class=\"token keyword\">const</span> fs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> instantiateSync <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'@assemblyscript/loader'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 동기 로드</span>\n<span class=\"token keyword\">const</span> wasmModule <span class=\"token operator\">=</span> <span class=\"token function\">instantiateSync</span><span class=\"token punctuation\">(</span>\n  fs<span class=\"token punctuation\">.</span><span class=\"token function\">readFileSync</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./add.wasm'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>wasmModule<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 8</span></code></pre></div>\n<h3 id=\"6-2-비동기-로드\" style=\"position:relative;\"><a href=\"#6-2-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%A1%9C%EB%93%9C\" aria-label=\"6 2 비동기 로드 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-2. 비동기 로드</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// async-wasm.js</span>\n<span class=\"token keyword\">const</span> fs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>promises<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">loadWasm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> wasmBuffer <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> fs<span class=\"token punctuation\">.</span><span class=\"token function\">readFile</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./add.wasm'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> wasmModule <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> WebAssembly<span class=\"token punctuation\">.</span><span class=\"token function\">instantiate</span><span class=\"token punctuation\">(</span>wasmBuffer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> add <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> wasmModule<span class=\"token punctuation\">.</span>instance<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">loadWasm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"6-3-rust로-nodejs-모듈-빌드\" style=\"position:relative;\"><a href=\"#6-3-rust%EB%A1%9C-nodejs-%EB%AA%A8%EB%93%88-%EB%B9%8C%EB%93%9C\" aria-label=\"6 3 rust로 nodejs 모듈 빌드 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-3. Rust로 Node.js 모듈 빌드</h3>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">// src/lib.rs</span>\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">wasm_bindgen<span class=\"token punctuation\">::</span>prelude<span class=\"token punctuation\">::</span></span><span class=\"token operator\">*</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">process_data</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">u8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Vec</span><span class=\"token operator\">&lt;</span><span class=\"token keyword\">u8</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 데이터 처리 로직</span>\n    input<span class=\"token punctuation\">.</span><span class=\"token function\">iter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token closure-params\"><span class=\"token closure-punctuation punctuation\">|</span>b<span class=\"token closure-punctuation punctuation\">|</span></span> b<span class=\"token punctuation\">.</span><span class=\"token function\">wrapping_add</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">collect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># Node.js 타겟으로 빌드</span>\nwasm-pack build <span class=\"token parameter variable\">--target</span> nodejs</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// node-main.js</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> process_data <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./wasm-example'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> input <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Uint8Array</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> output <span class=\"token operator\">=</span> <span class=\"token function\">process_data</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [2, 3, 4, 5, 6]</span></code></pre></div>\n<h2 id=\"7-성능-최적화\" style=\"position:relative;\"><a href=\"#7-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94\" aria-label=\"7 성능 최적화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. 성능 최적화</h2>\n<h3 id=\"7-1-메모리-최적화\" style=\"position:relative;\"><a href=\"#7-1-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%B5%9C%EC%A0%81%ED%99%94\" aria-label=\"7 1 메모리 최적화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-1. 메모리 최적화</h3>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">// src/lib.rs</span>\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">wasm_bindgen<span class=\"token punctuation\">::</span>prelude<span class=\"token punctuation\">::</span></span><span class=\"token operator\">*</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">struct</span> <span class=\"token type-definition class-name\">ImageProcessor</span> <span class=\"token punctuation\">{</span>\n    width<span class=\"token punctuation\">:</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span>\n    height<span class=\"token punctuation\">:</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span>\n    data<span class=\"token punctuation\">:</span> <span class=\"token class-name\">Vec</span><span class=\"token operator\">&lt;</span><span class=\"token keyword\">u8</span><span class=\"token operator\">></span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">impl</span> <span class=\"token class-name\">ImageProcessor</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token attribute attr-name\">#[wasm_bindgen(constructor)]</span>\n    <span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">new</span><span class=\"token punctuation\">(</span>width<span class=\"token punctuation\">:</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span> height<span class=\"token punctuation\">:</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">ImageProcessor</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> size <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>width <span class=\"token operator\">*</span> height <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">usize</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">ImageProcessor</span> <span class=\"token punctuation\">{</span>\n            width<span class=\"token punctuation\">,</span>\n            height<span class=\"token punctuation\">,</span>\n            data<span class=\"token punctuation\">:</span> <span class=\"token macro property\">vec!</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> size<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n    <span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">get_data_ptr</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token keyword\">self</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token operator\">*</span><span class=\"token keyword\">const</span> <span class=\"token keyword\">u8</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">as_ptr</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n    <span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">process</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> <span class=\"token keyword\">self</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 이미지 처리 로직</span>\n        <span class=\"token keyword\">for</span> pixel <span class=\"token keyword\">in</span> <span class=\"token keyword\">self</span><span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">chunks_exact_mut</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// RGBA 처리</span>\n            pixel<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> pixel<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">saturating_add</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// R</span>\n            pixel<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> pixel<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">saturating_add</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// G</span>\n            pixel<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> pixel<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">saturating_add</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// B</span>\n            <span class=\"token comment\">// pixel[3]는 Alpha, 변경하지 않음</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"7-2-병렬-처리-web-workers\" style=\"position:relative;\"><a href=\"#7-2-%EB%B3%91%EB%A0%AC-%EC%B2%98%EB%A6%AC-web-workers\" aria-label=\"7 2 병렬 처리 web workers permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-2. 병렬 처리 (Web Workers)</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// worker.js</span>\nself<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onmessage</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> wasmModule<span class=\"token punctuation\">,</span> data <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// WASM 모듈에서 처리</span>\n  <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> wasmModule<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">.</span><span class=\"token function\">process</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  self<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> result <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// main.js</span>\n<span class=\"token keyword\">const</span> worker <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Worker</span><span class=\"token punctuation\">(</span><span class=\"token string\">'worker.js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">processInWorker</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> wasmModule <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> WebAssembly<span class=\"token punctuation\">.</span><span class=\"token function\">instantiateStreaming</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'processor.wasm'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    worker<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onmessage</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    \n    worker<span class=\"token punctuation\">.</span><span class=\"token function\">postMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> wasmModule<span class=\"token punctuation\">,</span> data <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"8-실전-프로젝트-예제\" style=\"position:relative;\"><a href=\"#8-%EC%8B%A4%EC%A0%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%98%88%EC%A0%9C\" aria-label=\"8 실전 프로젝트 예제 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. 실전 프로젝트 예제</h2>\n<h3 id=\"8-1-이미지-필터-애플리케이션\" style=\"position:relative;\"><a href=\"#8-1-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%95%84%ED%84%B0-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98\" aria-label=\"8 1 이미지 필터 애플리케이션 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8-1. 이미지 필터 애플리케이션</h3>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">// src/lib.rs</span>\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">wasm_bindgen<span class=\"token punctuation\">::</span>prelude<span class=\"token punctuation\">::</span></span><span class=\"token operator\">*</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">apply_grayscale</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">u8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> output<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> <span class=\"token punctuation\">[</span><span class=\"token keyword\">u8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token number\">0</span><span class=\"token punctuation\">..</span>input<span class=\"token punctuation\">.</span><span class=\"token function\">len</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">4</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> r <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span>i <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">f32</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">let</span> g <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span>i <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">f32</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">let</span> b <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span>i <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">f32</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token keyword\">let</span> gray <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0.299</span> <span class=\"token operator\">*</span> r <span class=\"token operator\">+</span> <span class=\"token number\">0.587</span> <span class=\"token operator\">*</span> g <span class=\"token operator\">+</span> <span class=\"token number\">0.114</span> <span class=\"token operator\">*</span> b<span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u8</span><span class=\"token punctuation\">;</span>\n        \n        output<span class=\"token punctuation\">[</span>i <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> gray<span class=\"token punctuation\">;</span>\n        output<span class=\"token punctuation\">[</span>i <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> gray<span class=\"token punctuation\">;</span>\n        output<span class=\"token punctuation\">[</span>i <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> gray<span class=\"token punctuation\">;</span>\n        output<span class=\"token punctuation\">[</span>i <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span>i <span class=\"token operator\">*</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">apply_blur</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">u8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> output<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token keyword\">mut</span> <span class=\"token punctuation\">[</span><span class=\"token keyword\">u8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> width<span class=\"token punctuation\">:</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span> height<span class=\"token punctuation\">:</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">,</span> radius<span class=\"token punctuation\">:</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 블러 필터 구현</span>\n    <span class=\"token comment\">// (간단한 박스 블러 예시)</span>\n    <span class=\"token keyword\">for</span> y <span class=\"token keyword\">in</span> <span class=\"token number\">0</span><span class=\"token punctuation\">..</span>height <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> <span class=\"token number\">0</span><span class=\"token punctuation\">..</span>width <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> r_sum <span class=\"token operator\">=</span> <span class=\"token number\">0u32</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> g_sum <span class=\"token operator\">=</span> <span class=\"token number\">0u32</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> b_sum <span class=\"token operator\">=</span> <span class=\"token number\">0u32</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> count <span class=\"token operator\">=</span> <span class=\"token number\">0u32</span><span class=\"token punctuation\">;</span>\n            \n            <span class=\"token keyword\">for</span> dy <span class=\"token keyword\">in</span> <span class=\"token operator\">-</span><span class=\"token punctuation\">(</span>radius <span class=\"token keyword\">as</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">..=</span><span class=\"token punctuation\">(</span>radius <span class=\"token keyword\">as</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">for</span> dx <span class=\"token keyword\">in</span> <span class=\"token operator\">-</span><span class=\"token punctuation\">(</span>radius <span class=\"token keyword\">as</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">..=</span><span class=\"token punctuation\">(</span>radius <span class=\"token keyword\">as</span> <span class=\"token keyword\">i32</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    <span class=\"token keyword\">let</span> nx <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>x <span class=\"token keyword\">as</span> <span class=\"token keyword\">i32</span> <span class=\"token operator\">+</span> dx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">max</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">min</span><span class=\"token punctuation\">(</span>width <span class=\"token keyword\">as</span> <span class=\"token keyword\">i32</span> <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">;</span>\n                    <span class=\"token keyword\">let</span> ny <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>y <span class=\"token keyword\">as</span> <span class=\"token keyword\">i32</span> <span class=\"token operator\">+</span> dy<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">max</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">min</span><span class=\"token punctuation\">(</span>height <span class=\"token keyword\">as</span> <span class=\"token keyword\">i32</span> <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">;</span>\n                    \n                    <span class=\"token keyword\">let</span> idx <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>ny <span class=\"token operator\">*</span> width <span class=\"token operator\">+</span> nx<span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">usize</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">;</span>\n                    r_sum <span class=\"token operator\">+=</span> input<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">;</span>\n                    g_sum <span class=\"token operator\">+=</span> input<span class=\"token punctuation\">[</span>idx <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">;</span>\n                    b_sum <span class=\"token operator\">+=</span> input<span class=\"token punctuation\">[</span>idx <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u32</span><span class=\"token punctuation\">;</span>\n                    count <span class=\"token operator\">+=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">}</span>\n            \n            <span class=\"token keyword\">let</span> idx <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>y <span class=\"token operator\">*</span> width <span class=\"token operator\">+</span> x<span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">usize</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">;</span>\n            output<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>r_sum <span class=\"token operator\">/</span> count<span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u8</span><span class=\"token punctuation\">;</span>\n            output<span class=\"token punctuation\">[</span>idx <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>g_sum <span class=\"token operator\">/</span> count<span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u8</span><span class=\"token punctuation\">;</span>\n            output<span class=\"token punctuation\">[</span>idx <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>b_sum <span class=\"token operator\">/</span> count<span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> <span class=\"token keyword\">u8</span><span class=\"token punctuation\">;</span>\n            output<span class=\"token punctuation\">[</span>idx <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span>idx <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// image-processor.js</span>\n<span class=\"token keyword\">import</span> init<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> apply_grayscale<span class=\"token punctuation\">,</span> apply_blur <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./image-processor.js'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">processImage</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">imageData</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">const</span> input <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Uint8Array</span><span class=\"token punctuation\">(</span>imageData<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> output <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Uint8Array</span><span class=\"token punctuation\">(</span>imageData<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// 그레이스케일 적용</span>\n  <span class=\"token function\">apply_grayscale</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">,</span> output<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// 또는 블러 적용</span>\n  <span class=\"token comment\">// apply_blur(input, output, imageData.width, imageData.height, 5);</span>\n  \n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ImageData</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">new</span> <span class=\"token class-name\">Uint8ClampedArray</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    imageData<span class=\"token punctuation\">.</span>width<span class=\"token punctuation\">,</span>\n    imageData<span class=\"token punctuation\">.</span>height\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"8-2-암호화-라이브러리\" style=\"position:relative;\"><a href=\"#8-2-%EC%95%94%ED%98%B8%ED%99%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC\" aria-label=\"8 2 암호화 라이브러리 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8-2. 암호화 라이브러리</h3>\n<div class=\"gatsby-highlight\" data-language=\"rust\"><pre class=\"language-rust\"><code class=\"language-rust\"><span class=\"token comment\">// src/lib.rs</span>\n<span class=\"token keyword\">use</span> <span class=\"token namespace\">wasm_bindgen<span class=\"token punctuation\">::</span>prelude<span class=\"token punctuation\">::</span></span><span class=\"token operator\">*</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">encrypt</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">u8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> key<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">u8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Vec</span><span class=\"token operator\">&lt;</span><span class=\"token keyword\">u8</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> <span class=\"token keyword\">mut</span> result <span class=\"token operator\">=</span> <span class=\"token class-name\">Vec</span><span class=\"token punctuation\">::</span><span class=\"token function\">with_capacity</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">len</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>byte<span class=\"token punctuation\">)</span> <span class=\"token keyword\">in</span> data<span class=\"token punctuation\">.</span><span class=\"token function\">iter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">enumerate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> key_byte <span class=\"token operator\">=</span> key<span class=\"token punctuation\">[</span>i <span class=\"token operator\">%</span> key<span class=\"token punctuation\">.</span><span class=\"token function\">len</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        result<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>byte <span class=\"token operator\">^</span> key_byte<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    result\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token attribute attr-name\">#[wasm_bindgen]</span>\n<span class=\"token keyword\">pub</span> <span class=\"token keyword\">fn</span> <span class=\"token function-definition function\">decrypt</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">u8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> key<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span><span class=\"token punctuation\">[</span><span class=\"token keyword\">u8</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">-></span> <span class=\"token class-name\">Vec</span><span class=\"token operator\">&lt;</span><span class=\"token keyword\">u8</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">encrypt</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> key<span class=\"token punctuation\">)</span> <span class=\"token comment\">// XOR은 암호화와 복호화가 동일</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"9-디버깅과-프로파일링\" style=\"position:relative;\"><a href=\"#9-%EB%94%94%EB%B2%84%EA%B9%85%EA%B3%BC-%ED%94%84%EB%A1%9C%ED%8C%8C%EC%9D%BC%EB%A7%81\" aria-label=\"9 디버깅과 프로파일링 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9. 디버깅과 프로파일링</h2>\n<h3 id=\"9-1-소스-맵-사용\" style=\"position:relative;\"><a href=\"#9-1-%EC%86%8C%EC%8A%A4-%EB%A7%B5-%EC%82%AC%EC%9A%A9\" aria-label=\"9 1 소스 맵 사용 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9-1. 소스 맵 사용</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># Rust 빌드 시 소스 맵 생성</span>\nwasm-pack build <span class=\"token parameter variable\">--target</span> web -- <span class=\"token parameter variable\">--features</span> wasm-bindgen/debug</code></pre></div>\n<h3 id=\"9-2-성능-측정\" style=\"position:relative;\"><a href=\"#9-2-%EC%84%B1%EB%8A%A5-%EC%B8%A1%EC%A0%95\" aria-label=\"9 2 성능 측정 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9-2. 성능 측정</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// performance.js</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">measurePerformance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> wasmModule <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> WebAssembly<span class=\"token punctuation\">.</span><span class=\"token function\">instantiateStreaming</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'compute.wasm'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> compute <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> wasmModule<span class=\"token punctuation\">.</span>instance<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// 성능 측정</span>\n  performance<span class=\"token punctuation\">.</span><span class=\"token function\">mark</span><span class=\"token punctuation\">(</span><span class=\"token string\">'wasm-start'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token function\">compute</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  performance<span class=\"token punctuation\">.</span><span class=\"token function\">mark</span><span class=\"token punctuation\">(</span><span class=\"token string\">'wasm-end'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  performance<span class=\"token punctuation\">.</span><span class=\"token function\">measure</span><span class=\"token punctuation\">(</span><span class=\"token string\">'wasm-compute'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'wasm-start'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'wasm-end'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">const</span> measure <span class=\"token operator\">=</span> performance<span class=\"token punctuation\">.</span><span class=\"token function\">getEntriesByName</span><span class=\"token punctuation\">(</span><span class=\"token string\">'wasm-compute'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">WASM execution time: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>measure<span class=\"token punctuation\">.</span>duration<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">ms</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"10-결론\" style=\"position:relative;\"><a href=\"#10-%EA%B2%B0%EB%A1%A0\" aria-label=\"10 결론 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10. 결론</h2>\n<p>WebAssembly는 웹과 서버에서 고성능 코드 실행을 가능하게 하는 강력한 기술이다. 이 글에서 다룬 내용:</p>\n<ol>\n<li><strong>기본 개념</strong>: WASM 아키텍처, Wat 형식</li>\n<li><strong>Rust로 빌드</strong>: wasm-pack, wasm-bindgen</li>\n<li><strong>Go로 빌드</strong>: GOROOT, wasm_exec.js</li>\n<li><strong>AssemblyScript</strong>: TypeScript 기반 WASM</li>\n<li><strong>Node.js 통합</strong>: 서버 사이드 활용</li>\n<li><strong>성능 최적화</strong>: 메모리 관리, 병렬 처리</li>\n<li><strong>실전 예제</strong>: 이미지 처리, 암호화</li>\n<li><strong>디버깅</strong>: 소스 맵, 프로파일링</li>\n</ol>\n<p>이러한 기능들을 활용하면 웹 애플리케이션의 성능을 크게 향상시킬 수 있다.</p>\n<h2 id=\"참고-자료\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\" aria-label=\"참고 자료 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>참고 자료</h2>\n<ul>\n<li><a href=\"https://webassembly.org/\">WebAssembly 공식 사이트</a></li>\n<li><a href=\"https://rustwasm.github.io/book/\">Rust와 WebAssembly</a></li>\n<li><a href=\"https://www.assemblyscript.org/\">AssemblyScript 문서</a></li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/WebAssembly\">MDN WebAssembly 가이드</a></li>\n</ul>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#webassembly-wasm---%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84\">WebAssembly (WASM) - 브라우저와 서버를 넘나드는 범용 런타임</a></p>\n<ul>\n<li>\n<p><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#1-webassembly-%EA%B0%9C%EC%9A%94\">1. WebAssembly 개요</a></p>\n<ul>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#1-1-webassembly%EB%9E%80\">1-1. WebAssembly란?</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#1-2-javascript-vs-webassembly\">1-2. JavaScript vs WebAssembly</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#1-3-webassembly-%EC%82%AC%EC%9A%A9-%EC%82%AC%EB%A1%80\">1-3. WebAssembly 사용 사례</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#2-webassembly-%EA%B8%B0%EB%B3%B8-%EC%82%AC%EC%9A%A9%EB%B2%95\">2. WebAssembly 기본 사용법</a></p>\n<ul>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#2-1-%EA%B0%84%EB%8B%A8%ED%95%9C-wasm-%EB%AA%A8%EB%93%88-wat-%ED%98%95%EC%8B%9D\">2-1. 간단한 WASM 모듈 (Wat 형식)</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#2-2-javascript%EC%97%90%EC%84%9C-wasm-%EB%A1%9C%EB%93%9C\">2-2. JavaScript에서 WASM 로드</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#2-3-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC\">2-3. 메모리 관리</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#3-rust%EB%A1%9C-webassembly-%EB%B9%8C%EB%93%9C\">3. Rust로 WebAssembly 빌드</a></p>\n<ul>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#3-1-rust-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%A4%EC%A0%95\">3-1. Rust 프로젝트 설정</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#3-2-rust-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1\">3-2. Rust 코드 작성</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#3-3-%EB%B9%8C%EB%93%9C-%EB%B0%8F-%EC%82%AC%EC%9A%A9\">3-3. 빌드 및 사용</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#3-4-javascript%EC%99%80-%EC%83%81%ED%98%B8%EC%9E%91%EC%9A%A9\">3-4. JavaScript와 상호작용</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#4-go%EB%A1%9C-webassembly-%EB%B9%8C%EB%93%9C\">4. Go로 WebAssembly 빌드</a></p>\n<ul>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#4-1-go-webassembly-%EC%84%A4%EC%A0%95\">4-1. Go WebAssembly 설정</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#4-2-go%EC%97%90%EC%84%9C-dom-%EC%A1%B0%EC%9E%91\">4-2. Go에서 DOM 조작</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#5-assemblyscript\">5. AssemblyScript</a></p>\n<ul>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#5-1-assemblyscript-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%A4%EC%A0%95\">5-1. AssemblyScript 프로젝트 설정</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#6-nodejs%EC%97%90%EC%84%9C-webassembly-%EC%82%AC%EC%9A%A9\">6. Node.js에서 WebAssembly 사용</a></p>\n<ul>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#6-1-nodejs%EC%97%90%EC%84%9C-wasm-%EB%A1%9C%EB%93%9C\">6-1. Node.js에서 WASM 로드</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#6-2-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%A1%9C%EB%93%9C\">6-2. 비동기 로드</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#6-3-rust%EB%A1%9C-nodejs-%EB%AA%A8%EB%93%88-%EB%B9%8C%EB%93%9C\">6-3. Rust로 Node.js 모듈 빌드</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#7-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94\">7. 성능 최적화</a></p>\n<ul>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#7-1-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%B5%9C%EC%A0%81%ED%99%94\">7-1. 메모리 최적화</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#7-2-%EB%B3%91%EB%A0%AC-%EC%B2%98%EB%A6%AC-web-workers\">7-2. 병렬 처리 (Web Workers)</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#8-%EC%8B%A4%EC%A0%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%98%88%EC%A0%9C\">8. 실전 프로젝트 예제</a></p>\n<ul>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#8-1-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%95%84%ED%84%B0-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98\">8-1. 이미지 필터 애플리케이션</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#8-2-%EC%95%94%ED%98%B8%ED%99%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC\">8-2. 암호화 라이브러리</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#9-%EB%94%94%EB%B2%84%EA%B9%85%EA%B3%BC-%ED%94%84%EB%A1%9C%ED%8C%8C%EC%9D%BC%EB%A7%81\">9. 디버깅과 프로파일링</a></p>\n<ul>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#9-1-%EC%86%8C%EC%8A%A4-%EB%A7%B5-%EC%82%AC%EC%9A%A9\">9-1. 소스 맵 사용</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#9-2-%EC%84%B1%EB%8A%A5-%EC%B8%A1%EC%A0%95\">9-2. 성능 측정</a></li>\n</ul>\n</li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#10-%EA%B2%B0%EB%A1%A0\">10. 결론</a></li>\n<li><a href=\"/javascript/WebAssembly-WASM-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%99%80-%EC%84%9C%EB%B2%84%EB%A5%BC-%EB%84%98%EB%82%98%EB%93%9C%EB%8A%94-%EB%B2%94%EC%9A%A9-%EB%9F%B0%ED%83%80%EC%9E%84/#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\">참고 자료</a></li>\n</ul>\n</li>\n</ul>","wordCount":{"words":293},"fields":{"slug":"/javascript/WebAssembly-WASM-브라우저와-서버를-넘나드는-범용-런타임/","image":null,"faq":[]},"frontmatter":{"title":"WebAssembly (WASM) - 브라우저와 서버를 넘나드는 범용 런타임","date":"2025년 12월 7일","dateISO":"2025-12-07T00:00:00.000Z","updatedISO":null,"category":"javascript","description":"WebAssembly 기초부터 고급 활용까지. WASM 모듈 작성, JavaScript와의 상호작용, 성능 최적화, Rust/Go로 WASM 빌드, Node.js 서버 사이드 활용, 실전 프로젝트 예제까지 완벽하게 다룹니다.","tags":["WebAssembly","WASM","JavaScript","Rust","Go","고성능","브라우저","Node.js","컴파일"]}}},"pageContext":{"slug":"/javascript/WebAssembly-WASM-브라우저와-서버를-넘나드는-범용-런타임/","previous":{"fields":{"slug":"/javascript/웹-게임-개발-기술-스택-완전정복-실전-가이드/"},"frontmatter":{"title":"웹 게임 개발 기술 스택 완전정복 - 실전 가이드","tags":["웹 게임","게임 개발","Phaser","Three.js","Babylon.js","Unity WebGL","Canvas API","WebGL","게임 엔진","JavaScript","HTML5 게임"]}},"next":{"fields":{"slug":"/etc/gRPC-완전정복-고성능-마이크로서비스-통신의-새로운-패러다임/"},"frontmatter":{"title":"gRPC 완전정복 - 고성능 마이크로서비스 통신의 새로운 패러다임","tags":["gRPC","Protocol Buffers","마이크로서비스","고성능 통신","RPC","스트리밍","Spring Boot","분산 시스템"]}}}},"staticQueryHashes":["213619243","3262363727"]}