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

1.2 程序设计语言与程序设计

程序设计语言是一种人类用来和计算机沟通的语言,也就是用来指挥计算机进行计算或运行的指令集合。就如同汉语、英语、日语等语言一样,无论哪一种语言都有词汇与语法。程序设计语言是一行行的程序语句(statement)及语句中的程序代码(code)组合而成的,可以将人类的思考逻辑和沟通的语言转换成计算机能够了解的语言,而“程序设计”就是通过程序设计语言的编写与执行来实现人类运用计算机的工作需求。编写程序可以让原有的工作更有效率,像是每天必须重复做的一些工作,就可以找出其中的规则,编写一个程序来自动执行。

1.2.1 程序设计语言简介

每一代程序设计语言都有其特色,无论是哪一种语言都有其专用的语法、特性、优点以及相关应用的领域。从发展过程来看,我们大致可以把程序设计语言分为“低级语言”与“高级语言”两大类,低级语言又可以分为“机器语言”和“汇编语言”。

1.机器语言

机器语言(Machine Language)是最早期的程序设计语言,由数字1和0构成,也是计算机能够直接阅读与执行的基础语言,也就是任何程序在执行前实际上都必须转换为机器语言。例如“10111001”可能代表“设置变量A”,而“00000010”代表“数值2”。当我们指示计算机将变量A设置为数值2时,机器语言的写法可能就是:


10111001 (设置变量A)
00000010 (把数值2设置给变量A)

计算机可以直接执行机器语言,所以执行速度快,在处理数据时效率也高,但是对于人类而言,机器语言可读性低,不太容易学习。另外,对于不同的计算机制造商,往往因为计算机硬件设计的不同而开发不同的机器语言。这样机器语言不但使用不方便,可读性低,也不容易维护,并且不同机器的系统平台,它们的编码方式不尽相同。

2.汇编语言

汇编语言(Assembly Language)的指令比机器语言的指令直观多了,但它的指令与机器语言的指令仍然是一对一的对应关系,因而与机器语言一样被归类为低级语言(Low-Level Language)。汇编语言和机器语言相比,更方便人类记忆与使用。由于汇编语言与硬件有着密切的关系,不同CPU(中央处理单元,或称为中央处理器)或微处理器的指令集是不同的,语法也不相同,程序设计人员除了要对指令相当了解之外,还必须熟悉硬件,每一种系统的汇编语言都不一样。以PC为例,使用的是80x86的汇编语言。采用汇编语言所编写的程序,计算机无法直接识别,必须通过汇编程序或汇编器(Assembler)将指令转换成计算机可以识别的机器语言。例如MOV指令代表设置变量的值、ADD指令代表加法运算、SUB指令代表减法运算:


        MOV  A , 2  (把变量A的值设置为2)
        ADD  A , 2  (将变量A加上2后,将结果再存回变量A中,如A=A+2)
        SUB  A , 2  (将变量A减掉2后,将结果再存回变量A中,如A=A-2)

3.高级语言

由于低级语言不易阅读,为了能更方便、快速地使用程序设计语言,因此产生了更接近人类自然语言的程序设计语言,这类语言称为高级语言(High-Level Language)。高级程序设计语言比低级程序设计语言更易于看懂和理解。例如Python、Fortran、COBOL、Java、Basic、C、C++都是高级语言中的一员。一个用高级语言编写而成的程序必须经过编译程序(Compiler,或称为编译器)“翻译”为计算机能解读的机器语言程序,也就是可执行文件,其中包含的是编译型的高级语言被转换为计算机可以识别的机器语言的程序代码,只有这种代码才能被计算机执行(其实是被计算机中的CPU执行)。对于解释型的高级语言,需要解释程序(Interpreter,或称为解释程序)“解释”成机器语言才能被计算机的CPU执行,只是不会生成含有机器语言的最终可执行文件,这一点和编译型语言不一样。相对于汇编语言,高级语言虽然执行速度较慢,但语言本身易学易用,因此被广泛应用在商业、科学、教学、军事等相关领域的软件开发中。

技巧

编译型语言与解释型语言的不同

编译型语言会先使用编译程序检查整个程序,完全没有语法错误之后,再链接相关资源生成可执行文件(executable file)。一旦经过编译,所生成的执行文件在执行过程中不必再次编译,因此执行效率较高,例如C、C++、PASCAL、Fortran、COBOL等都属于编译型语言。

解释型语言是使用解释器对程序代码一边解读源代码,一边执行,每“解释”完一行程序代码并执行,再继续“解释”下一行程序代码。在解释过程中,如果发生语法错误,解释的过程就会立刻停止,例如HTML、JavaScript、Python等都属于解释型语言。

4.非过程性语言

“非过程性语言”(Non-Procedural Language)也称为第四代语言(Fourth Generation Language,4GL),特点是它的指令和程序真正执行的具体步骤没有关联。程序设计人员只需将自己打算做什么表示出来即可,而不必去管计算机如何执行,也不需要理解计算机的具体执行步骤。目前,这种语言通常应用于各种类型的数据库系统中,如医院的门诊系统、学生成绩查询系统等,像数据库的结构化查询语言(Structural Query Language,SQL)就是一种第四代语言。例如,清除数据的程序相当简单,代码如下:


DELETE FROM employees
  WHERE employee_id = 'C800312' AND dept_id = 'R01';

5.人工智能语言

人工智能语言被称为第五代语言,或自然语言(Natural Language),它是程序设计语言发展的终极目标,当然按目前的计算机技术尚无法实现,因为自然语言用户的口音、使用环境、语言本身的特性(如一词多义)等都会造成计算机在解读时产生不同的结果。所以自然语言必须有人工智能(Artificial Intelligence,AI)技术的发展作为保障。

1.2.2 算法与程序设计

算法(Algorithm)是学习程序设计的核心知识。在日常生活中,每个人每天都会用到一些算法,而算法是人类使用计算机解决问题的技巧之一,其实算法并不仅仅用于计算机领域,在数学、物理等领域广泛应用。日常生活中有许多工作都可以使用算法来描述,例如员工的工作报告、宠物的饲养过程、厨师准备美食的食谱、学生的课程表等。在网络搜索引擎大行其道的今天,我们每天要使用的搜索引擎都必须通过不断更新算法来不断提高搜索的速度和准确度。如图1-5所示为百度搜索引擎的基本使用界面。

图1-5

从程序设计语言实现的角度来看,无论我们采用哪一种程序设计语言,程序能否高效地完成任务,算法都是解决问题的核心。同样一个问题,每个人的解法可能不同,程序的执行效率也会不同,优秀的算法能够以最精简的程序代码达到上佳的程序执行效率。

在韦氏辞典中将算法定义为:“在有限的步骤内解决数学问题的过程。”如果运用在计算机领域中,我们也可以把算法定义成:“为了解决某一个问题或完成一项任务,所需的有限次数的重复性指令与计算步骤。”认识了算法的定义后,我们来说明一下算法必须符合的5个条件,如表1-1所示。

表1-1

认识了算法的定义与条件后,接下来要思考:用什么方法来表达算法最为适当呢?其实算法的主要目的在于让人们了解所执行工作的流程与步骤,只要能清楚地体现算法的5个条件即可。算法常用的描述方式或工具如下。

·文字描述:使用中文、英文、数字等来说明算法的步骤。

·伪语言(Pseudo-Language):接近高级程序设计语言的写法,也是一种不能直接放进计算机中执行的语言。一般需要一种特定的预处理器(preprocessor),或者人工编写转换成真正的计算机语言,经常使用的有SPARKS、PASCAL-LIKE等语言。

·流程图(Flow Diagram):是一种以一些图形符号来描述算法执行流程的工具。例如,请用户输入一个数字,然后判断这个数字是奇数还是偶数,描述这个算法的流程图如图1-6所示。

图1-6

·程序设计语言:目前算法也可以直接以可读性高的高级语言来描述,例如Visual C#、Java、Python、Visual Basic、C、C++等语言。在本书中,将以Python语言来描述算法。

技巧

算法和过程(procedure)有何不同?与流程图又有什么关系?

算法和过程是有区别的,因为过程不一定要满足有限性的要求,如操作系统或计算机上运行的一些过程。除非宕机,否则永远在等待循环中(waiting loop),这就违反了算法五大原则之一的“有限性”。

另外,只要是算法都能够使用流程图来描述,但反过来,过程的流程图可以包含无限循环,所以过程无法用算法来描述。

为了便于程序的编写,将算法通过流程图来描述是目前最普遍的方式。下面我们来看看流程图的用法。

1.2.3 流程图

流程图是使用图形符号来描述解决问题的步骤,绘制流程图有助于程序的修改与维护。特别是当不同的程序开发人员编写程序时,通过流程图可以快速了解程序的流程,有助于协同合作开发程序以及程序的移交工作。流程图有很多种类型,程序开发最常用的是“系统流程图”和“程序流程图”。

系统流程图(system flowchart)用来描述系统的完整流程,包含信息流以及操作流程,即人员、设备、各个部门之间的业务关系。例如,在大学里学生请假可能会经过一些审核流程,通过系统流程图就能清楚地了解完整的审核流程,如图1-7所示。

而程序流程图(program flowchart)用来描述程序的逻辑架构,从程序流程图可以看出程序内的各种运算及执行顺序。例如,求1+2+3+4+5的算法,可以绘制成如图1-8所示的程序流程图。

图1-7

图1-8

为了流程图的可读性和一致性,目前通用ANSI(美国国家标准协会)制定的统一图形符号,表1-2简单说明一些常见的符号。

表1-2

1.2.4 程序设计流程简介

所谓程序,是由合乎程序设计语言的语法规则的指令所组成的,而程序设计的目的是通过程序的编写与执行来实现用户的需求。或许各位读者认为程序设计的主要目的只是“运算”出正确的结果,而忽略了执行的效率或者日后维护的成本,这其实是不清楚程序设计的真正意义。

至于程序设计时选择哪一种程序设计语言,通常可根据主客观环境的需要决定,并无特别规定。一般评断程序设计语言好坏考虑以下4个方面的因素。

·可读性(Readability)高:阅读与理解都相当容易。

·平均成本低:成本考虑不局限于编码的成本,还包括执行、编译、维护、学习、调试与日后更新等成本。

·可靠度高:所编写出来的程序代码稳定性高,不容易产生边界效应(Side Effect)。

·可编写性高:针对需求编写程序相对容易。

对于程序设计领域的学习方向而言,无疑就是以高效、可读性高的程序设计为目标。一个程序的产生过程可分为以下5个设计步骤(见图1-9)。

(1)需求(requirements):了解程序所要解决的问题是什么,有哪些输入和输出等。

(2)设计规划(design and plan):根据需求选择适合的数据结构,并以某种易于理解的表示方式写一个算法以解决问题。

(3)分析讨论(analysis and discussion):思考其他可能适合的算法和数据结构,最后选出最适当的一种。

(4)编写程序(coding):把分析的结果写成初步的程序代码。

(5)测试检验(verification):最后必须确认程序的输出是否符合需求,这个步骤需分步地执行程序并进行许多相关的测试。

图1-9 v/dyukJprR9TSDaiLLyGYuqSwOjTl7JfGh4pFAxrRMeEUSJRUO22vf5AsA1iesHL

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