Emscript和llvm之间的关系

一、编译器的区别

1. 编译器的选择(clang)

  • C用clang
  • C++用clang++
  • bc用emcc(Emscript)

2. 编译命令行

  • c:        clang test.c header.c -o name.exe
  • c++:   clang++ test.cpp header.cpp -o(output) name.exe
  • bc:      emcc --bind test.bc -o test.js (--bind启用bingdings编译源代码,bindings是Emscripten中链接C++和JavaScript代码的一类API)

二、wasm和emcc和bc格式文件联系

1.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可以识别使用

2. llvm(一种中间语言)

(1) 传统的编译器架构:

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

(2) LLVM  

Emscript和llvm之间的关系_第1张图片

  • 不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)
  • 如果需要支持一种新的编程语言,那么只需要实现一个新的前端
  • 如果需要支持一种新的硬件设备,那么只需要实现一个新的后端
  • 优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改

总结: GCC的前端和后端没分得太开,前端后端耦合在了一起。所以GCC为了支持一门新的语言,或者为了支持一个新的目标平台,就 变得特别困难。LLVM现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC家族、Java、.NET、Python、Ruby、Scheme、Haskell、D等)。

(3) Clang

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

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

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

3.wasm(一种输出的文件格式)

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

-s WASM=1 — 指定我们想要的wasm输出形式。如果我们不指定这个选项,Emscripten默认将只会生成asm.js。

 

你可能感兴趣的:(JS)