当前位置:首页 » 编程软件 » 编译器中的数据结构

编译器中的数据结构

发布时间: 2025-07-01 05:10:53

编译原理的数据结构

编译原理一直是计算机学习的必修课.
当然,由编译器的阶段使用的算法与支持这些阶段的数据结构之间的交互是非常强大的。编译器的编写者尽可能有效实施这些方法且不引起复杂性。理想的情况是:与程序大小成线性比例的时间内编译器,换言之就是,在0 ( n )时间内,n是程序大小的度量(通常是字符数)。本节将讲述一些主要的数据结构,它们是其操作部分阶段所需要的,并用来在阶段中交流信息。 临时文件(temporary file):计算机过去一直未能在编译器时将整个程序保留在存储器中。这一问题已经通过使用临时文件来保存翻译时中间步骤的结果或通过“匆忙地”编译(也就是只保留源程序早期部分的足够信息用以处理翻译)解决了。存储器的限制现在也只是一个小问题了,现在可以将整个编译单元放在存储器之中,特别是在可以分别编译的语言中时。但是偶尔还是会发现需要在某些运行步骤中生成中间文件。其中典型的是代码生成时需要反填(backpatch)地址。例如,当翻译如下的条件语句时 if x = 0 then ... else ... 在知道else部分代码的位置之前必须由文本跳到else部分:
CMP X,0 JNE NEXT ;;
location of NEXT not yet known < code for then-part > NEXT : < code for else-part >
通常,必须为NEXT的值留出一个空格,一旦知道该值后就会将该空格填上,利用临时文件可以很容易地做到这一点。
如果想利用上面的编译原理开发一套属于自己的编程语言,或者想在一个产品中嵌入编程语言,可以参考zengl开源网开发的zengl编程语言,该编程语言为国人使用C语言开发,里面包含两个部分,一个是编译器,一个是解释执行中间代码的虚拟机。编译器包含了词法扫描,语法分析,中间代码输出等,虚拟机则类似JAVA一样解释执行中间代码。作者将所有的版本都公布出来,好让读者可以由浅入深的做研究,并且为了证明该编程语言的实用性,还结合SDL游戏开发库开发了一款图形界面和命令行界面的21点扑克小游戏 。
zengl编程语言目前适用平台为windows和linux (最开始在Linux下使用gcc开发,后来移植到windows平台)

Ⅱ 定义语法树和符号表的数据结构

为了维持静态作用域的程序里各个名字的轨迹,编译器需要依靠一种称为符号表的数据结构。从最基本的层次上看,符号表就是一个字典:它把名字映射到编译器已知的有关信息。这里最基本的操作是把一个新映射关系(名字对象约束)放入表里,以及(非破坏性的)用一个给定名字去提取映射下的信息,以后我们把

这两个操作分别称为insert和lookup。大部分语言里的静态作用域规则还提出了另外的复杂性,它们要求在程序里的不同部分有不同的引用环境。为了处理作用域规则,我们可能希望简单增加一个remove操作。由于编译器在语义分析阶段要从头到尾扫描代码,这样它就可以在某个作用域开始时插入新约束,在作用域最后撤销它们。但是,存在一些因素使这种直接做法并不实际。

¨ 在许多有着嵌套作用域的语言里,内层声明的效果可以遮蔽外层声明,这就意味着符号表必须有能力为一个给定名字保存任意数目的映射。lookup操作必须返回最内层的映射,到作用域结束时还必须使外层映射重新变成可见的。

¨ 类Algol语言里的记录(结构)具有某种作用域性质,但却又不享有作用域那样的良好嵌套结构。当语义分析器看到一个记录声明时,它就必须记下各个记录域的名字(它们也是递归的,因为记录可以嵌套)。在这种声明结束时,各个域的名字又必须变成不可见的。然而,在此之后,一旦这一记录类型的某个变量出现在程序的正文里(例如在my_rec.field_name),在引用中位于圆点之后的部分,这些域名又必须立即重新变成可见的。在Pascal和另一些有with语句的语言里,记录域的名字还应该在多个语句的上下文里变成可见的。

¨ 某些时候一些名字有可能在它们被声明之前使用,即使在类Algol语言里情况也如此。举例说,Algol 60和Algol 68都允许标号的向前引用。Pascal避免了这种情况,它要求标号必须在作用域开始处声明,但还是允许指针声明的向前引用:

type

Ⅲ Anders Hejlsberg讲解现代编译器构造

Anders Hejlsberg讲解现代编译器构造时,主要涵盖了以下要点

  1. 编译器的基本概念

    • 编译器是将高级语言转换为机器代码的工具。
  2. 编译器的各个阶段

    • 词法分析:将源代码转换为一系列的词法单元。
    • 语法分析:根据语法规则,将词法单元组织成语法树。
    • 语义分析:检查语法树的语义正确性,如类型检查。
    • 优化:对语法树或中间代码进行优化,以提高代码的运行效率。
    • 代码生成:将优化后的中间代码转换为目标机器的机器代码。
  3. 编译器的核心组件

    • 词法分析器:负责词法分析阶段。
    • 语法分析器:负责语法分析阶段。
    • 语义分析器:负责语义分析阶段。
    • 代码生成器:负责代码生成阶段。
  4. 编译器优化的重要性

    • Hejlsberg强调了优化在提高代码运行效率方面的重要性,并讲解了优化技术。
  5. 实际代码实现与构建编译器

    • Hejlsberg以一个开源项目为例,展示了如何使用现代工具和技术构建一个编译器。
    • 他强调了学习现代编译器构造的实际意义和价值。
  6. 关键词“token”的作用

    • Hejlsberg解释了“token”在编译器中的作用,它是词法分析阶段的重要输出。
  7. Lisp语言作为示例

    • Hejlsberg使用Lisp语言作为示例,来说明编译器如何处理复杂的数据结构。

Hejlsberg的讲解深入浅出,既有理论知识的传授,又有实际操作的指导,使得观众对现代编译器构造有了更全面的理解。

热点内容
平行线算法 发布:2025-07-01 13:10:13 浏览:600
c语言不可嵌套的是 发布:2025-07-01 13:04:33 浏览:328
三星手机老是显示存储空间不足 发布:2025-07-01 13:00:09 浏览:593
ewebeditor上传漏洞 发布:2025-07-01 13:00:08 浏览:835
电脑无解压 发布:2025-07-01 12:51:18 浏览:732
中国股票市场交易数据库 发布:2025-07-01 12:43:23 浏览:622
oppoa37怎么给应用加密 发布:2025-07-01 12:20:53 浏览:644
java毫秒数 发布:2025-07-01 12:19:14 浏览:520
评委打分c语言 发布:2025-07-01 12:10:05 浏览:145
c语言中e的次方 发布:2025-07-01 12:02:23 浏览:179