NEXT社區小課堂 | 第十二課:NEO編譯器

NEXT社區 | 小課堂git

因爲近期NEXT社區加入不少新的小夥伴,有在校大學生,有對區塊鏈感興趣的傳統企業從業者。爲了更方便、更系統的讓NEXT社區的夥伴們瞭解NEO的技術知識,所以咱們開設了小課堂,每週3節,向你們普及NEO相關的知識要點!程序員

 

NEXT社區小課堂 | 第十二課github

NEO編譯器算法


1、項目連接

 

一、NEO自己是開源的,在github搜索就能夠拿到源碼,爲了方便調試,把全部代碼都放在一塊兒。windows

https://github.com/benhaben/neo-compiler.git框架

 

二、NEO是C#開發的,大部分代碼能夠跨平臺,可是也有不能再mac上運行的代碼,好比改裝後的leveldb的代碼,因此最好仍是用Visual Studio在windows上調試研究較好。函數

 

三、本文檔如今不太規範,主要考慮好理解,並不完善,後面也能夠進一步規範化提交到NEO項目中。區塊鏈

 

 

2、主框架

 

 

你們能夠看到Compiler所處的位置spa

 

 

3、Compiler做用

 

一、在NEO區塊鏈系統中,智能合約是一段代碼,能夠完成必定的邏輯,最後算出合約的結果。如今已經有不少具體的應用了,感興趣的能夠看一下基於NEO作的項目。翻譯

 

二、若是對比特幣或者智能合約不瞭解,不知道爲何須要有這些代碼,能夠看一下比特幣的白皮書。這裏簡單說一下,在比特幣系統中,當一個「人」(能夠當作一個公鑰)須要和另外一個「人」產生交易的時候,這段代碼用來檢查身份,分配比特幣。具體的瞭解能夠看一下普林斯頓的公開課。

 

三、下面進入到NEO compiler的介紹了,前面所需的基礎知識本文不在關注。

 

 

4、Compiler的框架

 

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

 

 

一、NEO能夠用各類語言寫,不過如今主要是C#


二、NEO的編譯器主要是一個翻譯器

 

三、C#代碼被C#編譯器編譯成MSIL,對MSIL的理解能夠查看Standard ECMA-335 Common Language Infrastructure (CLI)

 

四、Neo compiler使用Mono.Cecil讀取IL

 

五、NEO編譯器只關注C#中的static function,因此只是C#語言的一個超級閹割版

 

六、NEO的編譯器遍歷IL,根據語義轉成NEO虛擬機的opcode

 

七、至於MSIL向NEO.VM的opcode怎麼轉,須要仔細研究NEO.VM的opcode的設計

 

 

5、Compiler工做一個具體事例

 

先看一段智能合約代碼

 

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;}}

 

 

6、MSIL

 

main function IL code

 

IL_0000 NopIL_0001 Ldarg_0IL_0002 Ldarg_1IL_0003 AddIL_0004 Stloc_0IL_0005 Br_SIL_0007 Ldloc_0IL_0008 Ret

 

這段代碼很簡單,就是讀取參數Ldarg_0,Add,返回。能夠看到CLR的虛擬機也是堆棧虛擬機。

 

 

7、neo.compiler

 

爲了感性的認識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

 

其實是一串數字了,每一個數字對應一個vm的操做碼或者是數值,爲了更好理解,把彙編代碼放出來

PUSH4PUSH3RETPUSH3NEWARRAYTOTALSTACKFROMALSTACKDUPTOALTSTACKPUSH0PUSH2ROLLSETITEMFROMALSTACKDUPTOTALSTACKPUSH1PUSH2ROLLSETITEMNOPFROMALSTACKDUPTOTALSTACKPUSH0PICKITEMFROMALSTACKDUPTOTALSTACKPUSH1PICKITEMADDFROMALSTACKDUPTOTALSTACKPUSH2PUSH2ROLLSETITEMJMPFROMALSTACKDUPTOTALSTACKPUSH2PICKITEMNOPFROMALSTACKDROPret

 

咱們能夠發現以下狀況:

 

一、MSIL的代碼很短,NEO.VM的代碼很長,這是因爲虛擬機的指令和能力不一樣形成的。咱們只須要關注,彙編代碼處理了局部變量的存貯獲取,參數的傳遞,程序的退出,還有add指令

 

二、彙編代碼和compiler的生成算法相關,須要咱們去同時研究NEO的編譯器和虛擬機,才能明白具體的細節

 

三、具體每一行的含義,怎麼執行的,能夠查看這個文檔

 

四、後面還會有一個講解虛擬機的文章,到那個時候在仔細說明

 

 

8、neo.compiler代碼閱讀指南

 

代碼閱讀仍是很頭痛的,因此作了兩個腦圖:

 

一、compiler執行腦圖

二、compiler對象關係

 

 

一、ILModule是對MSIL的一個映射,包含模塊,類型,函數,字段,函數中又包含返回值,參數,函數體,能夠點開腦圖一層一層查看

 

二、Mono.Cecil是使用來讀取MSIL的,他也是對MSIL的一個映射,因爲沒有文檔,只能看代碼知道他的類結構了,這一部分在腦圖中沒有顯示,不過不要緊,compiler會把感興趣的代碼轉成ILModule

 

三、ModuleConverter用來遍歷ILModule,把裏面的MSIL轉成NEO.VM的代碼,存貯在NeoModule

 

四、具體兩邊的指令如何對應,真是須要一個一個理解的,很是繁瑣,兩邊都有不少的指令。能夠看看這個代碼

 

 

9、總結

 

看完這個文章,並不能瞭解到具體的細節,具體的細節已經在代碼中,這篇文章的主要目的是提供不少資料,提供大的框架,幫助對NEO.Compiler感興趣的程序員加速閱讀代碼的速度。

 

 

原文連接:https://www.jianshu.com/p/6461b4e18089

 

 

  聯繫咱們  

微博:https://weibo.com/u/6724929880

官網:https://neonext.club/

QQ羣:612334080

電報:https://t.me/neonextop

twitter:https://twitter.com/NE0NEXT

 

掃碼關注NEO NEXT官方公衆號

獲取更多一手社區資訊

相關文章
相關標籤/搜索