现代化的编程语言:Rust
前言:为什么说Rust现代化?
长期以来,当我们需要高性能,希望尽可能降低不必要的开销时,我们往往会使用C或C++作为主要编程语言。在运行效率上,C和C++的这一地位似乎是不可撼动的。
但是,Rust的出现使情况发生了“亿点点”变化。我们可以看到,越来越多的行业巨头开始使用Rust重写旧代码,同时大量的项目开始使用Rust作为启动语言。Rust甚至开始进入各大操作系统的底层,构建内核模块和驱动。
Why Rust?
与C语言相比
-
Rust在具有与C语言不相上下的运行效率和稳定性的同时,还有大量C语言中没有的Feature:
-
首先是内存安全问题,
-
更清晰和易读的报错信息。
-
去除了一些有争议的语法:Rust不支持 + + 和 - - 的用法,如果你受过C语言 i++ 和 ++i 的折磨,我相信你知道我在说什么:)
Rust从零开始
Rust安装
我们可以访问Rust官网:https://www.rust-lang.org/(你可以在右上角更改官网语言到中文)
找到安装选项,它会自动判断你使用的操作系统,并根据你所使用的平台给出相应的安装方案,如果你和笔者一样使用Linux,你将会看到
可以看到顶部有Install选项
按官网教程安装即可,正常来说应该不会遇到什么问题 😃
Hello Rust
首先,像学习其他编程语言一样,我们来编写hello_rust代码。
我们需要新建一个文件并命名为hello_rust.rs,然后在文件内填上一下内容。(是的,Rust的源码扩展名是 .rs )
fn main() {
println!("Hello Rust");
}
三行搞定 😃
眼尖的观众可能发现了,Rust的语法在很大程度上受到了C的影响,但随着学习的深入,你可能会发现他在某种程度上更像Javascript : )
首先,我们需要清楚一点,Rust是一种编译型语言(它的反面是解释型语言 eg: python),在此对于解释型和编译型不过多展开,有兴趣读者可以自行搜索。
编译型语言意味着着rust源码是不能执行的,而是需要经过编译,在c语言中这一过程通常是
gcc source_code.c -o out.o
在Rust也是类似,只是工具由gcc变成了rustc。
rustc hello_rust.rs -o hello_rust.o
这样我们就得到了一个名为hello_rust.o的可执行文件。
然后,执行这个可执行文件
./hello_rust.o
我们就得到了程序的输出
hello rust
Rust基本语法
变量
不同于c语言,rust使用 let 声明变量,编译器会自动判断类型。
let a = 114514;
let b = 3.1415;
let greet = "makabaka";
这和Javascript中的let
语句十分相似,但是,Rust是强类型语言。在Rust中,一旦变量的类型在初始化是确定,它的类型就不能再修改。
比如,
let a = 5;
a = "five";
就是错误的语法。
常量和变量
和大多数语言一样,Rust中也有常量和变量的概念。
const a: i32 = 123;//a是常量
let b = 5;//b是变量
mutable
Rust的默认变量是不可变的,也就是初始化后禁止修改。乍一听可能难以理解。但实际上,这主要是考虑到高并发的安全而设计的(比如避免一个线程意外地修改了另一个线程正在使用的变量造成错误),语言的设计者希望运行中变化的量尽可能少,以保证安全和稳定。
如果希望让变量“可变”,我们就要加上“mut”来修饰。这样,后续对变量的修改就合法了。
let mut a = 666;
a = 888;
注释
Rust的注释和c语言相同
come code;//我是单行注释
/*
我是多行注释
第二行
*/
Rust语句
选择(if)
rust中的if语句也与c语言十分相似。凡也有一些区别:
- rust中的if…else…语句条件的()的可选的(一般不写)。
if is_cat = true {
println!("Wow! There's a cat!");
} else {
println!("something but cat...");
}
- 如果if后只有一个语句,代码块边界{}也不能省略。
if is_dog = True
println!("Bark!"); //非法!编译会报错
else
println!("a cat maybe...");//同理,编译报错
3.rust中,if…else…可以有返回值。这意味着它可以实现类似c语言condition?a:b
的功能。
result = if a = 0 { a + 1} else { a * 2 }
循环
while循环
while not_die {
println!("working");
}
for循环
for i in 0..100 {
a += i;
}
loop循环
loop {
some code;
//run forever if you don't break out
}
分支(match)
类似c语言中的switch结构
match my_food_today {
noodle => {
println!("delicious!");
},
rice => {
println!("also good.");
},
kfc => {
println!("V 我 50, 听我接着讲[狗头]");
}
}
函数
相信在上面的hello_rust中你已经看到了rust函数的基本形式。
函数体最后的表达是就是函数的返回值,当然你也可以使用return
提前返回。
fn function(input: isize) -> isize {
if input == 0 {
return 1;
}
let output = 2 * input;
output
}
你可以使用{}编写一个匿名函数(类似python中的lamda函数)
let b = {
let c = a + b
c + 5
}
所有权
接下来就来到了重头戏:Rust的所有权机制。相信小伙伴们应该早有耳闻。
Rust的所有权机制是为更方便、高效的内存管理而生的。
传统的编程语言中(如c和c++),开发者需要手动申请和释放内存,但实际生产中效果不甚理想,因此,Rust引入所有权机制让编译器更高效地管理内存。
所有权有以下三条规则:(引自runoob)
1.Rust 中的每个值都有一个变量,称为其所有者。
2. 一次只能有一个所有者。
3. 当所有者不在程序运行范围时,该值将被删除。
未完待续。。。