chore: add 3.4.3

chore: add 3.4.4
chore: add 3.4.5
chore: add 3.4.5.1
chore: add 3.4.6.1
chore: add 3.4.6.2
chore: add 3.4.6.3
chore: add 3.4.6.4
chore: add 3.4.6.5
This commit is contained in:
FallenYing
2023-07-26 02:49:38 +08:00
parent 7a29488280
commit 2373723d17
9 changed files with 91 additions and 97 deletions

View File

@@ -2,11 +2,11 @@
某种极其糟糕的编程习惯
# Copy-paste
## Copy-paste
我们很多同学在编程的过程中,可能会写出一大堆重复性很强的代码,在最近看的 pa 中,举了这样一个例子,你不需要看懂只需要感受到就可:
```
```c
if (strcmp(s, "$0") == 0)
return cpu.gpr[0]._64;
else if (strcmp(s, "ra") == 0)
@@ -90,13 +90,13 @@ bx = torch.cat((xs[0], bs[0], xs[1], bs[1], xs[2], bs[2], xs[3], bs[3], xs[4], b
更可怕的是,这种编码模式可能会导致意想不到的 bug。
当你发现这些代码有 bug 的时候, 噩梦才刚刚开始. 也许花了好几天你又调出一个 bug 的时候, 才会想起这个 bug 你好像之前在哪里调过. 你也知道代码里面还有类似的 bug, 但你已经分辨不出哪些代码是什么时候从哪个地方复制过来的了.
当你发现这些代码有 bug 的时候噩梦才刚刚开始也许花了好几天你又调出一个 bug 的时候才会想起这个 bug 你好像之前在哪里调过你也知道代码里面还有类似的 bug, 但你已经分辨不出哪些代码是什么时候从哪个地方复制过来的了
这种糟糕的编程习惯叫 Copy-Paste, 经过上面的分析, 相信你也已经领略到它的可怕了. 事实上, [周源源教授](https://cseweb.ucsd.edu/~yyzhou/)的团队在 2004 年就设计了一款工具 CP-Miner, 来自动检测操作系统代码中由于 Copy-Paste 造成的 bug. 这个工具还让周源源教授收获了一篇[系统方向顶级会议 OSDI 的论文](http://pages.cs.wisc.edu/~shanlu/paper/OSDI04-CPMiner.pdf), 这也是她当时所在学校 UIUC 史上的第一篇系统方向的顶级会议论文.
这种糟糕的编程习惯叫 Copy-Paste, 经过上面的分析相信你也已经领略到它的可怕了事实上[周源源教授](https://cseweb.ucsd.edu/~yyzhou/)的团队在 2004 年就设计了一款工具 CP-Miner, 来自动检测操作系统代码中由于 Copy-Paste 造成的 bug. 这个工具还让周源源教授收获了一篇[系统方向顶级会议 OSDI 的论文](http://pages.cs.wisc.edu/~shanlu/paper/OSDI04-CPMiner.pdf), 这也是她当时所在学校 UIUC 史上的第一篇系统方向的顶级会议论文
后来周源源教授发现, 相比于操作系统, 应用程序的源代码中 Copy-Paste 的现象更加普遍. 于是她们团队把 CP-Miner 的技术应用到应用程序的源代码中, 并创办了 PatternInsight 公司. 很多 IT 公司纷纷购买 PatternInsight 的产品, 并要求提供相应的定制服务, 甚至 PatternInsight 公司最后还被 VMWare 收购了.
后来周源源教授发现相比于操作系统应用程序的源代码中 Copy-Paste 的现象更加普遍于是她们团队把 CP-Miner 的技术应用到应用程序的源代码中并创办了 PatternInsight 公司很多 IT 公司纷纷购买 PatternInsight 的产品并要求提供相应的定制服务甚至 PatternInsight 公司最后还被 VMWare 收购了
这个故事折射出, 大公司中程序员的编程习惯也许不比你好多少, 他们也会写出 Copy-Paste 这种难以维护的代码. 但反过来说, 重视编码风格这些企业看中的能力, 你从现在就可以开始培养.
这个故事折射出大公司中程序员的编程习惯也许不比你好多少他们也会写出 Copy-Paste 这种难以维护的代码但反过来说重视编码风格这些企业看中的能力你从现在就可以开始培养
<em>传统上,文本冒险是由(许多)不同位置组成的虚拟世界。虽然这不是必需的(一些冒险发生在一个房间里!),但这是解释</em><em>数据结构</em><em>使用的好方法。</em>
@@ -112,13 +112,13 @@ struct location {
};
```
思考题:我们为什么要用结构体来保存位置?
::: warning 🤔思考题:
我们为什么要用结构体来保存位置?
```
这样子做有什么好处?
```
这样子做有什么好处?
const 又是什么?
const 又是什么?
:::
接下来,我们定义一个位置数组。目前,我们保持它非常简单:只有两个位置。
@@ -135,9 +135,9 @@ struct location locs[2] = {
};
```
让我们把它付诸实践。在上一章 <em>parsexec.c</em> 的代码示例中,我们更改了第 4、18 和 22 行)。
让我们把它付诸实践。在上一章(<em>parsexec.c</em> 的代码示例中,我们更改了第 4、18 和 22 行)。
# <strong>parsexec.c</strong>
## <strong>parsexec.c</strong>
```c
#include <stdbool.h>
@@ -174,14 +174,14 @@ bool parseAndExecute(char *input)
接下来,我们将一个新模块添加到项目中
# <strong>location.h</strong>
## <strong>location.h</strong>
```c
extern void executeLook(const char *noun);
extern void executeGo(const char *noun);
```
# <strong>location.c</strong>
## <strong>location.c</strong>
```c
#include <stdio.h>