购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 认识程序

随着假期的结束,同学们迎来了一个新的学期。为了这迎接这一新学期的到来,Python快乐学习班的31位同学决定来一次户外旅游以促进同学之间的友谊。当然,在户外旅游之前,需要先选定游玩地点,熟悉目的地名,知道去哪里游玩,将会经过哪里。学习编程语言也一样,在学习之前要先了解程序、调试、语法错误、运行错误、语义错误等知识。

2.1.1 程序

我们都知道,出门旅行肯定要选择交通工具,现在常用的交通工具有飞机、火车、轮船、汽车等,我们会根据自己的喜好和一些其他因素选择对应的交通工具。

编程语言也一样,我们选择一门编程语言就相当于选择一种交通工具,那么,编程语言的“交通”工具是什么呢?是程序。

程序是指根据语言提供的指令按照一定逻辑顺序对获得的数据进行运算,并最终返回给我们的指令和数据的组合。在这里,运算的含义是广泛的,既包括数学计算之类的操作(如加、减、乘、除),又包括寻找和替换字符串之类的操作。数据依据不同的需要组成不同的形式,处理后的数据也可能以另一种方式体现。

程序是用语言写成的,语言分高级语言和低级语言。

低级语言有时叫机器语言或汇编语言。计算机真正“认识”并能够执行的代码,在我们看来是一串0和1组成的二进制数字,这些数字代表指令和数据。早期的计算机科学家就是用这些枯燥乏味的数字编程。低级语言的出现是计算机程序语言的一大进步,它用英文单词或单词的缩写代表计算机执行的指令,使编程的效率和程序的可读性都有了很大提高,但它仍然和机器硬件关联紧密,不符合人类的语言和思维习惯,而且要想把用低级语言写的程序移植到其他平台,就必须重写。

高级语言的出现是程序语言发展的必然结果,也是计算机语言向人类的自然语言和思维方式逐步靠近和模拟的结果。由于高级语言是对人类逻辑思维的描述,用高级语言写程序会感到比较自然,读起来也比较容易,因此现在大部分程序都是用高级语言写的。

高级语言设计的目的是让程序按照人类的思维和语言习惯书写,是面向人的,而不是面向机器,我们用着方便,但机器却无法读懂,更谈不上运行。所以,用高级语言写的程序必须经过“翻译”程序的处理,将其转换成机器可执行的代码,才能运行在计算机上。如果想把高级语言写的程序移植到其他的平台,只需在它的基础上做少量更改就可以了。

高级语言翻译成机器代码有两种方法,即解释和编译。

解释型语言 是边读源程序边执行。高级语言就是源代码。解释器每次会读入一段源代码,并执行它,接着再读入并执行,如此重复,直到结束,图2-1显示了解释型语言的执行方式。这个有点类似在乡村里搭乘公交,只要碰到路上有人等公交,就停下来载人。

图2-1 解释型语言的执行方式

编译型语言 是将源代码完整地编译成目标代码后才能执行,以后在执行时不需要再编译。图2-2显示了编译型语言的执行方式,这个有点类似我们乘坐的直达车,所有要乘车的人都从起点上车,中途不再搭载其他乘客。

图2-2 编译型语言的执行方式

2.1.2 调试

每当远游时,司机肯定要做几件事情,如检查发动机是否正常、检查油箱、检查各项安全系统和液压系统等,为的是尽可能减少在路途中发生意外情况。

编程也是一样的,需要经常做检查。有一些问题编译器会帮助我们检查出来,问题查出后,简单地可以直接解决,对于稍微复杂的,需要通过调试来解决。

程序是很容易出错的。程序错误被称为bug,查找bug的过程称为调试(debugging)。我们在第1章中已经介绍过一个很简单的调试示例。

2.1.3 语法错误——南辕北辙

在生活中与人相处时,经常会碰到这样的情况,你想向某人表达某种意思,但某人听了半天都不清楚你想表达什么,或是仍然没有明白你的真正意思,等他明白后,用一种更简单明白的方式复述一下你的意思,突然就让你想表达的内容变得简单易懂了,这时你可能才恍然大悟,原来表达的方式错误了。

程序编写中,这种错误发生的次数比生活中出现的次数多很多,一般称为语法错误(syntax errors)。Python程序在语法正确的情况下才能运行,否则解释器会显示对应错误信息。语法指的是程序的结构和程序构造的规则。比如第1章的('Hello,world!'),括号中的单引号开头和结尾必须是严格成对的,执行时才能正确。如果输入('Hello,world!)或(Hello,world!')就会报错,这就属于语法错误。

在阅读文章或听人讲话时,对于大多数的语法错误,并不会影响我们看到的或听到的信息的正确性。Python的编译执行并不如人类这么宽容,程序执行过程中,只要出现一处语法错误,Python就会显示错误信息并退出,从而不再继续编译。就如我们去乘坐高铁或飞机,若没有购买车票或购买的票不满足进站要求,就无法进入。

在编程生涯的开始阶段,可能每踏出一步都会碰到大量语法方面的错误,但随着经验的积累,犯错会逐步减少,很多错误遇到一两次并成功解决后,后面再遇到类似的问题就能快速定位,或是在问题出现前就规避了。

2.1.4 运行错误——突然的停止

Python快乐学习班的同学在奔跑的“集合号”内愉悦地欣赏着沿途的风景,同学们在愉快地聊着某个话题,但此时交通工具突然慢慢停下来了,此时司机对读者宣布说,交通工具抛锚了。例如,轮胎破损、没油了、发动机坏了等。

在Python中经常会遇到类似的错误,称为运行时错误(runtime errors)。

即使有时看起来编写得非常完美的程序,在运行的过程中也会有出现错误的情况。在我们的印象中,计算机是善于精确计算的,那怎么会出错?答案是计算机确实经常出错,不过出错的根源不是计算机,而是我们人类。计算机是由人类设计的,是我们人类设计出来的一种工具,它本质上和电视机、汽车等是一样的,是人类生活中的一种辅助工具。鉴于现在计算机软硬件的理论水平、工业制造水平、使用者的水平等一些内在、外在的因素,出现错误并不稀奇,且程序越复杂,出现错误的概率越大。错误的种类很多,如内存用尽、除数为零的除法等。Python为了把错误的影响降至最低,提供了专门的异常处理语句,这部分内容会在后续章节中介绍。

2.1.5 语义错误——答非所问

在现实生活中,时不时会遇到这样的情况:你明明想表达A的意思,但与你沟通的人可能理解成B的意思了,或者说的是A意思,却被听者听成B意思了。这种情况多在语言表述不清楚或看问题角度不同时发生。我们经常将这种情况调侃为思想没在一个维度。

在Python代码的编写过程中也经常会发生类似的问题,此类问题称为语义错误(semantic errors)。

程序发生语义错误时,并不会立即给我们反馈,它会继续执行,不会发出错误信息,这种错误需要我们自己去发现,需要去比对输出的结果和我们的预期是否一致才能判定,否则可能就一直错误下去,直到被发现。

这种错误的发生大多是因为我们对代码的运行机制了解得不够,自以为编写的代码是按自己预想的方式运行的,但实际上计算机编译出来的代码是按另外一种方式运行的。还有可能是你解决问题的思路本身就是错的,写出来的程序执行的结果当然会是错的。

查找语义错误并没有那么容易,它需要你根据结果进行推理,推理的过程有的简单,有的复杂,具体需要查看程序是怎么设计的,编写是否复杂,是否容易弄明白程序到底在做什么。 NkwkH2ZnHHrcKBzQbSt9FLyAeRTzNJP/34dZJs3yXTVCBadoaDWGZXTLGQLoSJhC

点击中间区域
呼出菜单
上一章
目录
下一章
×