Wasm&&llvm&&Runtime&&emcc&&abi

1.wasm

wasm, WebAssembly,
web端DApp,JS时代下web端编译语言多半是解释性语言,运行效率不高。
区块链DApp:1.允许开发者以其他语言开发,再加载在JS上
2.提升程序性能,允许大型区块链DApp的开发

2.emcc

emcc就是Emscripten的编译器,将c文件编译产出生成xx.wasm
例如:

emcc test.c -Os -s WASM=1 -s SIDE_MODULE=1 -o test.wasm

emcc就是Emscripten编译器,test.c是我们的输入文件,-Os表示这次编译需要优化,-s WASM=1表示输出wasm的文件,因为默认的是输出asm.js,-s SIDE_MODULE=1表示就只要这一个模块,不要给我其他乱七八糟的代码,-o test.wasm是我们的输出文件。

编译成功之后,当前目录下就会生成test.wasm
Emscripten将llvm的中间语言转换成node代码,test.wasm,js可以识别使用

3.llvm

传统编译器架构


Wasm&&llvm&&Runtime&&emcc&&abi_第1张图片
image.png
  • Frontend:前端
    词法分析、语法分析、语义分析、生成中间代码
  • Optimizer:优化器
    中间代码优化
  • Backend:后端
    生成机器码

LLVM架构


Wasm&&llvm&&Runtime&&emcc&&abi_第2张图片
image.png

不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)
如果需要支持一种新的编程语言,那么只需要实现一个新的前端
如果需要支持一种新的硬件设备,那么只需要实现一个新的后端
优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改
相比之下,GCC的前端和后端没分得太开,前端后端耦合在了一起。所以GCC为了支持一门新的语言,或者为了支持一个新的目标平台,就 变得特别困难
LLVM现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC家族、Java、.NET、Python、Ruby、Scheme、Haskell、D等)

Clang是LLVM的一个子项目,基于LLVM架构的C/C++/Objective-C编译器前端

Clang和LLVM的关系


Wasm&&llvm&&Runtime&&emcc&&abi_第3张图片
image.png

LLVM整体架构,前端用的是clang,广义的LLVM是指整个LLVM架构,一般狭义的LLVM指的是LLVM后端(包含代码优化和目标代码生成)。

源代码(c/c++)经过clang--> 中间代码(经过一系列的优化,优化用的是Pass) --> 机器码

其中llvm部分来自
链接:https://www.jianshu.com/p/1367dad95445
来源:

参考:https://www.jianshu.com/p/0170aaf3b903

abi是代码的产品说明书

你可能感兴趣的:(Wasm&&llvm&&Runtime&&emcc&&abi)