跳轉到內容

從零開始製作程式語言/複雜表示式

來自華夏公益教科書,開放的書籍,開放的世界

圓括號

[編輯 | 編輯原始碼]

上一章介紹了處理沒有圓括號的表示式的過程。 然而,在現實世界模型中,通常使用多個級別的表示式,這顯然意味著圓括號的使用。

語法

...Expression...(...Expression...More parenthesizes...)...

處理圓括號的演算法。

1.Go through the entire line. Increment index of array until element is ';' or ')'.
(This assumes that the expression has gone through function call processing, which is dealt with later.)
 1.1 If ';' terminate process
 1.2 If ')' continue.
2. While element not '(' decrement index.
3. Remove segment thus isolated by '(' and ')'. Store in separate array. Replace by 'pa(pnum)'.
4. Replace ')' by ';' and append to start 'pa(pnum)=' (replace pnum by actual value of variable)
5.Send to previous algorithm.
Repeat step 1.


Clipboard

待辦事項
新增更多內容


表示式轉換示例

[編輯 | 編輯原始碼]
i p=(p*r*t)/100; 

i 表示它將是一個整數表示式。

結果

Mov eax,p
IMUL r,eax
MOV eax,eax
MOV eax,eax
IMUL t,eax
MOV eax,eax
MOV va1,eax
MOV eax,va1
MOV pa1,eax
MOV eax,pa1
CDQ
IDIV pa1/100
MOV p,eax

現在,這不是最好的結果,但這個結果是有效的。 然而,還有巨大的最佳化機會。 正如您所見,幾乎三分之一的程式碼是垃圾,包含像這樣的無意義指令

MOV eax,eax

其他時候,編譯器會將值載入到 eax 中,然後將其轉儲到另一個變數中。(在我的系統上,這是故意的,因為指令不能使用兩個記憶體運算元。

在繼續之前,嘗試自己最佳化這個演算法。

終於有一些優勢了!!

[編輯 | 編輯原始碼]

這裡我們比通用市場語言有優勢。 因為它們是為可移植性而設計的,所以它們通常使用稱為“模擬器”的東西,它不使用數學協處理器,而是使用 CPU 來整數模擬浮點計算。 在我們的例子中,我們使用直接浮點命令,這會降低可移植性,但將執行速度提高了近 100 倍!!

華夏公益教科書