从零开始制作编程语言/复杂表达式
外观
上一章介绍了处理没有圆括号的表达式的过程。 然而,在现实世界模型中,通常使用多个级别的表达式,这显然意味着圆括号的使用。
语法
...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 倍!!