91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Neo的Compiler工作怎么實現

發布時間:2022-01-11 16:06:46 來源:億速云 閱讀:119 作者:iii 欄目:互聯網科技

這篇文章主要介紹“Neo的Compiler工作怎么實現”,在日常操作中,相信很多人在Neo的Compiler工作怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Neo的Compiler工作怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Compiler作用
  1. 在Neo區塊鏈系統中,智能合約是一段代碼,可以完成一定的邏輯,最后算出合約的結果。現在已經有很多具體的應用了,感興趣的可以看一下基于Neo做的項目。

  2. 如果對比特幣或者智能合約不了解,不知道為什么需要有這些代碼,可以看一下比特幣的白皮書。這里簡單說一下,在比特幣系統中,當一個“人”(可以看成一個公鑰)需要和另一個“人”產生交易的時候,這段代碼用來檢查身份,分配比特幣。具體的了解可以看一下普林斯頓的公開課

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

Compiler的框架

基本的流程

  1. Neo可以用各種語言寫,不過現在主要是C#。

  2. Neo的編譯器主要是一個翻譯器

  3. C#代碼被C#編譯器編譯成MSIL,對MSIL的理解可以查看Standard ECMA-335 Common Language Infrastructure (CLI)

  4. Neo compiler使用Mono.Cecil讀取IL

  5. Neo編譯器只關注C#中的static function,所以只是C#語言的一個超級閹割版

  6. Neo的編譯器遍歷IL,根據語義轉成Neo虛擬機的opcode

  7. 至于MSIL向neo.vm的opcode怎么轉,需要仔細研究neo.vm的opcode的設計

Compiler工作一個具體事例

先看一段智能合約代碼

這段代碼沒有什么實際的作用,就是返回a+b,但是main可以接受參數。

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

這段代碼很簡單,就是讀取參數Ldarg_0,Add,返回。可以看到CLR的虛擬機也是堆棧虛擬機。
關于基于棧的虛擬機和基于寄存器的虛擬機可以看一下這些文章:
棧式虛擬機和寄存器式虛擬機?
另外還有一篇概念講解的很詳細的文章虛擬機隨談(一):解釋器,樹遍歷解釋器,基于棧與基于寄存器,大雜燴

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的操作碼或者是數值,為了更好理解,把匯編代碼放出來

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匯編的說明,可以查看這個文檔

我們可以發現如下情況:

  1. MSIL的代碼很短,Neo.VM的代碼很長,這是由于虛擬機的指令和能力不同造成的。我們只需要關注,匯編代碼處理了局部變量的存貯獲取,參數的傳遞,程序的退出,還有add指令。

  2. 匯編代碼和compiler的生成算法相關,需要我們去同時研究neo的編譯器和虛擬機,才能明白具體的細節。

  3. 具體每一行的含義,怎么執行的,可以查看這個文檔

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

neo.compiler代碼閱讀指南

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

  1. compiler執行腦圖

  2. compiler對象關系

Neo的Compiler工作怎么實現

對象關系

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

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

  3. ModuleConverter用來遍歷ILModule,把里面的MSIL轉成Neo.VM的代碼,存貯在NeoModule

  4. 具體兩邊的指令如何對應,真是需要一個一個理解的,非常繁瑣,兩邊都有很多的指令。可以看看這個代碼

到此,關于“Neo的Compiler工作怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南雄市| 清河县| 乐山市| 安陆市| 西乡县| 阿坝县| 广元市| 宁化县| 石屏县| 漳州市| 西昌市| 汽车| 周宁县| 嵩明县| 大城县| 鹤庆县| 肃北| 浪卡子县| 泗阳县| 探索| 和平区| 高阳县| 手游| 崇阳县| 阿拉尔市| 苏州市| 同心县| 容城县| 银川市| 东源县| 南京市| 酒泉市| 博湖县| 新津县| 普陀区| 商南县| 当雄县| 锡林郭勒盟| 黄骅市| 汝城县| 时尚|