【问题标题】:Type Checking in Compiler编译器中的类型检查
【发布时间】:2015-06-10 10:31:37
【问题描述】:

是否可以在使用前未声明变量的语言中对表达式进行类型检查,例如 x+y ?有人可以举个例子来解释一下。提前致谢。

【问题讨论】:

  • 如果你的表达式中的每个术语都有一个类型,你就不能进行类型检查。该语言是动态类型的吗?如果是这样,当变量获得一个新值(例如,使用赋值=)运算符时,您需要从该值推断类型并将其存储在您的 AST 中的某个位置。就像 PHP 语言一样,例如。
  • 例如,x = 2; y = 3.5; 必须从常量值 2 推断出 php 具有 INTEGER 类型,从3.5 常量推断出 y 具有 FLOAT 类型
  • 但是在类型检查之前我建议你做类型提升:en.wikipedia.org/wiki/Type_conversion
  • 部分语言支持Type Inference;所以“用特定类型声明的变量”不是必需的;但是任何相关的编译时类型检查都需要“可解析为类型[或类/限制]的表达式”。究竟如何解析表达式,以及强制执行哪些限制,在很大程度上取决于语言的设计。

标签: compiler-construction semantics typechecking


【解决方案1】:

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

Haskell 就是一个例子:

f x y = x + y

这里f 得到Num a => a -> a -> a 类型,这意味着它接受两个相同类型的数字并返回另一个该类型的数字。如果您没有明确提供,编译器会自动推断出这种类型。

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 1970-01-01
    • 2011-02-06
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多