Compiler construction 编译器中的类型检查

Compiler construction 编译器中的类型检查,compiler-construction,semantics,typechecking,Compiler Construction,Semantics,Typechecking,在使用变量之前未声明的语言中,是否可以对表达式(例如x+y)进行类型检查?有人能举例说明吗。提前感谢。在类型检查方面没有变量声明的主要影响是您的变量没有显式声明类型。因此,您的问题可以归结为是否可以在没有或可选类型签名的语言中键入检查表达式。答案是肯定的,因为存在静态类型语言,其中类型签名是可选的,类型只是推断出来的 哈斯克尔就是一个例子: f x y = x + y 这里f获取类型numa=>a->a->a,这意味着它接受相同类型的两个数字,并返回该类型的另一个数字。如果不显式提供此类型,编

在使用变量之前未声明的语言中,是否可以对表达式(例如x+y)进行类型检查?有人能举例说明吗。提前感谢。

在类型检查方面没有变量声明的主要影响是您的变量没有显式声明类型。因此,您的问题可以归结为是否可以在没有或可选类型签名的语言中键入检查表达式。答案是肯定的,因为存在静态类型语言,其中类型签名是可选的,类型只是推断出来的

哈斯克尔就是一个例子:

f x y = x + y

这里
f
获取类型
numa=>a->a->a
,这意味着它接受相同类型的两个数字,并返回该类型的另一个数字。如果不显式提供此类型,编译器会自动推断它。

如果表达式中的每个项都没有类型,则无法执行类型检查。这种语言是动态类型的吗?如果是这样,当变量获得一个新值(例如,使用赋值
=
)运算符时,您需要从该值推断类型并存储在AST中的某个位置。与PHP语言类似,例如,
x=2;y=3.5
您必须从常量值
2
推断php具有整数类型,从
3.5
常量推断
y
具有浮点类型,但在类型检查之前,我建议您进行类型升级:一些语言支持;因此“用特定类型声明的变量”不是必需的;但任何相关的编译时类型检查都需要“可解析为类型[或类/限制]”的表达式。表达式的具体解析方式以及强制执行的限制在很大程度上取决于语言的设计。