從零開始製作程式語言/複雜表示式
外觀
上一章介紹了處理沒有圓括號的表示式的過程。 然而,在現實世界模型中,通常使用多個級別的表示式,這顯然意味著圓括號的使用。
語法
...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.
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 倍!!
