上一章咱們已經簡單介紹了Solidity語言的基本概念及特色,在瞭解Solidity的基礎知識及用法後,咱們能夠嘗試在Remix、JIDE等編譯器上嘗試編寫一些簡單的智能合約,以此來更好地熟悉開發智能合約所需的環境及基礎。那麼今天,咱們將在這裏更詳細地講解一些Solidity語言的語法。編程
首先來說解一下Solidity語言中的源文件映射。它做爲AST輸出的一部分,各個編譯器會提供AST中節點對應的源代碼範圍。可用於檢測AST靜態代碼,分析錯誤,也可用於高亮本地變量以及對應的調試工具。編譯器也能生成從字節碼到指令源代碼之間的範圍映射,這在靜態分析工具中佔據着重要地位,在字節碼級別中的分析,可在調試工具中顯示對應的代碼位置,同時也支持斷點操做。數組
接下來,讓咱們一塊兒來了解一下屬於Solidity語言特有的性質。Solidity有着一些獨特的語法,函數類型。在Solidity語言中,函數類型能夠做爲本地變量,也就是說,在使用var 時,能夠給var賦予不一樣的函數。bash
而Solidity語言還有着兩個很是有意思的內部機制:清理變量(Cleaning Up Variables)與優化(The Optimizer)。編程語言
contract FunctionSelector {
function select(bool useB, uint x) returns (uint z) {
var f = a;
if (useB) f = b;
return f(x);
}
function a(uint x) returns (uint z) {
return x * x;
}
function b(uint x) returns (uint z) {
return 2 * x;
}
}
複製代碼
清理變量(Cleaning Up Variables):在Solidity中,當一個值的佔用位數小於32個字節,其中無用的位將會被清除。Solidity編譯器可在因無用的數據而產生任何反作用以前就將這些無用的數據清除,例如,在向內存寫入一個值以前,不須要的字節位須要先清除掉,由於沒有用到的內存位也可能被用於計算哈希值,也可能會做爲消息調用做爲數據存儲。一樣,在storage中存儲的無用字節位也需處理,不然會帶來一些負面影響。 另外,後續操做的不正確也會產生反作用,咱們是不會主動的去處理無用字節位的。Solidity編譯器會在輸入數據加載到棧上後對這些無用字節位進行相應處理。不一樣的無效值有着不同的處理規則: 函數
優化(The Optimizer):Solidity的優化基於彙編,也就是說,Solidity能夠被其餘的編程語言使用。編譯器在JUMP和JUMPDEST處拆分基本的指令序列爲一個個的基本塊。在這些代碼塊中,全部的指令都將被分析。全部的對棧,內存或存儲的操做被記錄成由指令及其參數組成的一個個表達式,而這些表達式又會指向另外一個表達式。核心目的是找到一些表達式在任何輸入的狀況下都恆等,而後將它們組合成一個表達式類。優化器首先嚐試在一系列已知的表達式中,找出一些全新的表達式。若是找不到,表達式經過一些簡單的原則進行簡化。流程最後,會有一個表達式處於棧頂,而且有一系列的對內存或存儲的修改。這些信息與基本塊存在一塊兒以方便地對他們進行鏈接。此外,關於棧,存儲和內存配置的信息會傳遞到下一個塊。若是咱們知道全部JUMP和JUMPI指令的目標,咱們就能夠構建程序的完整的控制流程圖。在最後一步中,每一個塊中的代碼都將從新生成。在某個塊結束時,將生成棧上表達式的依賴樹,不在依賴樹上的操做會被處理。在咱們原始代碼中想要應用的對內存、存儲想要的修改順序的代碼就生成出來了(被丟棄的修改被斷定爲徹底不須要的),最終,生成了全部的須要在棧上存在的值。工具
這些步驟應用於每一個基本的塊,若是新生成的代碼更小,將會替換現有的代碼。若是一個塊處於分析期間時在JUMPI處分裂,條件被證明爲一個常量,JUMPI將能夠基於常量值被替換掉,好比下述代碼:post
var x = 7;
data[7] = 9;
if (data[x] != x + 2)
return 2;
else
return 1;
複製代碼
簡化的代碼能夠被編譯爲:優化
data[7] = 9;
return 1;
複製代碼
Solidity的完整語法,敬請期待後續文章。ui
部分資料來源:http://www.tryblockchain.org/spa