
1.1 程序设计与程序设计语言概述
计算机程序设计是一个复杂的问题,涉及许多概念,存在着不同的设计哲学和设计方法。目前存在众多的程序设计语言用以设计计算机程序。本节介绍计算机程序设计的有关概念和程序设计语言的基本情况。
1.1.1 计算机程序设计的概念
程序(Procedure)指特定的一系列动作、行动或操作,这些活动、动作或操作必须以相同方式运行于相同环境时得出相同的结果。
计算机程序(Computer Program)是指计算机或其他具有消息处理能力的装置为完成某项任务或解决某个问题而按一定逻辑组织的动作指令的集合。在基于最常见的冯·诺依曼体系结构(又称普林斯顿结构)的计算机上,程序通常存储在计算机的外部存储设备(通常是硬盘)中。运行程序时,由加载器将程序代码加载入内存,可能还要加载数据,从而初始化成一个开始状态,之后指令序列顺序执行,直到执行一条跳转或转移指令,或者出现一个中断。在大多数计算机中,操作系统(例如Windows、Linux等)会加载并且执行很多程序。冯·诺依曼体系结构的计算机是由运行程序驱动其工作的。
数据可以定义为被程序处理的信息。程序在运行过程中一般需要进行一系列的数据处理,这些数据包含使用者需要程序完成的任务或需要解决的问题的有关对象的描述及信息。
算法是指解决某个问题的严格方法,通常还需辅以某种程度上的运行性能分析。计算机程序可以实现为在计算机上解决问题而设计的算法。一个算法在理论上有效可行,但是有可能浪费宝贵的内存、CPU执行时间及输入输出设备等计算机资源,因此需要衡量和测试其性能。
计算机软件(Software)是一系列按照特定顺序组织的计算机数据、计算机程序及其文档,是计算机中的非有形部分。计算机中的有形部分称为硬件,由计算机的外壳、各个零件及电路组成。计算机软件在计算机硬件上执行,计算机硬件在计算机软件的控制下运作,从而完成需要计算机系统执行的操作和实现的功能。
软件开发是根据用户要求建造出软件系统或者系统中的软件部分的过程,包括需求捕捉与分析、系统设计、实现和测试等工作阶段。
计算机程序设计(Computer Programming)或称程序设计(Programming)是指给出利用计算机解决特定问题的计算机程序的过程,包括分析、设计、编码、测试、排错等不同阶段。在计算机技术发展的早期,软件开发主要就是程序设计。随着技术的发展,软件系统越来越复杂,软件开发的内容越来越丰富。程序设计是软件开发过程中的重要步骤,此外还包括数据库设计、用户界面设计、通信协议设计和复杂的系统配置过程。
计算机程序设计需要在硬件存储空间、程序运行时间以及程序的可维护性等各种条件限制和相互矛盾的需求之间寻求平衡。在计算机技术发展的早期,由于机器资源比较昂贵,如何缩小存储空间往往是设计人员关心的首要重点;而随着硬件技术的飞速发展,计算机中数据存储媒体的价格降低,存储空间不再是考虑的第一要点,一些较耗时的运算也渐渐发展出以空间换取时间的模式,此时如何提高程序效率、缩短程序运行时间成为程序员的共同目标。随着硬件性能进步,效率差距缩小,现在的软件规模与复杂度却日益增加,程序的结构、可维护性、重复使用性、弹性等因素显得更加重要。
编程范型或编程范式(Programming Paradigm)是指从事软件开发的一类典型的风格,提供了(同时决定了)程序员对程序执行的看法。主要的编程范型包括指令式编程、函数式编程、过程式编程、面向对象编程等。例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象,而在函数式编程中一个程序会被看作是一个无状态的函数计算的序列。
1.1.2 程序设计语言的概念
程序通常用某种程序设计语言编写。
程序设计语言或编程语言(Programming Language)是一组用来定义计算机程序的语法规则,以标准化的交流形式和技巧向计算机发出指令。一种计算机编程语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。
计算机硬件能够直接识别和执行的是计算机指令序列,而程序员使用编程语言能够在更高的层次高效准确地表达他们所想表达的目的、定义算法和数据结构。使用高级程序设计语言所编制的计算机程序,通过解释或编译程序转换为计算机能够直接识别的程序——计算机指令序列。
每一种程序设计语言都会提供一套包含语法、词汇和含义的正式规范。这些规范通常包括数据和数据结构、指令及流程控制、引用机制和重用以及设计哲学。大多数广泛使用或经久不衰的语言,都有负责标准化的组织以创造及发布该语言的正式定义,并讨论扩展或贯彻现有的定义。
1. 数据和数据结构
现代计算机内部的数据都只以二元方式储存,即开-关(on-off)模式。现实世界中代表信息的各种数据,例如名字、银行账号、度量以及二元数据,都要由程序设计语言表示为高层次的概念,例如字符串、长整数、浮点数及逻辑值。程序设计语言中专门处理数据的系统称为程序语言的类型系统,可以分为静态类型系统和动态类型系统。静态类型系统又可以分为声明形态的语言和隐式类型。大多数程序设计语言能够在内置类型基础上组合出复杂的数据结构形态。
2. 指令及流程控制
确定了数据之后,必须告知计算机如何对这些数据进行处理。较简单的指令可以使用关键字或定义好的语法结构来完成。不同的语言利用序列系统来获取或组合这些语句。此外,一个语言中有专门的指令来控制处理的过程(例如分支、循环等)。
3. 引用机制和重用
当程序运行时,程序代码及数据就会加载到内存。计算机内部对内存的识别和存取是使用内存地址进行的。但是,同一个程序在不同的计算机系统运行及在同一个计算机系统的不同时间运行,所分配到的内存地址一般是不同的,一般在编写程序时是无法确定的。直接访问内存地址既不方便,可能操作系统也不允许。因此,许多程序设计语言采用引用机制来间接使用内存。最常见的引用方法是在程序中命名变量和程序段名字(宏、函数、过程和方法等),然后交由程序加载器和运行时系统自动为这些变量和程序段名字分配内存并确定其地址。程序中只需通过名字重复使用变量和程序段所分配的内存。
4. 设计哲学
汇编语言和机器语言程序都是直接对硬件操作,只是汇编语言采用了英文缩写标识符代表机器指令而更容易识别和记忆。编程者需要将每一步具体的操作用命令的形式写出来。汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作。总之,汇编语言和机器语言采用了面向计算机硬件指令的设计哲学,使编程者采用与计算机内部工作原理和工作过程相同的思维方式,直接使用计算机硬件指令设计程序。
结构化高级程序设计语言,如FORTRAN、C和Pascal等采用了三种重要控制结构及一些基本数据类型,将许多相关的机器指令合成为单条程序语言指令,且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,大幅度简化了程序中的指令,使编程者可以脱离机器层次,在更抽象的层次上表达意图,使程序员采用一般性的解题步骤而非计算机内部工作步骤的方式,设计数据结构和实现算法。此类程序设计语言采用的是面向问题解决过程和一般步骤的设计哲学,注重算法的设计,并围绕算法设计数据结构。
随着程序规模的不断扩大,20世纪60年代末期出现了软件危机,在当时普遍采用的结构化程序设计模型中无法克服随着程序代码的扩大而错误也级数般扩大的问题,以致到了无法控制的地步,随之出现了一种新的程序设计思想和程序设计模型——面向对象程序设计,相应地产生了面向对象程序设计语言,如Eiffel、C++和Java语言。面向对象程序设计语言采用了面向对象程序设计哲学,即程序是由具有各种不同属性的对象以及对象之间的消息传递构成的,数据和对数据的操作都是对象的成员。这种思想符合人们的一般思维方式,例如派车去机场接某位专家来校,首先会从学校的货车、大轿车和小轿车三类车辆中选择小轿车类,然后派出某个具体的小轿车及其司机开车去接,而不会首先想接人的小轿车怎么加油、在哪儿停车、司机怎么驾驶这些具体细节问题。目前已经证实,面向对象程序设计提高了程序的灵活性和可维护性,并且在大型项目设计中广为应用。面向对象程序设计方法更易于学习,使程序更加便于分析、设计和理解。
1.1.3 程序设计语言的选择
人们发明的程序设计语言已超过上千种,可以称得上相对“主流”(有人用、有文档)的程序设计语言至少有600种。目前仍然不断地有新程序设计语言出现,且许多已有程序设计语言也在不断地革新。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。由于设计程序语言的初衷不同、运行成本存在差异以及语言学习曲线的追求不同,一直以来多种不同的编程语言持续存在并不断发展。
某一种编程语言编制的程序可能需要较多的时间进行开发,另一种编程语言编制的程序可能产生的代码较长,第三种编程语言编制的程序可能在CPU中运行的时间较长。有些语言在特定的领域十分受欢迎,例如,C语言擅长接近计算机硬件的底层编程,同时也是一种通用的结构化高级程序设计语言;COBOL语言在公司的数据中心仍相当常用,多半是在大型计算机上运行;FORTRAN语言常用在科学及工程应用方面;R语言用在大数据分析方面则十分方便。
流行程度可能是初学者选择程序设计语言的重要参考。有许多不同的方式量测不同编程语言使用的程度:
(1)计算征集人才广告中提到各编程语言的次数。
(2)计算讲授或描述各编程语言书籍卖出的数量。
(3)统计各编程语言目前仍在使用代码的长度。
(4)利用搜索引擎计算找到不同编程语言的次数。
TIOBE编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新。这份排行榜的排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如Google、MSN、Yahoo!、Wikipedia、YouTube以及Baidu等)进行计算。如表1.1、图1.1和表1.2所示是该排行榜2017年11月的部分内容。
表1.1 前10名编程语言排行榜长期走势(1987—2017)(该位次取自12个月的平均值)


图1.1 前108名编程语言TIOBE指数走势(2001—2017)
表1.2 2017年11月编程语言排行榜前20名榜单

对于程序设计语言的初学者而言,需要明确自己的应用领域或期望,尽量选择适合该领域应用的长期发展的采用先进设计哲学和方法的主流程序设计语言。