04 | 语义分析:让程序符合语义规则
宫文学
该思维导图由 AI 生成,仅供参考
你好,我是宫文学。这一讲,我们进入到语义分析阶段。
对计算机程序语义的研究,是一个专门的学科。要想很简单地把它讲清楚,着实不是太容易的事情。但我们可以退而求其次,只要能直观地去理解什么是语义就可以了。语义,就是程序要表达的意思。
因为计算机最终是用来做计算的,那么理解程序表达的意思,就是要知道让计算机去执行什么计算动作,这样才好翻译成目标代码。
那具体来说,语义分析要做什么工作呢?我们在第 1 讲中说过,每门计算机语言的标准中,都会定义很多语义规则,比如对加法运算要执行哪些操作。而在语义分析阶段,就是去检查程序是否符合这些语义规则,并为后续的编译工作收集一些语义信息,比如类型信息。
再具体一点,这些语义规则可以分为两大类。
第一类规则与上下文有关。因为我们说了,语法分析只能处理与上下文无关的工作。而与上下文有关的工作呢,自然就放到了语义分析阶段。
第二类规则与类型有关。在计算机语言中,类型是语义的重要载体。所以,语义分析阶段要处理与类型有关的工作。比如,声明新类型、类型检查、类型推断等。在做类型分析的时候,我们会用到一个工具,就是属性计算,也是需要你了解和掌握的。
补充:某些与类型有关的处理工作,还必须到运行期才能去做。比如,在多态的情况,调用一个方法时,到底要采用哪个子类的实现,只有在运行时才会知道。这叫做动态绑定。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
语义分析在编译器中扮演着重要角色,涉及程序语义研究和计算机执行计算动作的方式。该阶段包括控制流检查、闭包分析和引用消解等工作,需要处理复杂的语义规则和上下文相关的工作。编译器在语义分析过程中使用符号表和AST数据结构来记录程序中的语义信息和标识符的定义信息。此外,语义分析还涉及类型检查和类型推断,通过属性计算的方法来计算AST节点的类型属性,以及执行语法制导的翻译。实际编译器中,语义分析相关的代码量往往比词法分析和语法分析的代码量大,因为每门语言有很多语义规则,需要进行大量的语义分析和检查工作。每门语言在语义处理方面的工作差异也比较大,但可以抓住它们的共性,如上下文相关的分析、类型相关的处理、属性计算和语义信息保存到符号表和AST中。因此,语义分析是编译过程中不可或缺的一环,需要处理复杂的语义规则和上下文相关的工作,以及使用符号表和AST等数据结构来记录和计算程序的语义信息。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》,新⼈⾸单¥59
《编译原理实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(7)
- 最新
- 精选
- wusirationjava 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-092 - wusirationJAVA的语义规则在哪进行查看啊?老师
作者回复: 要查语言规范,比如:https://docs.oracle.com/javase/specs/jls/se14/html/index.html 注意,文档里并不一定会明确地说这个地方就是语义规则,但其实大部分内容都是对语义的规定,因为语法什么的是比较简单、清晰的,能用准确的语法规则来描述。而语义规则,则一般要用很多文字来揭示。 比如,“6.3. Scope of a Declaration”,就是讲作用域的,这显然是语义规则。
2020-06-081 - A君语义分析的目的就是分析出程序要计算什么东西,以及具体怎么计算: 1. 要计算什么?这个需要先经历引用消解,在作用域的符号表中建立符号和变量的映射关系。 2. 具体怎么计算?一门编程语言已经定义有很多的语义规则,具体怎么计算可以遵循这些语义来实现。由于计算本身涉及到指令,不同类型的计算使用的指令是不同的,因此,类型检查、推理也是语义分析的重要工作。2022-04-301
- 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
收起评论