了解 Emscripten

栏目: C++ · 发布时间: 5年前

内容简介:截止本文发布,

Emscripten 是一个 开源的编译器 ,该编译器可以将 C/C++ 的代码编译成 JavaScript 胶水代码。 Emscripten 可以将 C/C++ 代码编译为 WebAssembly 编程语言的代码。

Emscripten 的底层是基于 LLVM 编译器的,可以查看其开源的 emscripten llvmemscripten clang

下图是其编译 C/C++ 的代码的流程图:

了解 Emscripten

截止本文发布, Emscripten 最新版本是 1.38.27 .

安装条件

以下是我安装和使用 Emscripten 的条件。

  • macOS 版本 10.14
  • Git,可通过 Homebrew 安装
  • CMake,可通过 Homebrew 安装
  • Xcode 10.1
  • Python 2.7.x,Mac 系统自带
  • 稳定快速的网络环境,最重要和最关键的的是要有(neng)梯(fan)子(qiang)
  • 解决问题的态度和毅力

通过 emsdk 安装

安装 Emscripten 可以通过安装 emscripten SDK 来完成, emscripten SDK 可以简单的理解为是 Emscripten 的一套 工具 链。

在你自己的电脑上面任意新建一个目录,如我的 ~/dev/emscwork ,打开终端,进入此目录。

1、下载 emsdk

git clone https://github.com/juj/emsdk.git

2、进入 emsdk 目录

cd emsdk

3、开始安装

# Fetch the latest version of the emsdk (not needed the first time you clone)
git pull

# Download and install the latest SDK tools.
./emsdk install latest

# Make the "latest" SDK "active" for the current user. (writes ~/.emscripten file)
./emsdk activate latest

# Activate PATH and other environment variables in the current terminal
source ./emsdk_env.sh

注意: 每次更新完 emsdk 后,依旧需要执行上面命令重新安装和激活。

另外一个比较常用的是 ./emsdk update-tags 这个命令,可以直接更新 emsdk 的最新 tags 版本,更新 tags 完成后,重新安装和激活最新版的 emsdk 套件。

配置 emsdk

如果你想在任意路径下都可以使用 emsdk 里面的各种工具(就是一些二进制可执行文件),需要为其设置环境变量。

编辑 ~/.bash_profile 文件,新增如下代码:

export EMSDK=~/emscwork/emsdk
export EMSCRIPTEN=$EMSDK/emscripten/1.38.27
export BINARYEN_ROOT=$EMSDK/binaryen/master_64bit_binaryen
export PATH=$EMSDK:$EMSCRIPTEN:$BINARYEN_ROOT:$PATH

执行下面命令, 使刚配置的文件生效。

source ~/.bash_profile

至此,安装和设置环境变量完成。

可以使用下面命令来查看 emsdk 的安装情况。

emcc --version
emcc (Emscripten gcc/clang-like replacement) 1.38.27 (commit ea5d631a5446632e195765d89a53ead71cd6de45)
Copyright (C) 2014 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

emcc 是一个可执行脚本,该脚本在 emsdk/emscripten/1.38.27 目录下。

emcc --help

上面命令可以查看更多关于 emcc 的使用方法.

编译 C/C++ 代码

这里举个实际的例子。

main.c

#include<stdio.h>

int main(int argc, char ** argv)
{
    printf("Emscripten show in browser...\n");
}

使用 emcc 编译,如下:

emcc main.c -s WASM=1 -o mz.html

这里一定要注意 WASM=1 这个选项,否则生成的格式

生成另外三个文件如下:

mz.html  mz.js  mz.wasm

简单介绍一下这三个文件

1、mz.wasm

二进制的 wasm 模块代码

2、mz.js

胶水代码,包含了原生 C 函数和 JavaScript/wasm 之间转换的 JS 文件

3、mz.html

用来加载、编译和实例化 wasm 代码并且将其输出在浏览器显示上的 HTML 文件

最后执行下面的命令,可以在 Safari 浏览器中显示效果

emrun mz.html

了解 Emscripten

main.cpp

#include<iostream>

using namespace std;

int main(int argc, char ** argv)
{
    cout << "Emscripten show in browser..." << endl;
    
    return 0;
}

编译 C++ 文件(main.cpp)

emcc main.cpp -s WASM=1 -o mzcpp.html

同样的方式编译和运行 mzcpp.html 即可看到同样的效果。

Emscripten 应用场景

Emscripten 只是一个编译器,能将我们的高级语言编译为浏览器可以识别并运行的程序,这个看起来确实很诱人。

就目前来说,Emscripten 应用场景可以使用在安全和游戏上面。

1、安全

C/C++ 代码经过编译之后,会生成 wasm 格式 的二进制文件,这个安全级别较高,即使在浏览器中运行,破解者也不会很轻松的破解代码,这样一些在 JS 中涉及到安全的问题,可以使用 C/C++ 来写结合一些加密技术,然后用 Emscripten 编译。

2、游戏

如果能把用 C/C++ 语言写的游戏,转为可在浏览器直接运行的H5游戏,那就很美好了,用户不需要下载游戏,直接玩。现代浏览器技术的更新和发展已经让这个想法变成了现实,至少在主流的浏览器上面。

推荐大家看看这篇文章 JavaScript是如何工作的:与WebAssembly比较及其使用场景


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法技术手册

算法技术手册

[美]海涅曼 (Heineman.G.T.)、[美]波利切 (Pollice.G.)、[美]塞克欧 (Selkow.S.) / 东南大学出版社 / 2009-4 / 58.00元

创造稳定的软件需要有效的算法,但是程序设计者们很少能在问题出现之前就想到。《算法技术手册(影印版)》描述了现有的可以解决多种问题的算法,并且能够帮助你根据需求选择并实现正确的算法——只需要一定的数学知识即可理解并分析算法执行。相对于理论来说,本书更注重实际运用,书中提供了多种程序语言中可用的有效代码解决方案,可轻而易举地适合一个特定的项目。有了这本书,你可以: 解决特定编码问题或改进现有解决......一起来看看 《算法技术手册》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码