关于EOS中的虚拟机(一)

EOS最初的白皮书中曾经说到要用以太坊的虚拟机,但后来并没有采用,而是采用了WASM-LLVM架构,EOS的虚拟机底层以LLVM和WebAssembly 两部分组成,他们都是现成已有,LLVM早就用于object-C, 而webAssembly 用于网页前端的实现,还涉及到一些相关的概念,例如IR中间语言。

本文将逐一介绍。

LLVM架构:

LLVM是一套可重用的编译工具链,提供了介于高级编程语言和机器语言之间的IR中间语言。LLVM本身可以作为多种语言的后端,提供与语言本身无关的优化和对多种CPU的代码生成功能。
(LLVM由UIUC主持开发,最初LLVM (low level virtual machine)的意义已经被超越)
比较一下传统的编译器和LLVM,传统的静态编译器,如gcc, 一般是由三个组件完成,分别为前端、优化器和后端:


传统编译器的构成

而LLVM虽然也分为三部分,但针对不同语言的前端,对应生成不同平台的机器码。


LLVM的架构组成

LLVM的编译流程如下:源码被编译成LLVM中间格式的文件,然后使用LLVM Linker 链接,并进行优化,得到的LLVM code 最终被翻译成特定平台的机器码,另外LLVM支持JIT,会在代码生成过程中插入一些轻量级的操作指令来手机运行的信息,例如识别hot region,另外收集的信息可以支持离线优化(offline optimizer),实现profile-driven 等优化策略,调整native code 以适应特定的架构。


LLVM处理流程图
LLVM IR(Intermediate representative):

由上面可以看出LLVM编译器是先将源语言翻译成“中间语言”,不同语言有不同的IR,再通过后端程序翻译为目标平台的编译语言。
LLVM IR提供三种格式,分别是:内存里的IR格式,存储在磁盘上二进制格式,存储在磁盘上的文本格式。除此以外,和IR相关的还有一些文件格式,罗列如下:

  • bc 结尾, LLVM IR文件,二进制,可通过lli 命令执行
  • ll 结尾,LLVM IR文件, 文本格式,可以通过 lli 执行
  • s 结尾,本地汇编文件
  • out 后缀,本地可执行文件
    下图显示集中文件的转化:


    LLVMFormatFileTrans.jpg

LLVM的前端编译器可采用各种解析编译器,通常是clang用的比较多,不过在EOS是用wasm替代了clang,这在后续中进行介绍。

LLVM JIT(just-in-time) :

JIT是将原本编译器要生成机器码的部分直接写入当前内存,通过函数指针的转换,找到相应机器码并执行,常用于处理内存管理,符号重定向,处理外部符号等问题上。

WebAssembly:

WASM允许C/C++等语言编写运行在WEB中的程序,WASM其实是一种字节码格式,是底层二进制语法,加载时间段以及高速执行,是为WEB多语言编程设计的目标文件格式。


WASMToHTMLFlow.jpg

WebAssembly提供两种格式: 可读的文本格式wast 和二进制格式 wasm, 通过工具wast2wasm 完成 wast 到 wasm 的格式转换,同理,wasm2wast 实现逆转换。

wasm 目前主要应用于web 应用,而EOS将其作为智能合约的最终格式,其机制和目前浏览器的运行和调用方式其实并不相同。

你可能感兴趣的:(关于EOS中的虚拟机(一))