编译原理实战课
宫文学
北京原点代码 CEO
26065 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
真实编译器解析篇 (19讲)
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

04 | 语义分析:让程序符合语义规则

参考资料
一课一思
属性计算
类型分析和处理
符号表(Symbol Table)
上下文相关的分析
语义分析

该思维导图由 AI 生成,仅供参考

你好,我是宫文学。这一讲,我们进入到语义分析阶段。
对计算机程序语义的研究,是一个专门的学科。要想很简单地把它讲清楚,着实不是太容易的事情。但我们可以退而求其次,只要能直观地去理解什么是语义就可以了。语义,就是程序要表达的意思
因为计算机最终是用来做计算的,那么理解程序表达的意思,就是要知道让计算机去执行什么计算动作,这样才好翻译成目标代码。
那具体来说,语义分析要做什么工作呢?我们在第 1 讲中说过,每门计算机语言的标准中,都会定义很多语义规则,比如对加法运算要执行哪些操作。而在语义分析阶段,就是去检查程序是否符合这些语义规则,并为后续的编译工作收集一些语义信息,比如类型信息。
再具体一点,这些语义规则可以分为两大类
第一类规则与上下文有关。因为我们说了,语法分析只能处理与上下文无关的工作。而与上下文有关的工作呢,自然就放到了语义分析阶段。
第二类规则与类型有关。在计算机语言中,类型是语义的重要载体。所以,语义分析阶段要处理与类型有关的工作。比如,声明新类型、类型检查、类型推断等。在做类型分析的时候,我们会用到一个工具,就是属性计算,也是需要你了解和掌握的。
补充:某些与类型有关的处理工作,还必须到运行期才能去做。比如,在多态的情况,调用一个方法时,到底要采用哪个子类的实现,只有在运行时才会知道。这叫做动态绑定。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

语义分析在编译器中扮演着重要角色,涉及程序语义研究和计算机执行计算动作的方式。该阶段包括控制流检查、闭包分析和引用消解等工作,需要处理复杂的语义规则和上下文相关的工作。编译器在语义分析过程中使用符号表和AST数据结构来记录程序中的语义信息和标识符的定义信息。此外,语义分析还涉及类型检查和类型推断,通过属性计算的方法来计算AST节点的类型属性,以及执行语法制导的翻译。实际编译器中,语义分析相关的代码量往往比词法分析和语法分析的代码量大,因为每门语言有很多语义规则,需要进行大量的语义分析和检查工作。每门语言在语义处理方面的工作差异也比较大,但可以抓住它们的共性,如上下文相关的分析、类型相关的处理、属性计算和语义信息保存到符号表和AST中。因此,语义分析是编译过程中不可或缺的一环,需要处理复杂的语义规则和上下文相关的工作,以及使用符号表和AST等数据结构来记录和计算程序的语义信息。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • wusiration
    java specs的15.23. Conditional-And Operator &&章节中,Each operand of the conditional-and operator must be of type boolean or Boolean, or a compile-time error occurs.的规则,会有编译过程对&&操作符的语义判断; 举例: boolean res = true && Boolean.TRUE 在语义分析中,会进行&&操作符两侧的操作数进行类型判断,判断是否为boolean或者Boolean,否则会抛出编译错误;

    作者回复: 非常好!

    2020-06-09
    2
  • wusiration
    JAVA的语义规则在哪进行查看啊?老师

    作者回复: 要查语言规范,比如:https://docs.oracle.com/javase/specs/jls/se14/html/index.html 注意,文档里并不一定会明确地说这个地方就是语义规则,但其实大部分内容都是对语义的规定,因为语法什么的是比较简单、清晰的,能用准确的语法规则来描述。而语义规则,则一般要用很多文字来揭示。 比如,“6.3. Scope of a Declaration”,就是讲作用域的,这显然是语义规则。

    2020-06-08
    1
  • A君
    语义分析的目的就是分析出程序要计算什么东西,以及具体怎么计算: 1. 要计算什么?这个需要先经历引用消解,在作用域的符号表中建立符号和变量的映射关系。 2. 具体怎么计算?一门编程语言已经定义有很多的语义规则,具体怎么计算可以遵循这些语义来实现。由于计算本身涉及到指令,不同类型的计算使用的指令是不同的,因此,类型检查、推理也是语义分析的重要工作。
    2022-04-30
    1
  • Banbri
    刚好路过龙书第五章 龙书 第五章 语法制导的翻译 中两标记方法。 1.语法制导定义(Syntax-Directed Definition,SSD)是一个上下文无关文法和属性及规则的结合。 2.语法制导翻译(Syntax-Directed Translation,SDT) 是在其产生式体中嵌入了程序片段的一个上下文无关文法。 对于两种标记方法,语法制导定义更加易读,因此更适合作为对翻译的规约,而翻译方案更加高效,因此更适合用于翻译的实现
    2023-09-16归属地:上海
  • A君
    语义分析将各节点的属性标注回AST或符号表中。
    2022-04-22
  • ifelse
    这就难了
    2022-01-07
  • 李滋芸
    Java编译器中使用了语法制导翻译了?
    2021-11-20
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部