안녕하세요 @heejin입니다. 최근에 [WebAssembly에 대한 소개글](https://steemit.com/kr-dev/@heejin/webassembly)을 올린적이 있는데요. 오늘은 제가 WebAssembly를 사용한 과정에 대해서 올려보려고 합니다. 저는 보통 완전한 학습 목적의 코딩보다는 실용적인 목적으로 코딩을 할 때가 많은데요. 이번에 WebAssembly를 사용해보려고 한 것도 그런 의도가 있었습니다. 인터넷에는 이미지를 압축해주는 사이트가 많은데요. 특히 저는 GIF를 압축해주는 사이트를 자주 이용합니다. 그런데 기존의 GIF 압축 사이트는 단점이 하나 있어요. 바로 내 GIF 파일을 업로드하고, 서버에서 압축한 다음, 내가 다시 내려받아야 한다는 점이죠. 서버가 내 GIF 이미지를 몰래 빼돌릴 가능성도 있고, 업로드/다운로드 과정이 필요하기 때문에 시간이 많이 걸립니다. 저는 WebAssembly를 이용해서 이런 문제들을 해결할 수 있을거라 생각했습니다. WebAssembly를 이용하면 서버에 업로드하지 않고, 사용자의 브라우저 단에서 네이티브의 속도로 GIF를 압축할 수 있기 때문에 서버에 올리는 방식에 비해 다음과 같은 이점이 생깁니다: - 업로드/다운로드 트래픽이 없기 때문에 서버 유지비가 굉장히 많이 줄어든다. - 업로드/다운로드가 없기 때문에 사용자 입장에서도 빠른 속도로 서비스를 이용할 수 있고, 보안 이슈도 거의 없다. WebAssembly를 이용하는게 업로드/다운로드 방식보다 거의 모든 면에서 이득인 방식으로 보였습니다. 그래서 바로 만들어보기로 결정했습니다. 원래 GIF 압축 서비스를 WebAssembly를 이용해서 어떻게 만들었는지, 그 과정을 다 설명해드리려고 했는데, 엄청나게 길어질 것 같아서 이번에는 간단하게 WebAssembly 사용법에 대해서만 알려드리겠습니다. ## WebAssembly 사용하기 저는 C로 구성된 GIF 라이브러리를 WebAssembly로 빌드해보기로 했습니다. [giflossy(fork of gifsicle)](https://github.com/pornel/giflossy)라는 라이브러리를 이용했습니다. **아래 과정은 모두 `macOS`에서 진행했습니다.** ### Emscripten 설치 <center>  </center> 기존 C/C++ 프로젝트를 WebAssembly로 빌드하기 위해서는 [Emscripten](http://kripken.github.io/emscripten-site/)을 사용하면 됩니다. 저는 http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html 문서의 사용법을 정확하게 따라서 `emsdk`를 통해서 Emscripten을 설치했습니다. ### giflossy 프로젝트 받기 먼저 Git을 이용해서 giflossy 프로젝트를 다운받습니다. ``` git clone https://github.com/pornel/giflossy.git ``` ### giflossy 프로젝트 컴파일 다운받은 giflossy의 폴더에서 아래 명령어를 통해서 giflossy 프로젝트를 `.bc` 파일로 아주 간단하게 빌드할 수 있습니다. 오류가 굉장히 많이 발생할 것으로 예상했으나, 의외로 하나의 오류도 없이 진행할 수 있었습니다. ``` emconfigure ./configure emmake make ``` 이렇게 하면 giflossy의 `src` 폴더에 `gifsicle` 파일이 생깁니다. **이게 원래 확장자가 `.bc`가 되어야 하는데, 아무 확장자가 붙지 않은채로 컴파일되었기 때문에 아래 명령어를 통해서 확장자를 `.bc`로 바꿔줍니다.** ``` mv src/gifsicle src/gifsicle.bc ``` > **`.bc` 확장자가 아닌 경우 `emcc`에 의해서 빌드되지 않습니다.** 그리고 마지막으로 `emcc`를 통해서 `gifsicle.bc` 파일을 `gifsicle.wasm` 형태의 WebAssembly 파일로 빌드할 수 있습니다. ``` emcc src/gifsicle.bc -s WASM=1 -s "MODULARIZE=1" -s "EXPORT_NAME='Gifsicle'" -o src/gifsicle.js ``` > output 파일을 `.js`로 정하면 `.wasm` 파일과 `.js` 파일이 동시에 생성됩니다. 브라우저에서는 `.wasm` 파일을 직접 이용하기보다는 `.js`를 이용하게 됩니다. ## 브라우저에서 생성된 WebAssembly 파일을 이용하기 HTML에서 아래와 같은 코드를 사용해서 WebAssembly를 쉽게 브라우저 단에서 사용할 수 있습니다. ``` <script type="text/javascript" src="./src/gifsicle.js"></script> <script type="text/javascript"> var gifsicle = new Gifsicle(); setTimeout(function() { // Gifsicle 내부적으로 .wasm 파일을 다운로드하기 때문에 약간의 시간을 기다린 후, // gifsicle 오브젝트를 사용할 수 있습니다. }, 1000); </script> ``` > `new Gifsicle()`에서 `Gifsicle`은 WebAssembly로 빌드할 때 지정한 `EXPORT_NAME`과 같아야 합니다. --- 이번 글은 조금 많이 어려운 것 같습니다ㅠ 일반인 분들이 보기에는 적합하지 않고, WebAssembly에 관심 있으신 개발자 분들에게만 아주 약간의 도움이 될 것 같네요. 혹시 WebAssembly를 사용하시다가 어려운 점 있으시면 질문 주세요. 제가 아는 선에서 답변 드리도록 하겠습니다 :)
author | heejin |
---|---|
permlink | c-c-webassembly |
category | kr-dev |
json_metadata | {"tags":["kr-dev","kr","kr-newbie","programming"],"users":["heejin"],"image":["https://steemitimages.com/DQmUvsDBB8dPzgnw4R6ejgKJnxKtJu8vpEns8fj5Sya2oW2/image.png"],"links":["https://steemit.com/kr-dev/@heejin/webassembly","https://github.com/pornel/giflossy","http://kripken.github.io/emscripten-site/","http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html"],"app":"steemit/0.1","format":"markdown"} |
created | 2017-07-01 13:24:21 |
last_update | 2017-07-01 13:24:21 |
depth | 0 |
children | 3 |
last_payout | 2017-07-08 13:24:21 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 5.084 HBD |
curator_payout_value | 1.512 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 2,932 |
author_reputation | 1,394,759,212,855 |
root_title | "C/C++ 프로젝트를 WebAssembly로 빌드하기" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 6,889,732 |
net_rshares | 784,274,435,950 |
author_curate_reward | "" |
voter | weight | wgt% | rshares | pct | time |
---|---|---|---|---|---|
kdj | 0 | 436,119,632,595 | 50% | ||
agile | 0 | 2,457,350,351 | 100% | ||
thefoolxyz | 0 | 43,834,337,767 | 50% | ||
genijex | 0 | 4,986,905,012 | 100% | ||
sbg | 0 | 870,588,941 | 100% | ||
heejin | 0 | 2,767,945,175 | 100% | ||
mauver | 0 | 16,693,235,677 | 50% | ||
ucba | 0 | 2,063,802,948 | 100% | ||
randowhale1 | 0 | 274,480,637,484 | 1.8% |
WebAssembly를 사용해본 결과, WebAssembly 측에서 홍보하던 바와는 다르게 아직 네이티브 급의 속도는 나오지 않습니다. 아직은 여러 제약이 많은 상태인 것 같습니다.
author | heejin |
---|---|
permlink | re-heejin-c-c-webassembly-20170701t134924469z |
category | kr-dev |
json_metadata | {"tags":["kr-dev"],"app":"steemit/0.1"} |
created | 2017-07-01 13:50:09 |
last_update | 2017-07-01 13:50:09 |
depth | 1 |
children | 0 |
last_payout | 2017-07-08 13:50:09 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 101 |
author_reputation | 1,394,759,212,855 |
root_title | "C/C++ 프로젝트를 WebAssembly로 빌드하기" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 6,892,384 |
net_rshares | 0 |
개발쪽에서는 항상 새로운 시도가 끊이지 않네요. 90년대 후반에 '다운로드 없는 자바스크립트 게임'을 모토로 대학생들이 차린 게임회사 있었는데 지금 시총이 4,000억이 됐네요. 로컬에서 뭔가 처리하는 느낌에 그 때 생각이 잠깐 났습니다. 팔로우 하고 갈께요~
author | minari |
---|---|
permlink | re-heejin-c-c-webassembly-20170701t142129948z |
category | kr-dev |
json_metadata | {"tags":["kr-dev"],"app":"steemit/0.1"} |
created | 2017-07-01 14:21:06 |
last_update | 2017-07-01 14:21:06 |
depth | 1 |
children | 0 |
last_payout | 2017-07-08 14:21:06 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.020 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 145 |
author_reputation | 18,256,774,154,134 |
root_title | "C/C++ 프로젝트를 WebAssembly로 빌드하기" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 6,895,677 |
net_rshares | 2,624,422,092 |
author_curate_reward | "" |
voter | weight | wgt% | rshares | pct | time |
---|---|---|---|---|---|
heejin | 0 | 2,624,422,092 | 100% |
This post received a 1.8% upvote from @randowhale thanks to @heejin! For more information, [click here](https://steemit.com/steemit/@randowhale/introducing-randowhale-will-you-get-the-100-vote-give-it-a-shot)!
author | randowhale |
---|---|
permlink | re-c-c-webassembly-20170707t064648 |
category | kr-dev |
json_metadata | "{"format": "markdown", "app": "randowhale/0.1"}" |
created | 2017-07-07 06:46:48 |
last_update | 2017-07-07 06:46:48 |
depth | 1 |
children | 0 |
last_payout | 2017-07-14 06:46:48 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 210 |
author_reputation | 47,657,457,485,459 |
root_title | "C/C++ 프로젝트를 WebAssembly로 빌드하기" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 7,611,536 |
net_rshares | 0 |