标签 Rust 下的文章

如果你打算在今年探索 Rust,请下载我们的免费 Rust 速查表,以供快速参考基础知识。

 title=

Rust 是一门相对较新的编程语言,受到各个企业的 程序员的欢迎。尽管如此,它仍是一门建立在之前所有事物之上的语言。毕竟,Rust 不是一天做出来的,所以即便 Rust 中的一些概念看起来与你从 Python、Java、C++ 等编程语言学到的东西大不相同,但它们都是基于同一个基础,那就是你一直与之交互(无论你是否知道)的 CPU 和 NUMA( 非统一内存访问 Non Uniform Memory Access )架构,因此 Rust 中的一些新功能让人感觉有些熟悉。

现在,我的职业不是程序员。我没耐心但我又有点儿强迫症。当我需要完成某件事时,如果一门语言不能帮助我相对较快地获得想要的结果,那么我很少会受到鼓舞而使用它。Rust 试图平衡两个矛盾:现代计算机对安全和结构化代码的需求,和现代程序员对编码工作事半功倍的渴望。

安装 Rust

rust-lang.org 网站有丰富的的文档指导如何安装 Rust,但通常,它就像下载 sh.rustup.rs 脚本并运行它一样简单。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs
$ less sh.rustup.sh
$ sh ./sh.rustup.rs

没有类

Rust 没有类,也不使用 class 关键字。Rust 确实有 struct 数据类型,但它的作用是充当数据集合的一种模板。因此,你可以使用 结构体 struct ,而不是创建一个类来表示虚拟对象:

struct Penguin {
  genus: String,
  species: String,
  extinct: bool,
  classified: u64,
}

你可以像使用类一样使用它。例如,当定义完 Penguin 结构,你就可以创建它的实例,并与该实例进行交互:

struct Penguin {
  genus: String,
  species: String,
  extinct: bool,
  classified: u64,
}

fn main() {
  let p = Penguin { genus: "Pygoscelis".to_owned(),
    species: "R adeliæ".to_owned(), 
    extinct: false, 
    classified: 1841 };

  println!("Species: {}", p.species);    
  println!("Genus: {}", p.genus);
  println!("Classified in {}", p.classified);
  if p.extinct == true {
    println!("Sadly this penguin has been made extinct.");
  }
}

impl 数据类型与 struct 数据类型结合使用,你可以实现一个包含函数的结构体,并且可以添加继承和其他与类相似的特性。

函数

Rust 中的函数很像其他语言中的函数。每个函数都代表一组严谨的任务,你可以在需要时调用它们。主函数名必须是 main

fn 关键字声明函数,后跟函数名称和函数接受的所有参数。

fn foo() {
  let n = 8;
  println!("Eight is written as {}", n);
}

通过参数,将信息从一个函数传递到另一个函数。例如,我已经创建了一个 Penguin 类(结构),并且我有一个 Penguin 的实例为 p,将目标函数的参数指定为 Penguin 类型,就可把 p 的属性从一个函数传递到另一个函数。

fn main() {
  let p = Penguin { genus: "Pygoscelis".to_owned(), 
    species: "R adeliæ".to_owned(), 
    extinct: false, classified: 1841 };
  printer(p);
}

fn printer(p: Penguin) {
  println!("Species: {}", p.species);    
  println!("Genus: {}", p.genus);
  println!("Classified in {}", p.classified);
  if p.extinct == true {
    println!("Sadly this penguin has been made extinct.");
  }
}

变量

Rust 默认创建的为 不可变 immutable 变量。这意味着你创建的变量以后无法更改。这段代码虽然看起来没问题,但无法编译:

fn main() {
  let n = 6;
  let n = 5;
}

但你可以使用关键字 mut 声明一个 可变 mutable 变量,因此下面这段代码可以编译成功:

fn main() {
  let mut n = 6;
  println!("Value is {}", n);
  n = 5;
  println!("Value is {}", n);
}

编译

Rust 编译器,至少就其报错信息而言,是可用的最好的编译器之一。当你在 Rust 中出错时,编译器会真诚地告诉你做错了什么。实际上,仅通过从编译器错误消息中学习,我就了解了 Rust 的许多细微差别(就我理解到的 Rust 的任何细微差别而言)。即便有时错误消息太过于模糊,而不知所以然,互联网搜索几乎总能得到解释。

启动 Rust 程序的最简单方法是使用 cargo,它是 Rust 的包管理和构建系统。

$ mkdir myproject
$ cd myproject
$ cargo init 

以上命令为项目创建了基本的基础架构,最值得注意的是 src 子目录中的 main.rs 文件。打开此文件,把我为本文生成的示例代码粘贴进去:

struct Penguin {
  genus: String,
  species: String,
  extinct: bool,
  classified: u64,
}

fn main() {
  let p = Penguin { genus: "Pygoscelis".to_owned(), species: "R adeliæ".to_owned(), extinct: false, classified: 1841 };
  printer(p);
  foo();
}

fn printer(p: Penguin) {
  println!("Species: {}", p.species);    
  println!("Genus: {}", p.genus);
  println!("Classified in {}", p.classified);
  if p.extinct == true {
    println!("Sadly this penguin has been made extinct.");
  }
}

fn foo() {
  let mut n = 6;
  println!("Value is {}", n);
  n = 8;
  println!("Eight is written as {}", n);
}

使用 cargo build 命令进行编译:

$ cargo build

执行 target 子目录下的二进制程序,或者直接运行 cargo run 命令来运行你的项目:

$ cargo run
Species: R adeliæ
Genus: Pygoscelis
Classified in 1841
Value is 6
Eight is written as 8

Crates

任何语言的大部分便利都来自于它的库或模块。在 Rust 中,进行分发和跟踪的库称为 “crate”(箱子)。crates.io 是一个很好的社区 crate 注册网站。

把一个 crate 添加到你的 Rust 项目,首先要在 Cargo.toml 文件中添加这个 crate。例如,要安装随机数函数,我使用名为 rand 的 crate,使用 * 作为通配符,以确保在编译时获得最新版本:

[package]
name = "myproject"
version = "0.1.0"
authors = ["Seth <[email protected]>"]
edition = "2022"

[dependencies]
rand = "*"

在 Rust 代码中使用它需要在最顶行使用 use 语句:

use rand::Rng;

以下是一些创建随机种子和随机范围的示例代码:

fn foo() {
  let mut rng = rand::thread_rng();
  let mut n = rng.gen_range(1..99);

  println!("Value is {}", n);
  n = rng.gen_range(1..99);
  println!("Value is {}", n);
}

你可以使用 cargo run 来运行它,它会检测代码是否被更改并触发一个新的构建。构建过程中下载名为 randcrete 和它依赖的所有 crate,编译代码,然后运行它:

$ cargo run
Updating crates.io index
Downloaded ppv-lite86 v0.2.16
Downloaded 1 crate (22.2 KB) in 1.40s
 Compiling libc v0.2.112
 Compiling cfg-if v1.0.0
 Compiling ppv-lite86 v0.2.16
 Compiling getrandom v0.2.3
 Compiling rand_core v0.6.3
 Compiling rand_chacha v0.3.1
 Compiling rand v0.8.4
 Compiling rustpenguin v0.1.0 (/home/sek/Demo/rustpenguin)
 Finished dev [unoptimized + debuginfo] target(s) in 13.97s
 Running `target/debug/rustpenguin`

Species: R adeliæ
Genus: Pygoscelis
Classified in 1841
Value is 70
Value is 35

Rust 速查表

Rust 是一门令人非常愉快的语言。集成了在线注册网站、有用的编译器和几乎直观的语法,它给人的适当的现代感。

但请不要误会,Rust 仍是一门复杂的语言,它具有严格的数据类型、强作用域变量和许多内置方法。Rust 值得一看,如果你要探索它,那么你应该下载我们的免费 Rust 速查表,以便快速了解基础知识。越早开始,就越早了解 Rust。当然,你应该经常练习以避免生疏。

Rust 速查表

via: https://opensource.com/article/22/1/rust-cheat-sheet

作者:Seth Kenlon 选题:lujun9972 译者:hanszhao80 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 5.18 再次尝试默认启用 -Werror

去年,在 Linux 5.15 中,内核尝试默认启用 -Werror,将所有编译器警告视为错误。其动机是为了确保编译器警告被开发人员认真对待,并让新代码不会引入任何新的警告。这一变化给 Linux 内核带来了很多构建时的痛苦,因此这次努力以失败而告终。在今天结束 Linux 5.18 合并窗口前,又送来了一批 “x86/紧急” 更新,其中默认启用了 Linux x86/x86\_64 上的 CONFIG\_WERROR 开关。

老王点评:想必经过了几个版本的准备,这次可能能够顺利执行下去。

微软开始通过 HTTPS 连接提供 Windows 更新

据消息,有人在试图下载微软 Windows 的一个更新时发现,更新文件包的 URL 从 HTTP 换成了 HTTPS。之前,用户可能遇到的一个问题是,他们无法再在浏览器中下载更新,因为微软只通过 HTTP 链接提供下载,而现代浏览器开始阻止 HTTP 下载链接,甚至微软自己的 Edge 浏览器最近也开始阻止从该公司的更新目录网站下载。

老王点评:这很令人意外,居然还一直在用 HTTP。

基于 Rust 的 Coreutils 实现发布新版本

据消息,Uutils 是一个基于 Rust 的 Coreutils 实现,它已经足够好,至少在基本功能方面 以及可以构成一个可工作的 Debian Linux 系统。上周末发布了一个新版本 0.0.13,为 cpdddfsplittr 等工具带来了许多改进,以及增加了不同工具支持的各种参数以提高 GNU 兼容性。

老王点评:期待看到 Rust 逐渐取代这些用 C 语言开发的基础工具,所带来的安全和性能改进。

elementary OS 联合创始人宣布完全退出项目

之前我们 报道过 elementary OS 背后的开发商 elementary 面临瓦解的消息。现在结果出来了,Cassidy 前几天 撰文 告别:为了维持项目和公司,创始人们曾经讨论过分头出去找另外一份工作,因此他留意到一份合适的工作。他准备接受这份工作,放弃在 elementary 的工资以降低公司压力,同时减少为 elementary 工作的时间。但是却被另外一位合伙人 Daniel 要求完全退出,包括放弃其拥有的股份。最终,Cassidy 决定接受这一要求,让 Daniel 完全拥有 elementary 公司,不再以任何方式参与 elementary 的工作。

老王点评:公平的说,辛辛苦苦创业的公司,离开时保留极少的股份不过分吧?

蹭网导致四名原住民死亡

据消息,在亚马逊丛林深处,一群亚诺马米原住民男子向一个委内瑞拉军事基地的士兵询问 WiFi 密码。原住民社区和军方已经同意共享路由器,但士兵们在没有得到亚诺马米人同意的情况下更改了密码,从而引发了冲突,导致四名亚诺马米人被杀。

老王点评:唉,WiFi 事小,生死事大啊。

基于 GCC 的 Rust 编译器实现“自举”

据消息,Rust 官方的编译器是基于 LLVM 的,一个旨在提供基于 GCC 的 Rust 编译器项目,取得了一个巨大的里程碑,可以成功地编译地出一个基于 GCC 的 Rust 编译器。其工作能力至少足以编译一个简单的 Rust “Hello World!” 程序。与官方的基于 LLVM 的 Rust 编译器相比,它将能够利用 GCC 更多样化的 CPU 架构/平台支持。

老王点评:总是有人喜欢 GCC 而不是 LLVM,这也是一个有趣的尝试。

大部分 Rust 程序员认为 Rust 很有挑战性,但值得

在对 Rust 社区的 年度调查中发现,使用 Rust 的人中,81% 的人至少每周都在使用这种语言。75% 的 Rust 用户表示用于生产环境。在工作中使用 Rust 的人,83% 的人认为它具有挑战性。只有 13% 的受访者认为该语言拖累了他们的团队,而 82% 的人认为 Rust 有助于他们的团队实现他们的目标。只有 1% 的受访者认为挑战不值得,而 79% 的受访者说肯定值得。90% 的人表示将有可能在未来再次使用 Rust。96% 的人使用它的人是因为它可以“构建相对正确和没有错误的软件”,其次是 92% 的人因为性能选择了它。

老王点评:Rust 虽然很难,但是明显已经准备好在生产环境取代 C 语言了。

FSF 公布五篇探讨 GitHub Copilot 的论文

FSF 称微软的 GitHub Copilot 为“服务即软件替代物(SaaSS)”,他们认为它“立即对自由软件运动和我们保障用户和开发者自由的能力提出了严重的问题”,因而向社区征文讨论这一新生事物。现在他们 公布了其中五篇论文,虽然 FSF 不一定同意或反对这些论文的观点,但认为它们推动了对这一问题的讨论。

顺便说一句,Copilot 的意思不是“复制许多”,而是指(飞机上的)“副驾驶”、“自动驾驶仪”,虽然确实是由 AI 从代码库中“复制”出许多代码的。

老王点评:这种写出的代码版权和知识产权该如何界定,还需要讨论,但是我认为这种技术是一种有益的进步。

中国手机品牌几乎统治欧洲最大的通信展

下周,世界最大的手机贸易展,世界移动通信大会(WMC)将在巴塞罗那举办。从目前的情况来看,展会上所有最大的硬件发布似乎都可能 来自中国,如 OPPO、荣耀、TCL、小米的子品牌 Poco 和华为,而不是前些年来自欧洲、美国,甚至像韩国这样的亚洲国家的品牌。截至去年,IDC 报告称,全球最受欢迎的五大智能手机品牌中的三个(小米、Oppo 和 vivo)总部都在中国,虽然第一和第二的位置被三星和苹果占据。

老王点评:虽然苹果和谷歌不太重视这个展会,但是也代表了中国手机制造行业的兴盛。

回音

  • 之前我们 报道过 Linux 讨论废弃 ReiserFS 文件系统,现在已经标记该文件系统为废弃,并将在 2025 年删除它。另外,它的作者因杀妻入狱 15 年后,将在 2023 年获释

Rust 不仅安全,而且至少节能 50%

全球数据中心每年消耗约 200 兆瓦时,大约占全球能源消耗的 1%。几年前 有一项研究,用 27 种不同的编程语言实现了 10 个基准问题,测量了其执行时间、能源消耗和峰值内存使用。C 和 Rust 在能源效率方面明显优于其他语言。事实上,它们的效率大约比 Java 高 50%,比 Python 高 98%。C 和 Rust 更有效率,这并不奇怪。令人震惊的是差异的大小。保守估计,广泛采用 C 和 Rust 可以减少 50% 的计算能耗

老王点评:这么大的计算能耗差异,令我非常吃惊。

.NET 发布二十周年

.NET 在 2019、2020 和 2021 年的 Stack Overflow 的开发者调查中被评为最受开发者喜爱的框架。.NET 的第一个版本在 2002 年 2 月 13 日作为的 Visual Studio.NET 的一部分首次公开亮相。十年后,2012 年微软完整开源了 ASP.NET MVC Web 框架,2014 年开始构建跨平台开源 .NET 框架,支持竞争对手 Linux 和 OS X 平台。.NET 框架从一个流行的闭源软件开发平台,变成了一个 开源的跨平台开发工具

老王点评:这二十年间,微软从一家宣称 Linux 是癌症的公司变成了一家对开源友好的公司。

英特尔公布其第一款“矿卡”细节

在今年的国际固态电路大会上,英特尔首次公布了旗下 ASIC 挖矿芯片的诸多细节。每个芯片内部集成 258 个挖矿引擎,核心频率 1.35-1.6GHz,平均功耗 7.5W,最大算力 137GH/s。每台矿机可以配备四块主板,每块主板载有 75 颗芯片,总算力 40TH/s,总功耗达 3600W。但其能效与其它的专业矿机相比并没有优势,比特大陆的最新的蚂蚁矿机 S19j XP 算力高达 140TH/s,功耗为 3010W。

老王点评:看来挖矿是好生意啊,连英特尔都忍不住下场。

x86、Arm 和 RISC-V 内核将能在一个处理器中共同工作

英特尔将把其最重要的资产,即 x86 架构,授权给那些想制作 定制芯片 的人。根据不同的应用,客户将能够在英特尔制造的定制设计的芯片中混合使用 x86、Arm 和 RISC-V CPU 内核以及硬件加速单元。基于不同架构的内核将相互连接并协同工作以执行系统软件和程序。这种多 ISA 战略是英特尔历史上第一次将 x86 软核和硬核授权给想开发芯片的客户。

老王点评:这种多 ISA 的处理器似乎就可以同时运行多种架构的应用了?

数以千计的 NPM 账户使用过期域名的电子邮件地址

NPM 是 JavaScript 库的事实存储库,也是互联网上最大的包存储库。研究人员在去年分析了 NPM 上的 160 万个库的元数据,他们发现有 2818 个项目维护者的账户仍在使用 域名过期 的电子邮件地址,并且其中一些域名在 GoDaddy 等网站上出售。攻击者可以购买这些域名,在他们自己的电子邮件服务器上重新注册维护者的地址,然后重新设置维护者的账户密码并接管他的 npm 包。

老王点评:一些 NPM 模块的开发不是严肃的工作,但是却有可能用在严肃的场合。

开发者已经可用 Rust 为 Linux 开发抽象子系统和驱动了

开发者发出了在 Linux 内核中使用的 Rust 编程语言支持 的第四个版本。这种对 Linux 内核驱动程序的可选 Rust 编程支持继续成熟,今年将有望看到主线状态。开发者称,“Rust 支持仍然实验性的。然而,支持已经足够好,内核开发者可以开始用 Rust 开发子系统抽象层,并编写驱动程序和其他模块。”目前,在内核中加入的 Rust 编程语言基础设施以及一些示例代码大约有 34000 行新代码。

老王点评:关于 Rust 进入 Linux 内核开发,还是存在不少不同意见的。