关于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将其作为智能合约的最终格式,其机制和目前浏览器的运行和调用方式其实并不相同。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • “书到用时方恨少”、“书中自有黄金屋,书中自有颜如玉”,这些道理谁都能懂,却往往都是恨少的时候才去看。其实我也一样...
    诗雨伊意阅读 2,161评论 0 1
  • 01.最近越来越好奇一个问题,大学四年我的体重从来没低于53公斤,也从来没有高于56.5公斤。无论我是多吃,还是少...
    ARUNANHUI阅读 91评论 0 1
  • 月半牵,暮凉山。 宿夜千里,万里轻烟, 故梦撼长安。 轻蒲飘去,纵招不唤, 闲云疏绕, 泪中况,寸指轻弦。
    方微流渚阅读 137评论 0 0
  • ❶【感受自我内在丰盛】 当下!爱,喜悦,感恩! ❷【感受身体情绪丰盛】 (我爱你!对不起!请原谅!谢谢你!)让内心...
    紫贝壳张翠萍阅读 190评论 0 0