2013-01-13 56 views
0

我一直在從頭開始實施我自己的腳本語言+虛擬機,以進行小型實驗。腳本閱讀器解析腳本並將其轉換爲運行時引擎將執行的指令流。虛擬機中的流量控制指令

在開始時我沒有考慮它,但現在我想包括流量控制(循環,分支等)。我對語言理論並不熟悉,只是看了一些啓發靈感的例子。

但是x86和java虛擬機都有大量用於流量控制的指令。在x86中,有很多指令可以根據標誌狀態和其他指令以某種方式操作相關標誌來跳轉。在Java中,似乎有16條指令可以進行某種比較和條件跳轉。

這可能是有效的或由硬件特定的原因動機,但它不是我所期待的。

我尋找一種精簡優雅的流量控制解決方案,只需要幾條專用指令,而且不會太複雜,無法實施和維護。

我很自信,我可以想出一些有用的東西,但我寧願提高我的知識,而不是重新發明輪子。任何有關材料的解釋或鏈接都非常受歡迎!

回答

1

通常用於流量控制所需的最小圖元是

  • 無條件跳轉

  • 條件跳轉

在這些中,條件跳轉是複雜的,並且在一個最低需要支持以下原子:

  • 測試二進制變量/標記

  • 如果該標誌被設置,原因指令執行跳轉到一些特定位置

  • 如果標誌被複位,允許指令執行繼續不間斷

但是,如果使用這種原始的條件跳轉,則需要將該二進制變量/標誌設置爲適用於每種類型布爾表達式的適當值,這些布爾表達式可用於流控制結構中 你的語言。

因此,這會導致需要設置二進制變量/標誌的不同複雜度的各種基元,或需要發出複雜的指令序列以獲得所需的效果。

另一種選擇是引入更復雜的條件跳轉原語。

一般來說,在每個條件跳轉原語的數量和複雜度之間會有一個折衷:條件(變量/標誌)設置原語;發出指示。

+0

我想複雜的條件跳轉原語將是我的首選解決方案。其他指令支持布爾表達式作爲參數allready,所以條件跳轉也是有意義的。另一個讓我感到困惑的問題是,我的解析器按順序工作,所以在跳轉指令被壓入指令流時跳轉的地址或偏移量將不知道。但我想,假設我有代碼塊,只需要一條指令到達當前塊的開始,一條指令就可以跳出來,對吧? – user390507