Neo編譯器

上一篇區(qū)塊鏈研究方案
先整理一下Neo編譯器的知識(shí)吧。

項(xiàng)目鏈接

  1. Neo本身是開(kāi)源的,在github搜索就可以拿到源碼,我為了方便調(diào)試,把所有代碼都放在一起。https://github.com/benhaben/neo-compiler.git

  2. Neo是C#開(kāi)發(fā)的,大部分代碼可以跨平臺(tái),但是也有不能再mac上運(yùn)行的代碼,比如改裝后的leveldb的代碼,所以最好還是用Visual Studio在windows上調(diào)試研究較好。

  3. 本文檔主要是總結(jié)自己所研究的東西,現(xiàn)在不太規(guī)范,主要考慮好理解,并不完善,后面也可以進(jìn)一步規(guī)范化提交到neo項(xiàng)目中。

主框架

框架

大家可以看到Compiler所處的位置

Compiler作用

  1. 在Neo區(qū)塊鏈系統(tǒng)中,智能合約是一段代碼,可以完成一定的邏輯,最后算出合約的結(jié)果?,F(xiàn)在已經(jīng)有很多具體的應(yīng)用了,感興趣的可以看一下基于Neo做的項(xiàng)目。
  2. 如果對(duì)比特幣或者智能合約不了解,不知道為什么需要有這些代碼,可以看一下比特幣的白皮書(shū)。這里簡(jiǎn)單說(shuō)一下,在比特幣系統(tǒng)中,當(dāng)一個(gè)“人”(可以看成一個(gè)公鑰)需要和另一個(gè)“人”產(chǎn)生交易的時(shí)候,這段代碼用來(lái)檢查身份,分配比特幣。具體的了解可以看一下普林斯頓的公開(kāi)課
  3. 下面進(jìn)入到Neo compiler的介紹了,前面所需的基礎(chǔ)知識(shí)本文不在關(guān)注。

Compiler的框架

下面的圖主要顯示代碼的主要流程:


基本的流程
  1. Neo可以用各種語(yǔ)言寫(xiě),不過(guò)現(xiàn)在主要是C#。
  2. Neo的編譯器主要是一個(gè)翻譯器
  3. C#代碼被C#編譯器編譯成MSIL,對(duì)MSIL的理解可以查看Standard ECMA-335 Common Language Infrastructure (CLI)
  4. Neo compiler使用Mono.Cecil讀取IL
  5. Neo編譯器只關(guān)注C#中的static function,所以只是C#語(yǔ)言的一個(gè)超級(jí)閹割版
  6. Neo的編譯器遍歷IL,根據(jù)語(yǔ)義轉(zhuǎn)成Neo虛擬機(jī)的opcode
  7. 至于MSIL向neo.vm的opcode怎么轉(zhuǎn),需要仔細(xì)研究neo.vm的opcode的設(shè)計(jì)

Compiler工作一個(gè)具體事例

先看一段智能合約代碼

這段代碼沒(méi)有什么實(shí)際的作用,就是返回a+b,但是main可以接受參數(shù)。

using Neo.SmartContract.Framework;
using Neo.SmartContract.Framework.Services.Neo;

public class Sum : SmartContract
{
    public static int Main(int a, int b)
    {
        return a + b;
    }
}

MSIL

main function IL code

IL_0000 Nop
IL_0001 Ldarg_0
IL_0002 Ldarg_1
IL_0003 Add
IL_0004 Stloc_0
IL_0005 Br_S
IL_0007 Ldloc_0
IL_0008 Ret

這段代碼很簡(jiǎn)單,就是讀取參數(shù)Ldarg_0,Add,返回??梢钥吹紺LR的虛擬機(jī)也是堆棧虛擬機(jī)。
關(guān)于基于棧的虛擬機(jī)和基于寄存器的虛擬機(jī)可以看一下這些文章:
棧式虛擬機(jī)和寄存器式虛擬機(jī)?
另外還有一篇概念講解的很詳細(xì)的文章虛擬機(jī)隨談(一):解釋器,樹(shù)遍歷解釋器,基于棧與基于寄存器,大雜燴

neo.compiler

為了感性的認(rèn)識(shí)neo編譯器做了什么,我們可以看一下上面的只能合約被翻譯成了什么

hex:53-C5-6B-6C-76-6B-00-52-7A-C4-6C-76-6B-51-52-7A-C4-61-6C-76-6B-00-C3-6C-76-6B-51-C3-93-6C-76-6B-52-52-7A-C4-62-03-00-6C-76-6B-52-C3-61-6C-75-66

實(shí)際上是一串?dāng)?shù)字了,每個(gè)數(shù)字對(duì)應(yīng)一個(gè)vm的操作碼或者是數(shù)值,為了更好理解,把匯編代碼放出來(lái)

PUSH4
PUSH3
RET
PUSH3
NEWARRAY
TOTALSTACK
FROMALSTACK
DUP
TOALTSTACK
PUSH0
PUSH2
ROLL
SETITEM
FROMALSTACK
DUP
TOTALSTACK
PUSH1
PUSH2
ROLL
SETITEM
NOP
FROMALSTACK
DUP
TOTALSTACK
PUSH0
PICKITEM
FROMALSTACK
DUP
TOTALSTACK
PUSH1
PICKITEM
ADD
FROMALSTACK
DUP
TOTALSTACK
PUSH2
PUSH2
ROLL
SETITEM
JMP
FROMALSTACK
DUP
TOTALSTACK
PUSH2
PICKITEM
NOP
FROMALSTACK
DROP
ret

neo匯編的說(shuō)明,可以查看這個(gè)文檔

我們可以發(fā)現(xiàn)如下情況:

  1. MSIL的代碼很短,Neo.VM的代碼很長(zhǎng),這是由于虛擬機(jī)的指令和能力不同造成的。我們只需要關(guān)注,匯編代碼處理了局部變量的存貯獲取,參數(shù)的傳遞,程序的退出,還有add指令。
  2. 匯編代碼和compiler的生成算法相關(guān),需要我們?nèi)ネ瑫r(shí)研究neo的編譯器和虛擬機(jī),才能明白具體的細(xì)節(jié)。
  3. 具體每一行的含義,怎么執(zhí)行的,可以查看這個(gè)文檔
  4. 后面還會(huì)有一個(gè)講解虛擬機(jī)的文章,到那個(gè)時(shí)候在仔細(xì)說(shuō)明

neo.compiler代碼閱讀指南

代碼閱讀還是很頭痛的,所以做了兩個(gè)腦圖:

  1. compiler執(zhí)行腦圖
  2. compiler對(duì)象關(guān)系
對(duì)象關(guān)系
  1. ILModule是對(duì)MSIL的一個(gè)映射,包含模塊,類(lèi)型,函數(shù),字段,函數(shù)中又包含返回值,參數(shù),函數(shù)體,可以點(diǎn)開(kāi)腦圖一層一層查看。
  2. Mono.Cecil是使用來(lái)讀取MSIL的,他也是對(duì)MSIL的一個(gè)映射,由于沒(méi)有文檔,只能看代碼知道他的類(lèi)結(jié)構(gòu)了,這一部分在腦圖中沒(méi)有顯示,不過(guò)沒(méi)關(guān)系,compiler會(huì)把感興趣的代碼轉(zhuǎn)成ILModule
  3. ModuleConverter用來(lái)遍歷ILModule,把里面的MSIL轉(zhuǎn)成Neo.VM的代碼,存貯在NeoModule
  4. 具體兩邊的指令如何對(duì)應(yīng),真是需要一個(gè)一個(gè)理解的,非常繁瑣,兩邊都有很多的指令??梢钥纯催@個(gè)代碼

總結(jié)

看完這個(gè)文章,并不能了解到具體的細(xì)節(jié),具體的細(xì)節(jié)已經(jīng)在代碼中,這篇文章的主要目的是提供很多資料,提供大的框架,幫助對(duì)Neo.Compiler感興趣的程序員加速閱讀代碼的速度。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評(píng)論 19 139
  • 轉(zhuǎn)自陳明乾的博客,可能有一定更新。 轉(zhuǎn)原文聲明:原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章 原始出處 、...
    C86guli閱讀 4,877評(píng)論 6 72
  • 這篇文章是我之前翻閱了不少的書(shū)籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準(zhǔn)確的地方,同時(shí)不同JDK版本的...
    高廣超閱讀 16,051評(píng)論 3 83
  • http://blog.csdn.net/Lock_Love_/article/details/50535046
    小龍9000閱讀 692評(píng)論 0 0
  • 15年的3月,天剛剛回暖,我和老公牽著手,背起小包包,飛到了臺(tái)灣,去感受那里不一樣的風(fēng)情。臺(tái)灣名勝很多,比如日月潭...
    茗兮閱讀 442評(píng)論 0 0

友情鏈接更多精彩內(nèi)容