编译原理的数据结构
当然,编译器各阶段使用的算法和支持这些阶段的数据结构之间的交互是非常强大的。编译器作者试图在不导致复杂性的情况下尽可能有效地实现这些方法。理想情况下,时间编译器与程序大小成线性比例,即在0 (n)时间内,n是程序大小的度量(通常是字符数)。本节将讨论一些主要的数据结构,这些数据结构在其操作的某些阶段是需要的,并且用于在这些阶段中交换信息。临时文件:过去,计算机在编译时无法将整个程序保存在内存中。通过使用临时文件来保存翻译中中间步骤的结果,或者通过“匆忙”编译(即只保留源程序早期部分足够的信息来处理翻译),这个问题已经得到了解决。内存的限制现在只是一个小问题。现在整个编译单元都可以放在内存中,尤其是可以单独编译的语言。但是偶尔会发现,在一些操作步骤中需要生成中间文件。通常,在代码生成时,需要对地址进行回插。例如,如果x = 0,则...其他...翻译以下条件语句时,在知道else部分代码的位置之前,必须从文本跳转到else部分:
CMP X,接下来0 JNE;;
下一个地点未知<。然后部分的代码& gt下一个:& ltelse-part的代码& gt
通常情况下,必须为NEXT的值留一个空格,一旦知道了值,就会填充空格,使用临时文件就可以轻松完成。
如果想利用以上编译原理开发自己的编程语言,或者想在产品中嵌入编程语言,可以参考zengl开源网开发的zengl编程语言。这种编程语言是中国人用C语言开发的,包含两个部分,一个是编译器,一个是解释中间代码执行的虚拟机。编译器包括词法扫描、语法分析、中间代码输出等。虚拟机解释和执行像JAVA这样的中间代码。作者公布了所有版本,以便读者由浅入深地进行研究,并且为了证明编程语言的实用性,结合SDL游戏开发库开发了一款图形界面和命令行界面的21点扑克游戏。
目前zengl编程语言适用于windows和linux(最早是在Linux下用gcc开发的,后来移植到windows平台)。