轻松实现Rust系统入门,实战编译器开发MK

724 阅读3分钟

Download:百度网盘

提取码:45on

  1. 入坑rust 1.1 rust发展历程 2006年,Mozilla 员工 “Graydon Hoare” 开发了Rust。 2015年5月15日,Rust编程语言核心团队正式宣布发布Rust 1.0版本,之后连续4年,在Stack Overflow开发者「最受喜爱编程语言」评选中获得第一名。 2019年7月4日,社交网络巨头Facebook联合其他100个行业巨头,对外宣布准备建设Libra(天秤座)项目。该项目的技术特点是:构建于区块链技术之上,并且基于Rust实现。 2019年7月18日,微软安全响应中心(MSRC)发文宣称:我们需要更安全的系统编程语言。 在suricata5.0上,rust已经成为一个必选组件,被用来编写应用层解析代码。 需要基于suricata开发项目的我,不得不入坑rust了。

1.2 rust安装 rustup 是rust官方的版本管理工具。应当作为安装 Rust 的首选。 在linux/mac下,运行一条命令就行了:

1 但是由于众所周知的防火墙问题,我们需要配置一下中科大的源。

  1. Rust初印象 rust对标c/c++,是一个编译型系统级编程语言(可以用来编写操作系统的那种)。 Rust借用了C和C++的语法,它不允许空指针和悬挂指针,二者是C和C++中系统崩溃、内存泄露和不安全代码的根源。 Rust做到了内存安全而无需.NET和Java编程语言中实现自动垃圾收集器的开销,这是通过所有权/借用机制、生命周期、以及类型系统来达到的。 Rust 使用实现(implementation)、特征(trait)和结构化类型(structured type)而不是类(class)。这点,与基于继承的OO语言 C++, Java 有相当大的差异。 第一印象:

fn main() { println!("Hello, world!"); } 1 2 3 复杂一点的猜猜看游戏

use std::io; use std::cmp::Ordering; use rand::Rng;

fn main() { println!("Guess the number!");

let secret_number = rand::thread_rng().gen_range(1, 101);

loop {
    println!("Please input your guess.");

    let mut guess = String::new();

    io::stdin().read_line(&mut guess)
        .expect("Failed to read line");

    let guess: u32 = match guess.trim().parse() {
        Ok(num) => num,
        Err(_) => continue,
    };

    println!("You guessed: {}", guess);

    match guess.cmp(&secret_number) {
        Ordering::Less => println!("Too small!"),
        Ordering::Greater => println!("Too big!"),
        Ordering::Equal => {
            println!("You win!");
            break;
        }
    }
}

}

对于熟悉c/c++的我,读起来还是挺通顺的。

  1. rust语言基础 3.1 变量和可变性 变量默认是不可改变的(immutable),当变量不可变时,一旦值被绑定一个名称上,你就不能改变这个值。

fn main() { let x = 5; println!("The value of x is: {}", x); x = 6; println!("The value of x is: {}", x); } 比如这样是不对的,rust编译就会出错。

我们可以在变量名之前加 mut 来使其可变。

fn main() { let mut x = 5; println!("The value of x is: {}", x); x = 6; println!("The value of x is: {}", x); }

变量还有一个“隐藏“的玩法,这样我们就可以像python那样,”改变“一个变量的类型了。(注意不是真正改变了变量类型,而是隐藏了之前的变量)

let spaces = " "; let spaces = spaces.len();