理论教育 《编译器设计之路》中的类型推断方法

《编译器设计之路》中的类型推断方法

时间:2023-11-04 理论教育 版权反馈
【摘要】:常量类型的推断没有太多的理论,实现也是比较简单的。按照本原则,编译器会将23.2推断为double。在常量类型推断方面,不同编译器的实现是不尽相同的。程序6-3 Type.cpp整型常量的类型推断是最复杂的,因为其实现类型丰富,又存在符号的差异。然而,在Neo Pascal中,表达式类型的推断规则已经在类型系统表中有详尽的描述,所以可以通过检索类型系统表轻松实现临时变量的类型推断。

《编译器设计之路》中的类型推断方法

这里,主要讨论常量的类型推断机制,或者说是常量的类型估计。至于表达式的类型推断将在表达式翻译章节中讨论。常量类型的推断没有太多的理论,实现也是比较简单的。一般而言,常量类型的推断主要有两种观点:

(1)尽可能使用值域较大的类型。以常量23.2为例,既可以将其推断为float,也可以将其推断为double。按照本原则,编译器会将23.2推断为double。

(2)尽可能使用值域较小的类型。这种推断方式的本意就是以值域能够最小适应常量值的类型推断。以18为例,既可以将其推断为int,也可以将其推断为char。按照本原则,编译器会将18推断为char。

在编译器设计中,无论采用哪一种观点都是可以接受的。在常量类型推断方面,不同编译器的实现是不尽相同的。Neo Pascal是根据第二个观点实现的。实际上,简言之,常量类型推断就是常量值检索各种类型的值域,找到最适合(视推断观点而定)的类型即可。(www.daowen.com)

程序6-3 Type.cpp

整型常量的类型推断是最复杂的,因为其实现类型丰富,又存在符号的差异。另外,值得注意的是常量的m_ConstType信息,它并不是常量的实际类型,它是词法分析时得到的类型。例如,词法分析器能够分析得到32.12是实型,但无法准确获得它到底是单精度还是双精度。本程序的功能就是根据词法分析得到的一些初步类型信息及常量字面值进一步推断其实际的类型。经过了类型推断的常量与变量一样具有了非常精准的类型信息,这有利于表达式翻译与类型检查等。

综上所述,主要讨论了常量的类型推断。在静态类型语言中,用户变量的类型是完全由用户声明的,所以并不需要编译器推断。编译器需要推断的仅仅是一些临时变量的类型。实际上,临时变量类型的推断并不复杂。临时变量的作用就是临时存储表达式的中间结果,也就是说,它的类型实际上就是表达式的类型。然而,在Neo Pascal中,表达式类型的推断规则已经在类型系统表中有详尽的描述,所以可以通过检索类型系统表轻松实现临时变量的类型推断。关于如何应用类型系统表实现表达式的翻译,将在下一节中详述。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈