Skip to content

Commit 3faf499

Browse files
author
WaySLOG
committed
Merge pull request #297 from wayslog/master
删除无用章节号和错别字修正
2 parents e95a87c + f5dc64f commit 3faf499

24 files changed

Lines changed: 66 additions & 61 deletions

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ gitbook serve
164164

165165
即可
166166

167+
168+
## 成为Contributors
169+
170+
我们欢迎RustPrimer的Contributor们将自己的 `[blog/github/社交帐号]` 添加在 [1st-glance/README.md](./1st-glance/README.md)里。但严禁未参与者恶意添加帐号,违者将会被永久拒绝PR和issue权限。
171+
167172
## ChangeLog
168173

169174
1. 2016年3月31日,初稿完成。发布 v1.0 版。
175+
2. 2016年5月2日,完成1.1.0版本。

appendix/glossary.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 36.1 附录I-术语表
1+
# 附录I-术语表
22

33
* ADT(Algebraic Data Type:代数数据类型):
44
* ARC(Atomic Reference Counting:原子引用计数):

attr-and-compiler-args/attributes.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
## 1 属性
1+
## 属性
22

33
属性(Attribute)是一种通用的用于表达元数据的特性,借鉴ECMA-334(C#)的语法来实现ECMA-335中描述的Attributes。属性只能应用于Item(元素、项),
44
例如 `use` 声明、模块、函数等。
55

6-
### 1.1 元素
6+
### 元素
77

88
在Rust中,Item是Crate(库)的一个组成部分。它包括
99

@@ -23,7 +23,7 @@
2323
它写到最外层作用域所实现的功能是一样的,只不过你要访问这些嵌套的Item就必须使用路径(Path),如`a::b::c`。但一些外层的Item不允许你使用路径去
2424
访问它的子Item,比如函数,在函数中定义的静态变量、结构体等,是不可以通过路径来访问的。
2525

26-
### 1.2 属性的语法
26+
### 属性的语法
2727

2828
属性的语法借鉴于C#,看起来像是这样子的
2929

@@ -62,7 +62,7 @@ mod bar {
6262
type int8_t = i8;
6363
```
6464

65-
### 1.3 应用于Crate的属性
65+
### 应用于Crate的属性
6666

6767
* `crate_name` - 指定Crate的名字。如`#[crate_name = "my_crate"]`则可以让编译出的库名字为`libmy_crate.rlib`
6868
* `crate_type` - 指定Crate的类型,有以下几种选择
@@ -89,7 +89,7 @@ type int8_t = i8;
8989

9090
* `recursive_limit` - 设置在编译期最大的递归层级。比如自动解引用、递归定义的宏等。默认设置是`#![recursive_limit = "64"]`
9191

92-
### 1.4 应用于模块的属性
92+
### 应用于模块的属性
9393

9494
* `no_implicit_prelude` - 取消自动插入`use std::prelude::*`
9595
* `path` - 设置此`mod`的文件路径。
@@ -108,7 +108,7 @@ type int8_t = i8;
108108
mod sys;
109109
```
110110

111-
### 1.5 应用于函数的属性
111+
### 应用于函数的属性
112112

113113
* `main` - 把这个函数作为入口函数,替代`fn main`,会被入口函数(Entry Point)调用。
114114
* `plugin_registrar` - 编写编译器插件时用,用于定义编译器插件的入口函数。
@@ -152,11 +152,11 @@ fn unlikely_to_be_executed() {
152152
}
153153
```
154154

155-
### 1.6 应用于全局静态变量的属性
155+
### 应用于全局静态变量的属性
156156

157157
* `thread_local` - 只可用于`static mut`,表示这个变量是thread local的。
158158

159-
### 1.7 应用于FFI的属性
159+
### 应用于FFI的属性
160160

161161
`extern`块可以应用以下属性
162162

@@ -201,7 +201,7 @@ enum eType {
201201

202202
* `repr` - 目前只接受`C``packed``C`表示结构体兼容C ABI,`packed`表示移除字段间的padding。
203203

204-
### 1.8 用于宏的属性
204+
### 用于宏的属性
205205

206206
* `macro_use` - 把模块或库中定义的宏导出来
207207
- 应用于`mod`上,则把此模块内定义的宏导出到它的父模块中
@@ -220,7 +220,7 @@ enum eType {
220220

221221
* `no_link` - 应用于`extern crate`上,表示即使我们把它里面的库导入进来了,但是不要把这个库链接到目标文件中。
222222

223-
### 1.9 其它属性
223+
### 其它属性
224224

225225
* `export_function` - 用于静态变量或函数,指定它们在目标文件中的符号名。
226226

@@ -237,7 +237,7 @@ enum eType {
237237
struct Foo {}
238238
```
239239

240-
### 1.10 条件编译
240+
### 条件编译
241241

242242
有时候,我们想针对不同的编译目标来生成不同的代码,比如在编写跨平台模块时,针对Linux和Windows分别使用不同的代码逻辑。
243243

@@ -318,7 +318,7 @@ if cfg!(target_arch = "x86") {
318318

319319
这种方式不会产生任何运行时开销,因为不成立的条件相当于里面的代码根本不可能被执行,编译时会直接被优化掉。
320320

321-
### 1.11 Linter参数
321+
### Linter参数
322322

323323
目前的Rust编译器已自带的Linter,它可以在编译时静态帮你检测不用的代码、死循环、编码风格等等。Rust提供了一系列的属性用于控制Linter的行为
324324

@@ -329,7 +329,7 @@ if cfg!(target_arch = "x86") {
329329

330330
编译器支持的Lint检查可以通过执行`rustc -W help`来查看。
331331

332-
### 1.12 内联参数
332+
### 内联参数
333333

334334
内联函数即建议编译器可以考虑把整个函数拷贝到调用者的函数体中,而不是生成一个`call`指令调用过去。这种优化对于短函数非常有用,有利于提高性能。
335335

@@ -343,7 +343,7 @@ if cfg!(target_arch = "x86") {
343343

344344
内联会导致在一个库里面的代码被插入到另一个库中去。
345345

346-
### 1.13 自动实现Trait
346+
### 自动实现Trait
347347

348348
编译器提供一个编译器插件叫作`derive`,它可以帮你去生成一些代码去实现(impl)一些特定的Trait,如
349349

@@ -380,7 +380,7 @@ impl<T: Clone> Clone for Foo<T> {
380380

381381
目前`derive`仅支持标准库中部分的Trait。
382382

383-
### 1.14 编译器特性
383+
### 编译器特性
384384

385385
在非稳定版的Rust编译器中,可以使用一些不稳定的功能,比如一些还在讨论中的新功能、正在实现中的功能等。Rust编译器提供一个应用于Crate的属性`feature`来启用这些不稳定的功能,如
386386

attr-and-compiler-args/rustc-options.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## 2 编译器参数
1+
## 编译器参数
22

33
本章将介绍Rust编译器的参数。
44

closure/overview.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 13 闭包
1+
# 闭包
22
闭包是现代编程语言的高级特性,新生的很多语言都支持闭包,如:swift、nim等,C++11标准、Java 8也支持了闭包。闭包是什么?先来看看[维基百科][wiki]上的描述:
33
>在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是 __引用了自由变量的函数__。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。<br /><br />
44
闭包的概念出现于60年代,最早实现闭包的程序语言是Scheme。之后,闭包被广泛使用于函数式编程语言如ML语言和LISP。很多命令式程序语言也开始支持闭包。

closure/syntax.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 13.1 闭包的语法
1+
# 闭包的语法
22
## 基本形式
33
闭包看起来像这样:
44

concurrency-parallel-threads/message-passing.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## 23.2 消息传递
1+
## 消息传递
22
稍加考虑,上一节的练习题其实是不完整的,它只是评分系统中的一环,一个评分系统是需要先把信息从数据库或文件中读取出来,然后才是评分,最后还需要把评分结果再保存到数据库或文件中去。如果一步一步串行地做这三个步骤,是完全没有问题的。那么我们是否可以用三个线程来分别做这三个步骤呢?上一节练习题我们已经用了一个线程来实现评分,那么我们是否也可以再用一个线程来读取成绩,再用另个线程来实现保存呢? 如果能这样的话,那么我们就可以利用上多核多cpu的优势,加快整个评分的效率。既然在此提出这个问题,答案就很明显了。问题在于我们要怎么在Rust中来实现,关键在于三个线程怎么交换信息,以达到串行的逻辑处理顺序?
33

44
为了解决这个问题,下面将介绍一种Rust在标准库中支持的消息传递技术。**消息传递**是并发模型里面大家比较推崇的模式,不仅仅是因为使用起来比较简单,关键还在于它可以减少数据竞争,提高并发效率,为此值得深入学习。Rust是通过一个叫做通道(`channel`)的东西来实现这种模式的,下面直接进入主题。

concurrency-parallel-threads/parallel.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## 23.5 并行
1+
## 并行
22
理论上并行和语言并没有什么关系,所以在理论上的并行方式,都可以尝试用Rust来实现。本小节不会详细全面地介绍具体的并行理论知识,只介绍用Rust如何来实现相关的并行模式。
33

44
Rust的一大特点是,可以保证“线程安全”。而且,没有性能损失。更有意思的是,Rust编译器实际上只有`Send` `Sync`等基本抽象,而对“线程” “锁” “同步” 等基本的并行相关的概念一无所知,这些概念都是由库实现的。这意味着Rust实现并行编程可以有比较好的扩展性,可以很轻松地用库来支持那些常见的并行编程模式。

concurrency-parallel-threads/share-memory.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## 23.3 共享内存
1+
## 共享内存
22
在消息传递之外,还存在一种广为人知的并发模型,那就是共享内存。其实如果不能共享内存,消息传递也是不能在不同的线程间传递消息,也谈不上在不同的线程间等待和通知了。共享内存是这一切得以发生的基础。如果查看源码,你会发现消息传递的内部实现就是借用了共享内存机制。相对于消息传递而言,共享内存会有更多的竞争,但是不用进行多次拷贝,在某些情况下,也需要考虑使用这种方式来处理。在Rust中,能共享内存的情况,主要体现在下面两个方面:
33

44
### static

concurrency-parallel-threads/synchronize.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
2-
## 23.4 同步
1+
## 同步
32

43
同步指的是线程之间的协作配合,以共同完成某个任务。在整个过程中,需要注意两个关键点:一是共享资源的访问, 二是访问资源的顺序。通过前面的介绍,我们已经知道了如何让多个线程访问共享资源,但并没介绍如何控制访问顺序,才不会出现错误。如果两个线程同时访问同一内存地址的数据,一个写,一个读,如果不加控制,写线程只写了一半,读线程就开始读,必然读到的数据是错误的,不可用的,从而造成程序错误,这就造成了并发安全问题,为此我们必须要有一套控制机制来避免这样的事情发生。就好比两个人喝一瓶可乐,只有一根吸管,那肯定也得商量出一个规则,才能相安无事地都喝到可乐。本节就将具体介绍在Rust中,我们要怎么做,才能解决这个问题。
54

0 commit comments

Comments
 (0)