文章閱讀頁通欄

河南22选5走势图连号:編譯NEO-AVM-高級語言-變量

來源: NEL新經濟實驗室 作者:李劍英
之前我們已經討論過地址轉換了,那么這一篇就只是關于高級語言如何轉換為AVM了 變量如何編譯 第一個問題就是變量,高級語言里面我們對變量是習......
之前我們已經討論過地址轉換了,那么這一篇就只是關于高級語言如何轉換為AVM了

變量如何編譯

第一個問題就是變量,高級語言里面我們對變量是習以為常的,而在NEOVM的指令序列里面,顯然是沒有變量的

int a=0;

那么這樣一條高級語言指令,顯然是無法被轉換的

   int a=1;
   int b=2;
   return a + b;

我們要考慮一下在NEOVM 我們擁有什么,我們擁有一個計算棧 和 一個臨時棧, 計算棧用來計算一個單純的求值表達式比較容易,比如”1+2+3+4“,但是一旦出現了變量,好像就比較復雜了。

常量的計算用計算棧很容易表達

    const int a=0;
    const int b=2;
    return a+b;
    
    ==>

    PUSH 0
    PUSH 2
    ADD
    RET

變量之所以麻煩,在于變量可能會變化,所以變量應該來自于一個位置,而不是一個具體的值

比如,一個變量列表,我們用變量列表的思路再來看一下這段程序

假設我們有一個全局的變量列表

    //we have a List<int> values;
    int a=1; //a is values[0]
    //values[0] = 1;
    int b=2; //b is values[1]
    //values[1] = 2;
    return a + b;
    //return values[0]+values[1]

實際上,我們要編譯這段代碼,就需要創建一個變量列表 我們先設計兩條偽代碼,用來操作我們的變量列表 STLOC 把值放進變量表 LDLOC 從變量表取出值

用偽代碼表示這段程序就是

    //int a=1
    PUSH 1
    STLOC 0
    //int b=2
    PUSH 2
    STLOC 1
    //return a+b
    LDLOC 0
    LDLOC 1
    ADD

    RET

然后我們把變量列表以代碼的形式直接寫出來 NEWARRAY PICKITEM SETITEM 這些操作NEOVM 都擁有了,我們在函數啟動時在臨時棧里創建一個變量列表,在函數RET時,拿掉這個變量列表,就可以了。

    //CreateArray size=2
    PUSH 2
    NEWARRAY
    TOALTSTACK

    //int a=1
    DUPFROMALTSTACK //getarray
    PUSH 0//index
    PUSH 1//value
    SETITEM

    //int b=2
    DUPFROMALTSTACK //getarray
    PUSH 1//index
    PUSH 2//value
    SETITEM

    //get value a
    DUPFROMALTSTACK //getarray
    PUSH 0//index
    PICKITEM

    //get value b
    DUPFROMALTSTACK //getarray
    PUSH 1//index
    PICKITEM

    //add
    ADD

    //return
    //cleararray
    FROMALTSTACK
    DROP
    RET

河南22选5第202期开奖 www.lyedr.com 你可以在samples/compiler_csharp01下找到這個程序

它的代碼分為明顯的幾個部分。 step01 是解釋c#源代碼為抽象語法樹(AST),這里我們可以直接調用rosyln來解決,無論你打算編譯什么高級語言,基本上把它解釋為AST這一步都有很多現成的東西可以使用

step02 是將AST變成匯編的部分 這一部分是編譯器主要的工作

step03 是連接器的工作,無論你要編譯什么東西,從什么編譯,這一部分總是一樣的。 下一篇我們會討論同樣功能的代碼從IL編譯到AVM,那時你會發現 step03 仍然是一樣的代碼。

然后就是召喚NEOVM來測試了,毫無疑問,你會得到結果3。

class Program
{
    static void Main()
    {
        int a=1;
        int b=2;
        return a+b;
    }
}
//result 3

這是它的輸出

參考源碼位置:    https://github.com/lightszero/neovmbook/tree/master/samples/compiler_csharp01

關鍵詞: NEO  NEOVM  
0/300
?