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

传统编译器架构


image.png
  • Frontend:前端
    词法分析、语法分析、语义分析、生成中间代码
  • Optimizer:优化器
    中间代码优化
  • Backend:后端
    生成机器码

LLVM架构


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的关系


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是代码的产品说明书

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容