国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Wasm 初探,寫個 Hello World

開發 前端
Wasm 并不是傳統意義上匯編語言(Assembly),而是一種中間編譯的字節碼,可以在瀏覽器上運行非 JavaScript 語言,只要它能被編譯成 Wasm。

大家好,我是前端西瓜哥。

我們來入門一下 wasm。

wasm 是什么

wasm 是 WebAssembly 的縮寫。

wasm 并不是傳統意義上匯編語言(Assembly),而是一種中間編譯的字節碼,可以在瀏覽器上運行非 JavaScript 語言,只要它能被編譯成 wasm。

wasm 的優點:

  • 可以使用 C/C++、Rust等語言編寫代碼,這個是 wasm 最大的價值所在;
  • 高效快速,二進制文件,以接近原生的速度運行;
  • 安全,和 JS 有相同的沙盒環境和安全策略,比如同源策略;
  • 絕大多數主流瀏覽器支持。另外可移植,非瀏覽器環境也能支持(塞個 v8 進去,比如 nodejs);
  • 使用其他語言的輪子。比如 Canvas 底層調用的 Skia C++ 庫,就通過 wasm 技術提供了一個名為 CanvasKit 的 NPM 包給開發者用 JS 開發。

缺點:

  • 適用場景較少,適合 CPU 密集型的場景(比如 3D 渲染);
  • 提升并沒有非常高(幾十倍),通常可能就兩三倍的樣子?但對普通前端來說學習成本太高,還得看投入產出比;
  • 和 JS 有通信的成本,通信頻繁或數據量大會降低性能。

安裝

首先我們需要用到 Emscripten。Emscripten 是一個編譯器工具鏈,使用 LLVM 去編譯出 wasm。

先安裝 Emscripten SDK。

我選擇官網推薦的方式進行安裝。西瓜哥我用的系統是 MacOS.

# 拉取倉庫
git clone https://github.com/emscripten-core/emsdk.git

# 進入目錄
cd emsdk

# 下載最新 SDK 工具
./emsdk install latest

# 版本設置為最新
./emsdk activate latest

# 將相關命令行工具加入到 PATH 環境變量中(臨時)
source ./emsdk_env.sh

下載那里我一開始失敗了幾次,后來用了程序員都懂的那個東西才下載成功。

看看是不是成功安裝了。

emcc -v

如果正確輸出版本相關信息,就是安裝成功了。

需要注意的是,每次打開新的終端,都要執行一下 source ./emsdk_env.sh 去臨時更新 PATH 變量。

如果不想每次都要執行這玩意,可以在 .zshrc(或 .bashrc)中加上:

# 需使用 emsdk_env.sh 文件的絕對路徑
source /path/to/emsdk_env.sh &> /dev/null

Hello World

接下來我們要選擇一門高級語言。

語言不能有 GC(自動垃圾回收機制)特性,比如 Java、Python。

(不過可以通過一些非官方的工具轉成 wasm,就是問題比較多)

寫 wasm,最流行的是 Rust 和 C/C++。

C/C++ 的輪子比較豐富,比如 Skia(Canvas 底層調用的庫)就是 C++ 寫的。可惜的是 C/C++ 沒有包管理工具。

而當下最炙手可熱的當屬 Rust,我不得不說它真的很酷,有包管理工具,工具鏈也很完善。就是學習曲線過于陡峭,太難上手。

本文選擇使用 C/C++ 語言。

先創建一個 hello.c 文件:

#include <stdio.h>

int main() {
  printf("Hello, world!\n");
  return 0;
}

運行下面命令編譯成 wasm。

emcc hello.c

然后看到多了兩個文件:a.out.js 和 a.out.wasm。

其中 js 文件是膠水代碼,用來加載和執行 wasm 的,wasm 不能直接作為入口文件使用。

我們用 nodejs 運行一下 a.out.js,可以看到成功輸出了 "Hello, world!"。

當然我們也可以創建一個 html 文件,引入這個 a.out.js 文件,也可以看到控制臺能夠正確輸出輸出。

看下資源請求,可以看到 html 引入了 a.out.js,然后 a.out.js 再引入 a.out.wasm。

HTML 模板

為了方便大家調試,emscripten 還很貼心地提供了額外生成 index.html 的方式,并會引用上編譯出來的 js 文件。

我們需要不上 -o <文件名>.html 指定輸出的 html。

emcc hello.cpp -o hello.html

會生成 hello.html、hello.js 和 hello.wasm 三個文件。

打開 hello.html,我們可以看到一個界面,中間是一個 Canvas,顯示 wasm 的渲染結果。下面則是控制臺的輸出。

文件系統

出于安全考慮,wasm 最終是要在瀏覽器的沙箱內運行的,是無法讀取本地文件的。

但我們還是可以使用 C++ 的讀取文件的方法的,只是它會被轉換為從虛擬文件系統里讀取。

hello_world_file.cpp 文件:

#include <stdio.h>

int main() {
  FILE *file = fopen("./hello_world_file.txt", "rb");
  if (!file) {
    printf("cannot open file\n");
    return 1;
  }
  while (!feof(file)) {
    char c = fgetc(file);
    if (c != EOF) {
      putchar(c);
    }
  }
  fclose (file);

  printf("\n");

  return 0;
}

需要讀取的文本文件 hello_world_file.txt 為:

==
This data has been read from a file.
The file is readable as if it were at the same location in the filesystem, including directories, as in the local filesystem where you compiled the source.
前端西瓜哥
==

使用 --preload-file  選項,指定要預加載的資源文件。

emcc hello_world_file.cpp -o hello.html --preload-file hello_world_file.txt

結果:

代碼優化

和編譯 C 一樣,為了提高開發時的編譯效率,默認編譯(默認為 -O1)出來的 wasm 是沒有進行優化的。

下面命令會用優化等級 2 進行編譯。

emcc -O2 hello.c

還有其他的優化等級,對應編譯時間會變長,編譯出來的文件尺寸會變大。

結尾

本文簡單入門了一下 wasm。

wasm 是 JS 的補充,解決了 JS 的一些短板,不過總的來說大多數場景是用不上的,但它還在不斷發展,我還是挺看好的。未來可期。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2011-09-08 10:41:12

Node.js

2017-11-23 17:45:46

Yii框架IntelYii框架深度剖析

2014-12-19 10:07:10

C

2009-08-11 10:32:23

什么是Groovy

2011-06-08 14:39:06

Qt 教程

2009-07-30 13:21:17

Scala入門Hello World

2009-09-16 17:15:19

OSGi Bundle

2023-01-06 08:18:44

2012-02-20 14:26:48

JavaPlay Framew

2023-05-23 08:01:10

Netty網絡通信

2021-11-26 08:22:01

Java動態開發

2014-04-11 11:36:42

NDKAndroid開發終端

2024-04-11 13:13:27

2009-08-14 16:54:19

C# Hello Wo

2011-08-05 09:48:46

iPhone Interface

2017-06-26 08:55:52

2010-01-07 13:27:22

Linux驅動程序

2013-12-12 17:30:03

Lua例子

2009-06-11 14:00:34

jBPM用戶指南jBPM范例

2021-03-30 13:48:47

WebAssemblyWeb瀏覽器編程語言
點贊
收藏

51CTO技術棧公眾號

www插插插无码视频网站| 91精品免费看| 成色在线视频| 亚洲一区二区三区高清| 在线看欧美日韩| av网址在线免费观看| 亚洲已满18点击进入久久| 国产视频在线观看网站| 亚洲久久一区二区| 4p变态网欧美系列| 中文字幕一区图| 中日韩美女免费视频网址在线观看| 黄色免费在线播放| 亚洲国产视频a| 日本全棵写真视频在线观看| 91一区二区三区在线观看| 艳色歌舞团一区二区三区| 亚洲黄页一区| 精品中文字幕一区| 欧美日韩一区二区高清| 成人免费看片视频| 国产高清久久| 国产精品日韩电影| 精品久久一区| 亚洲网址你懂得| 91精品视频免费观看| 六九午夜精品视频| 久久综合色8888| 亚洲国产91色在线| 成人h动漫在线| 欧美~级网站不卡| 色视频www在线播放国产成人| 欧美一区二区高清在线观看| 欧美黄色一区二区| 日韩 欧美 视频| 午夜久久久久| 国产欧美一区二区三区另类精品| 欧美视频精品全部免费观看| 国产一区二区黄| 免费欧美一区| 欧洲日韩成人av| 亚洲区小说区图片区qvod| 国产免费久久av| 国产suv一区二区三区88区| 成年人视频观看| 日韩欧美a级成人黄色| 亚洲天堂导航| 日韩成人中文字幕| 亚洲电影一级片| 欧美亚洲丝袜传媒另类| 日本欧美亚洲| 中文字幕不卡一区| 欧美高清电影在线| 亚洲国产欧美一区二区丝袜黑人 | 亚洲精品成人久久| 电影中文字幕一区二区| 成人综合色站| 国产精品色眯眯| 欧美一级二级视频| 91社区国产高清| 亚洲二区av| 九九热久久66| 国产成人av电影免费在线观看| 97久久久免费福利网址| 欧美6一10sex性hd| 亚洲一区二区三区中文字幕在线| 国产三级电影在线| 97超碰色婷婷| 99这里只有精品| av免费不卡国产观看| 国产精品久久久久久久久久99| 国产激情一区二区三区桃花岛亚洲| 欧美aaa大片| 欧美激情一级欧美精品| 国产麻豆成人传媒免费观看| 欧美女优在线观看| 久久99国产精品99久久| 欧美激情aⅴ一区二区三区| 美乳视频一区二区| 精品久久久久久久久久| 日韩欧美二区| 永久免费在线| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 成人免费观看视频在线观看| 亚洲成人影音| 久久亚洲欧美日韩精品专区| 亚洲成人精品| 日本一区午夜艳熟免费| 精品国产91乱高清在线观看| 国偷自产一区二区免费视频| 国产精品久久综合av爱欲tv| 久久久久9999亚洲精品| 黄视频在线观看网站| 成人免费91在线看| 亚洲高清在线视频| 精品av一区二区| 一不卡在线视频| 国产精品xxx视频| 婷婷综合另类小说色区| 影音先锋日韩在线| 丝袜老师办公室里做好紧好爽| 欧美日本韩国一区| 日韩av中文字幕一区二区三区| 国产精品—色呦呦| 中文字幕欧美人与畜| 隔壁老王国产在线精品| 亚洲国产日韩av| 女生裸体视频一区二区三区| 欧美天天影院| 狠狠色综合欧美激情| 一区二区欧美亚洲| 中文在线免费一区三区高中清不卡| 国产欧美高清视频在线| 成人日韩欧美| 十八禁视频网站在线观看| 国产高清在线不卡| 亚洲一区二区久久| 亚洲美女屁股眼交| 日本欧美加勒比视频| 欧美三级伦理在线| wwww亚洲| 香蕉av一区| 日韩在线第三页| 国产经品一区二区| 欧美野外猛男的大粗鳮| 精品国产麻豆免费人成网站| 国产精品天美传媒| 国产乱码精品1区2区3区| 国产精品久久久久久久| 欧美日韩国产免费观看视频| 欧美激情久久久久久久久久久| 欧美精品一区二区三区涩爱蜜| 一本色道久久88综合亚洲精品ⅰ | 欧洲亚洲免费视频| 欧美特级限制片免费在线观看| 亚洲激情欧美激情| 国产日本亚洲高清| 成人av中文字幕| 久久久久国产一区二区三区四区| 日本在线观看一区二区| 在线观看久久久久久| 777亚洲妇女| 日韩欧美国产成人| 日本韩国精品在线| 色成人在线视频| 欧美中文一区二区三区| 亚洲视频综合在线| 夜夜精品视频一区二区| 亚洲免费在线电影| 亚洲欧美日韩电影| 一区二区高清免费观看影视大全 | 日本午夜精品视频在线观看| 麻豆91在线观看| 亚洲美女色禁图| 久久成人久久鬼色| 不卡av在线网| 国产欧美日韩在线| 国产精品三级视频| 黄网动漫久久久| 精品福利一二区| 久久久www成人免费精品| 欧美精品在线免费观看| 97超碰资源| 亚洲一二区在线| 1234区在线观看视频免费| 男男激情在线| 高清在线视频不卡| 99ri日韩精品视频| 亚洲免费影视| 91视频免费观看| 欧美日韩高清在线播放| 色777狠狠综合秋免鲁丝| 国产成人精品亚洲精品| 日本不卡久久| 国产成人黄色网址| 日韩av激情| 天堂一区二区三区四区| 奇米色777欧美一区二区| 亚洲欧美日韩国产一区二区三区| 欧美精品99久久久**| 国产精品久久久久久亚洲调教| 日韩中文字幕亚洲精品欧美| 日韩精品系列| 视频精品一区二区三区| 一本一本久久| 国产精品不卡在线| 日韩精品免费观看| 日本欧洲国产一区二区| 黄色片免费在线| 免费久久精品| 国产精品毛片久久久久久久| 亚洲深夜福利在线| 久久久久久久久久久久久久一区 | 91精品婷婷色在线观看| 99久免费精品视频在线观看| 亚洲精品v欧美精品v日韩精品| 成人午夜影院在线观看| 国内在线高清免费视频| 日韩色淫视频| 99久久综合99久久综合网站|