跳转到内容

从零开始制作编程语言/复杂表达式

来自维基教科书,开放的书籍,开放的世界

圆括号

[编辑 | 编辑源代码]

上一章介绍了处理没有圆括号的表达式的过程。 然而,在现实世界模型中,通常使用多个级别的表达式,这显然意味着圆括号的使用。

语法

...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 倍!!

华夏公益教科书