何时在Rust中发生类型绑定?

Rah*_*waj 1 computer-science programming-languages rust

据我所知:在C语言中,变量的"类型"在编译期间被绑定,并且该变量的值在运行时被绑定.

例如,在编译期间int a = 10;,类型int绑定到变量,并且在运行时a将实际值10绑定(或分配)给它.

但在Rust,我们有let a = 2;.这里,什么时候类型(比如i32Rust中的任何整数类型)被绑定a

我正在构建一个前端Rust编译器,目前正在编写解析器阶段.此时,我应该为这些变量分配什么类型?

Fra*_*gné 5

类型绑定在编译时执行.这是必要的,以便编译器可以发出正确的机器指令(例如,x86_64处理器不会以两倍i32的方式乘以两个i64s).

许多动态类型的语言(如Python或Lua)将根据每个操作数的类型携带类型信息以及值(而不是变量)和运行时的调度操作.另一方面,静态类型的语言,如C或Rust,通常会丢弃大多数类型信息; 这不是必需的,因为执行操作所需的机器指令直接在可执行文件中发出(这使得静态类型程序比可比较的动态类型程序更快).

我们可以通过让编译器告诉我们类型错误(这称为类型检查)来证明类型绑定是在编译时完成的.这是一个例子:

fn squared(x: f64) -> f64 {
    x * x
}

fn main() {
    let a = 2i32;
    println!("{}", squared(a));
}
Run Code Online (Sandbox Code Playgroud)

编译它会得到以下输出:

error[E0308]: mismatched types
 --> src/main.rs:7:28
  |
7 |     println!("{}", squared(a));
  |                            ^ expected f64, found i32
Run Code Online (Sandbox Code Playgroud)

Rust编译器可以根据用法推断出许多变量的类型(类似于autoC++中的工作方式).当它不能,它会给出一个错误.例如:

fn main() {
    let a;
}
Run Code Online (Sandbox Code Playgroud)

给出这个输出:

error[E0282]: type annotations needed
 --> src/main.rs:2:9
  |
2 |     let a;
  |         ^
  |         |
  |         cannot infer type for `_`
  |         consider giving `a` a type
Run Code Online (Sandbox Code Playgroud)

当编译器遇到错误时,它会停止并且不会生成可运行的可执行文件.由于我们没有程序的可执行形式,因此没有"运行时",因此上述情况发生在编译时.

  • @RahulBharadwaj为什么不看看rustc本身如何[它](https://github.com/rust-lang/rust/blob/master/src/libsyntax/ast.rs#L1578)?你可以看到它有一个特殊的类型`Infer`,它只针对那些在源代码中不明确的类型.稍后,当编译器开始检查类型时,所有`Infer`都被实际类型替换. (2认同)