第 0 章 被称作黑魔法的编程

第 0 章 被称作黑魔法的编程

在开始阅读本书之前,恐怕你得先了解一下计算机和它的工作方式。编程就像是和计算机对话如果我们不理解计算机的思考方式,就很难让它听懂我们的话

也许你已经了解了,程序是一段由若干命令组成的脚本,而你的计算机会根据这段脚本执行一系列操作。但问题是计算机并不会说我们的语言,而是说一种被我们称为“机器码”的语言。更麻烦的是,每种处理器都对应着不同的机器码。机器码由若干数字组成,分别对应不同种类的操作、数值或是其他数据。无论行为有多不起眼,都会被一一罗列出来。由于使用机器码编程非常耗时、又很复杂,因此人们发明了其他更便于使用的编程语言,比如我们将在本书中学习的 Java。当你运行程序时,这些编程语言会被翻译成处理器能够理解的机器码。尽管 Java 语言的一小部分代码还是会令人困惑,但它其实已经是对人类来说较为“简单”的一种语言了。对了,刚才说的“翻译”是由一个叫编译器或是解释器的程序完成的。

当编译器编译我们所写的代码时,它会读取指令,检查代码语法是否正确(这些指令有时候也存在语法以外的其他错误)。如果代码的语法正确,编译器就会将指令翻译成机器能够理解的语言;如果代码语法不正确,那么我们会看到错误提示,也无法编译程序……别担心,错误每天都会发生,即使是世界上最专业的程序员也不例外。

编译型还是解释型?

Java 是一门解释型语言。

虽然解释器和编译器有相似之处,但它们并不是同义词。你可以上网搜索,了解更多编译型语言和解释型语言的不同之处。

书写魔法:算法

现在我们已经了解到,人们使用了一种方便理解的语言进行编程,然后将其传送给编译器翻译,使处理器能够读懂代码。

然而,我们该怎么组织这一系列的命令呢?

电脑只会照本宣科:它不会做任何没被要求做的事,它也会尽可能执行所有发送给它的命令。电脑总是需要我们告诉它要执行什么、怎么做、什么时候做和按什么顺序做,甚至还要告诉它,当某些事不能完成时,我们又期望它做些什么。为了有序、清晰地表达所有命令,我们需要一套工作方法、一种详细阐述指令的规范。于是就有了算法。我很赞同维基百科对算法的词条解释:算法是一套指令,或一系列明确定义、有序且有限的规则,它允许我们通过连续的步骤完成一个活动,而这些步骤不会使执行者产生歧义。我们可以把算法想象成传达给某个人的一系列指令,这个人必须完成某个任务却不知道怎么开始。

如果要为一名不知道怎么给植物浇水的见习园丁编写一个算法,可以这样写

(1) 拿一个水壶;

(2) 将它放在水龙头下面;

(3) 打开水龙头,等待水流出;

(4) 让水龙头开着,直到水壶盛满 500 毫升的水;

(5) 关上水龙头,等待水流停止;

(6) 把水壶带到花园;

(7) 找到植物的位置;

(8) 在植物上方倾斜水壶,保持住,直到水全部浇完;

(9) 把水壶放好。

正如你看到的,在我们发给见习园丁的指令中,有几个十分重要的细节:

  • 完成动作的顺序
  • 动作什么时候结束
  • 完成浇水后该做什么

如果不注明动作顺序,见习园丁可能会先浇水,再往水壶里装水,这样植物就会因缺水而死;如果不告诉他什么时候关上水龙头,那我们的园丁朋友可能会让房子变成游泳池;如果不告诉他最后应该收好水壶,那他可能会永远把水壶挂在植物上。我们的朋友只会按照指示做事,电脑也是如此,这就是为什么算法必须要准确、有序,并且有明确的结束

以上就是你开始写代码前需要了解的所有预备理论。太棒啦

练习

我为你准备了一些非常简单的练习,看看你是不是正确理解了上面的内容。我们可不想让植物因缺水而枯萎。

(练习的答案在第 5 页,可别提早偷看答案哦!)

小测试

(1) 处理器可以执行你用 Java 编写的代码吗?

  a) 当然可以

  b) 根本不行

(2) 算法指的是……

  a) 处理器能够理解的一段代码

  b) 一系列具体、确切、有限的命令

(3) 为了理解你编写的语言,你的计算机需要( )的翻译

  a) 处理器

  b) 解释器

避免灾难的发生

下面这个算法的一些错误会给我们招来祸患,你能指出并纠正这些错误吗?

炸薯条的做法:

(1) 准备足够的土豆;

(2) 拿一把削皮刀;

(3) 开始削土豆皮;

(4) 把平底锅放在炉子上;

(5) 开火并调至中火;

(6) 将油倒入锅中;

(7) 将土豆倒入平底锅中;

(8) 炸土豆;

(9) 将土豆从平底锅盛出并放在盘子上。

编写你自己的算法

这是给勤奋学生的附加练习。根据下述任务创建指令序列,即算法:

  • 熨一件衬衫;
  • 寄一封信;
  • 刷牙;
  • 在头的一侧编辫子;
  • 系鞋带;
  • 给气球打气。

答案

小测试

(1) - b)

(2) - b)

(3) - b)

避免灾难的发生

炸薯条的做法:

(1) 准备足够的土豆;

(2) 拿一把削皮刀;

(3) 开始削土豆皮,直到皮都被削干净了

(4) 把土豆切成 1 厘米厚的薄片(你不会想把它整个扔下去炸了的)

(5) 把平底锅放在炉子上;

(6) 开火并调至中火;

(7) 向平底锅内倒入 100 毫升油(我们可不想一直把瓶子拿在手上)

(8) 当油够热了,将土豆倒入平底锅中;

(9) 炸土豆,将它们炸至金黄 / 炸 \boldsymbol{x} 分钟

(10) 将土豆从平底锅盛出并放在盘子上;

(11) 关火

很明显,这只是一次模拟,并不是真正的程序(虽然我们也可以编写一个厨师机器人的软件)。但你可以看到,确定动作执行的顺序和什么时候停止非常重要,否则有些动作将永远持续下去(之后还会提及这点)。

目录