學(xué)習(xí)WebAssembly正當(dāng)時(shí): 讓C語(yǔ)言出現(xiàn)在前端

下載安裝

官方推薦方式码荔,先下載 emsdk:

git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
# 下載并安裝最新的 SDK 工具.
./emsdk install latest

# 為當(dāng)前用戶激活最新的 SDK. (寫入 .emscripten 配置文件)
./emsdk activate latest

# 激活當(dāng)前 PATH 環(huán)境變量
source ./emsdk_env.sh

注意
在Windows上運(yùn)行emsdk,而不是./emsdk和号涯,emsdk_env.bat而不是目胡。source ./emsdk_env.sh

會(huì)安裝sdk-release-upstream, node.js, 等锯七,因?yàn)槭菑?br> https://storage.googleapis.com/ 上下載相應(yīng)的軟件包链快,如果您因網(wǎng)絡(luò)原因不能直接訪問(wèn)這個(gè)域名,則可能需要設(shè)置代理下載眉尸。

安裝驗(yàn)證

確保已下載并安裝Emscripten(執(zhí)行此操作的確切方法取決于您的操作系統(tǒng):Linux域蜗,Windows或Mac)。

Emscripten使用Emscripten編譯器前端(emcc)進(jìn)行訪問(wèn)噪猾。該腳本調(diào)用了構(gòu)建代碼所需的所有其他工具霉祸,并且可以代替gccclang等標(biāo)準(zhǔn)編譯器。在命令行上使用./emcc或調(diào)用它./em++袱蜡。

$ emcc --version
emcc (Emscripten gcc/clang-like replacement) 1.40.1 
...

編譯

接下來(lái)就可以編譯代碼啦丝蹭。
來(lái)個(gè)萬(wàn)年不變的Hello world試試:

#include<stdio.h>

void main(){
  printf("Hello world!");
}

可以比較分別以
第一種情況:

emcc hello.c 

和,第二種情況:

emcc -O2 hello.c -o hello.wasm

進(jìn)行編譯坪蚁,感受一下差異奔穿。

第一種情況下

編譯默認(rèn)會(huì)生成一個(gè)2500多行的JavaScript文件 a.out.js和一個(gè)可反編譯成文本wat格式的近1萬(wàn)行代碼的 a.out.wasm 文件. 大是太大了點(diǎn),不過(guò)不用怕敏晤,后面我們會(huì)告訴你如何讓他們變小贱田。

a.out.js是一坨膠水,用來(lái)在不同條件下為wasm搭建一個(gè)執(zhí)行環(huán)境嘴脾。先不管他究竟是啥男摧,先試試運(yùn)行看看:

node a.out.js

可惜,沒(méi)有人跟你問(wèn)世界好,相反耗拓,向你拋出一團(tuán)警告:

stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.
(this may also be due to not including full filesystem support - try building with -s FORCE_FILESYSTEM=1)

這一坨英文的意思是拇颅,編譯出的wasm默認(rèn)情況下不會(huì)退出運(yùn)行時(shí),這是web情況下期待的方式乔询,主程序main雖然運(yùn)行結(jié)束了蔬蕊,但模塊沒(méi)有退出,靜態(tài)變量可以保持在內(nèi)存中哥谷,不釋放岸夯。同時(shí)標(biāo)準(zhǔn) I/O 緩沖區(qū)沒(méi)有被flush,也就沒(méi)有看到 Hello world!

聽(tīng)人勸们妥, 加上參數(shù)再編譯:

emcc hello.c -s EXIT_RUNTIME=1

然后再用node.js運(yùn)行:

node a.out.js

Hello world!

出現(xiàn)了期待的 Hello world! 不再出嚇人的警告了猜扮。

估計(jì)你會(huì)問(wèn),我編譯的是hello.c监婶,為啥出來(lái)的是 a.out.js?
這還真有點(diǎn)歷史傳統(tǒng)的味道旅赢,你可以把 a.out 理解成匯編輸(assembler output)。這種*nix操作系統(tǒng)下的可執(zhí)行文件也稱作 a.out格式(試比較 ELF 格式)惑惶。

如果你看著不爽的話煮盼,可以指定自己的名字,下面我們就看看如何指定自己的名字带污。

第二種情況

emcc有兩個(gè)常用的編譯參數(shù)僵控,大小歐(O,o), 大歐 O 指定優(yōu)化級(jí)別,小歐 o 指定輸出文件和類型鱼冀。

優(yōu)化級(jí)別有 -O0, -O1, -O2, -O3 -Os這五種級(jí)別报破。不指定是為 -O0, 即沒(méi)有優(yōu)化,開(kāi)發(fā)時(shí)一般指定為 -O0 或 -O1千绪, 這樣編譯速度快充易,調(diào)試方便。 正式發(fā)布時(shí)可以是 -O2 或 -O3荸型,這時(shí)代碼會(huì)優(yōu)化盹靴,執(zhí)行更快。-Os 不光是執(zhí)行快瑞妇,同時(shí)優(yōu)化大小稿静,可生成更小的執(zhí)行文件。

emcc 小歐 o 選項(xiàng)指定輸出文件類型有 js踪宠,wasm 和 html自赔。

讓我們來(lái)試試生成html:

emcc -o hello.html hello.c

這回會(huì)生成三個(gè)文件: hello.html, hello.js, hello.wasm

在當(dāng)前目錄下執(zhí)行 live-server

live-server

如果你機(jī)器上沒(méi)有 live-server, 可以用 npm install live-server來(lái)安裝。

live-server 會(huì)啟動(dòng)一個(gè)web服務(wù)器柳琢,監(jiān)聽(tīng)本機(jī)的8080端口绍妨,并自動(dòng)打開(kāi)瀏覽器:

截屏2020-12-11 下午11.40.52.png

點(diǎn)擊hello.html:

截屏2020-12-12 上午12.01.38.png

顯示了兩個(gè)黑窟窿頁(yè)面润脸,我的Hello world! 呢?

好吧他去,頁(yè)面也有頁(yè)面的怪癖毙驯,printf打印時(shí),同樣因?yàn)闆](méi)有刷新緩沖區(qū)灾测,沒(méi)有看到我們的Hello world, 增加編譯選項(xiàng):

emcc hello.c -o hello.html -s EXIT_RUNTIME=1

<kbd>CTRL</kbd>+<kbd>C</kbd> 停掉 live-server, 重新編譯爆价,再啟 live-server, 再刷頁(yè)面:

截屏2020-12-12 上午12.02.06.png

好的,我們的 Hello world! 熠熠生輝媳搪,是那么的可愛(ài)铭段!

我們經(jīng)歷了什么?

我們安裝了 emscripten 編譯工具鏈秦爆,把 C 語(yǔ)言寫的代碼分別移植到了 Node.js的命令行和 Web 頁(yè)面各自己執(zhí)行了一下序愚。

誰(shuí)說(shuō) C 語(yǔ)言不能做前端來(lái)著?

不過(guò)等限,眼下還看不出這么折騰有啥用爸吮,就讓我?guī)б黄鸶銈€(gè)能說(shuō)明問(wèn)題的用例吧?

你保持關(guān)注望门,我保持更新形娇!
學(xué)習(xí) WebAssembly 正當(dāng)時(shí)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筹误,一起剝皮案震驚了整個(gè)濱河市桐早,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纫事,老刑警劉巖勘畔,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件所灸,死亡現(xiàn)場(chǎng)離奇詭異丽惶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钾唬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門侠驯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抡秆,“玉大人吟策,你說(shuō)我怎么就攤上這事儒士。” “怎么了檩坚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵薯鳍,是天一觀的道長(zhǎng)悯舟。 經(jīng)常有香客問(wèn)我抵怎,道長(zhǎng)反惕,這世上最難降的妖魔是什么悬赏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮怠褐,結(jié)果婚禮上具温,老公的妹妹穿的比我還像新娘。我一直安慰自己茴丰,他們只是感情好达皿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著贿肩,像睡著了一般峦椰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汰规,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天汤功,我揣著相機(jī)與錄音,去河邊找鬼溜哮。 笑死滔金,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茂嗓。 我是一名探鬼主播餐茵,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼述吸!你這毒婦竟也來(lái)了忿族?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝌矛,失蹤者是張志新(化名)和其女友劉穎道批,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體入撒,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隆豹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衅金。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片噪伊。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖氮唯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姨伟,我是刑警寧澤惩琉,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站夺荒,受9級(jí)特大地震影響瞒渠,放射性物質(zhì)發(fā)生泄漏良蒸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一伍玖、第九天 我趴在偏房一處隱蔽的房頂上張望嫩痰。 院中可真熱鬧,春花似錦窍箍、人聲如沸串纺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纺棺。三九已至,卻和暖如春邪狞,著一層夾襖步出監(jiān)牢的瞬間祷蝌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工帆卓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巨朦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓剑令,卻偏偏與公主長(zhǎng)得像罪郊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尚洽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本次分享的文章是基于WebAssembly的探索與研究悔橄。最近需要做一個(gè)與加密相關(guān)的項(xiàng)目,想將后端的加密方案直接放到...
    Netwarps閱讀 1,591評(píng)論 1 1
  • asm.js asm.js是JavaScript語(yǔ)言中一個(gè)可以高度優(yōu)化的子集腺毫。通過(guò)避免JavaScript引擎某些...
    廣州蘆葦科技web前端閱讀 4,337評(píng)論 0 1
  • 久違的晴天癣疟,家長(zhǎng)會(huì)。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí)潮酒,離放學(xué)已經(jīng)沒(méi)多少時(shí)間了睛挚。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評(píng)論 16 22
  • 今天感恩節(jié)哎急黎,感謝一直在我身邊的親朋好友扎狱。感恩相遇!感恩不離不棄勃教。 中午開(kāi)了第一次的黨會(huì)淤击,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,566評(píng)論 0 11
  • 可愛(ài)進(jìn)取,孤獨(dú)成精故源。努力飛翔污抬,天堂翱翔。戰(zhàn)爭(zhēng)美好,孤獨(dú)進(jìn)取印机。膽大飛翔矢腻,成就輝煌。努力進(jìn)取射赛,遙望多柑,和諧家園¢乖穑可愛(ài)游走...
    趙原野閱讀 2,727評(píng)論 1 1