gpt4 book ai didi

rust - Rust 什么时候发生类型绑定(bind)?

转载 作者:行者123 更新时间:2023-11-29 08:11:20 26 4
gpt4 key购买 nike

据我所知:在 C 语言中,变量的“类型”在编译时绑定(bind),而该变量的值在运行时绑定(bind)。

例如,在int a = 10;中,类型int在编译时绑定(bind)到变量a,实际值10 在运行时绑定(bind)(或分配)给它。

但是在 Rust 中,我们有 let a = 2;。在这里,类型(比如 Rust 中任何整数类型的 i32)何时绑定(bind)到 a

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

最佳答案

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

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

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

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

fn main() {
let a = 2i32;
println!("{}", squared(a));
}

编译后输出如下:

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

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

fn main() {
let a;
}

给出这个输出:

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

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

关于rust - Rust 什么时候发生类型绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49348726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com