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
传统编译器架构
- Frontend:前端
词法分析、语法分析、语义分析、生成中间代码 - Optimizer:优化器
中间代码优化 - Backend:后端
生成机器码
LLVM架构
不同的前端后端使用统一的中间代码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的关系
LLVM整体架构,前端用的是clang,广义的LLVM是指整个LLVM架构,一般狭义的LLVM指的是LLVM后端(包含代码优化和目标代码生成)。
源代码(c/c++)经过clang--> 中间代码(经过一系列的优化,优化用的是Pass) --> 机器码
其中llvm部分来自
链接:https://www.jianshu.com/p/1367dad95445
来源:
参考:https://www.jianshu.com/p/0170aaf3b903
abi是代码的产品说明书