6.1 程序设计语言
在软件设计阶段,得到了实现目标系统的解决方案,并用模型图、伪代码等设计语言表述出来。编码的过程就是把软件设计阶段得到的解决方案转化为可以在计算机上运行的软件产品的过程。
选择合适的编程语言是编码过程的关键。可以说,编程语言是人与计算机交互的基本工具,它定义了一组计算机的语法规则,通过这些语法规则可以把人的意图、思想等转化为计算机可以理解的指令,进而让计算机帮助人类完成某些任务。软件开发人员通过使用编程语言来实现目标系统的功能。
(1)编程语言的发展与分类。编程语言是人与计算机交流的重要工具。对于软件开发人员而言,编程语言是除了计算机本身之外的所有工具中最重要的。从计算机问世至今,人们一直在努力研制更优秀的编程语言。目前,编程语言的种类已有成千上万种,但是能得到广泛认可的语言却屈指可数。
①机器语言。最早的编程语言是机器语言,它是计算机可以识别和执行的指令代码。机器语言采用“0”和“1”为指令代码来编写程序,它可以直接被计算机的CPU识别,从而操纵计算机硬件的运行。由于机器语言直接操纵计算机硬件,所以语言必须基于机器的实现细节,也就是说,不同型号的计算机其机器语言是不同的。用一种计算机的机器指令编写的程序不能在另一种计算机上执行。因为机器语言直接操纵底层硬件,所以其执行速度较快,但是程序员必须熟悉计算机的全部指令代码和代码的含义。用机器语言编写程序对程序员的要求较高,花费的时间往往较长,直观性差,容易出错。由于机器语言具有“面向机器”的特点,它不能直接在不同体系结构的计算机间移植。
②汇编语言。像机器语言一样,汇编语言也是一种“面向机器”的低级语言。它通常为特定的计算机或系列计算机专门设计,可高效地访问和控制计算机的各种硬件设备。汇编语言采用一组助记符来代替机器语言中晦涩、难懂的二进制代码,用地址符号或标号来代替地址码,使得代码比较直观,容易被程序员理解。由于机器不能直接识别汇编语言,所以在执行时,汇编语言必须由特定的翻译程序转化为相应的机器语言才能由计算机执行,把汇编语言转换为机器语言的过程称为汇编,相应的翻译程序就是汇编程序。
汇编语言保持了机器语言简捷、快速的特点,比机器语言容易编写、理解。常用的汇编语言有Z-80机上的Z-80汇编语言,PC上使用的8080A、8086(8088)汇编语言等。
③高级语言。因为汇编语言中大量的助记符难以记忆,而且汇编语言对硬件体系有较强的依赖性,人们又发明了高级语言。高级语言采用类似英文的语句来表示语义,更加方便了软件开发人员的理解和使用。此外,高级语言不再依赖于特定的计算机硬件,所以移植性较强,同种高级语言可以用在多种型号的计算机上。
一些高级语言是面向过程的,比如FORTRAN、COBOL、ALCOL和BASIC,这些语言基于结构化的思想,它们使用结构化的数据结构、控制结构和过程抽象等概念体现客观事物的结构和逻辑含义。FORTRAN语言常用于大规模的科学计算;COBOL是广泛用于商业领域中的数据处理方面的语言,能有效地支持与商业处理有关的过程技术;ALCOL语言并没有被广泛应用,但是它包含的丰富的过程和数据结构值得其他语言借鉴;BASIC语言是一种解释或编译执行的会话语言,广泛地应用在微型计算机系统中。
还有一些高级语言是面向对象的,以C++语言为典型代表,这类语言与面向过程的高级语言有着本质的区别。它们将客观事物看成具有属性和行为的对象,并通过抽象把一组具有相似属性和行为的对象抽象为类。不同的类之间还可以通过继承、多态等机制实现代码的复用。面向对象的高级语言可以更直观地描述客观世界中存在的事物及它们之间的相互关系。
毋庸置疑,高级语言的出现是计算机编程语言发展的一个飞跃。
④超高级语言。第四代语言是超高级语言,它是对数据处理和过程描述的更高级的抽象,一般由特定的知识库和方法库支持,比如,与数据库应用相关的查询语言、描述数据结构和处理过程的图形语言等,它们的目的在于直接实现各种应用系统。
Tiobe排行榜是编程语言活跃度的一个比较有代表的统计排行,每月更新一次,统计数据来源于世界范围内的资深软件工程师和第三方提供商,以及各大搜索引擎(如Google)的关键字搜索等,其结果经常作为业内程序开发语言的流行使用程度的有效指标。而且排行榜也反映了编程语言的发展趋势,也可以用来在看程序员自身的知识技能是否与主流趋势相符,具有一定的借鉴意义。但必须注意的是,排行榜代表的仅仅是语言的关注度、活跃度和流行情况等,并不代表语言的好坏,因为每种语言都有自己的长处和缺点。而就一般的编程任务而言,基本各种语言都能胜任,开发效率也和使用者的熟练程度及开发平台密切相关。所以,Tiobe排行榜从长期的趋势分析,则更有参考价值。
表6.1 2019年6月Tiobe语言排行榜

表6.1显示了2019年6月的Tiobe排行。从图中可以看出,Java、C、Python和C++占据前四的地位,排行比较能反映实际的技术发展状况。比如,近年来移动智能设备的开发逐渐升温,尤其是苹果公司的iPad、iPhone等,导致Objective-C和用于为其进行游戏编程的Lua语言活跃度大幅上升;而Web和Native开发当前仍旧无法取代彼此。因此,Java、C、C++和Python仍然将在较长的时间里稳居前几名。当然,微软公司的C#或将有朝一日与Java抗衡。纵观编程语言近十年来的消长,虽然Java、C、C++和Python的地位一直比较稳定,但总的份额却在下降;处于主导地位的编程语言,其地位正在被新兴的语言侵蚀。从语言分类来看,总体上,以PHP、JavaScript等为代表的动态语言前景比较好,尤其是在正在飞速发展的Web和云计算领域上的应用;而函数式编程(如F#等)也正越来越受到重视,但过程式语言,尤其是面向对象语言仍将在未来相当长的一段时间内不可取代。越来越多的语言在向多泛型的方向发展,而且在不断地相互融合,互补长短,如静态和动态的融合(比如C#从4.0开始引入动态语言特征),函数式编程和面向对象的融合(比如F#对面向对象的支持也非常出色)等。任何一种编程语言都有优劣,不同的编程语言在不同的领域有其独特乃至不可取代之处。所以编程语言不存在哪个更好,而是要根据具体的项目特点,选择合适的编程语言。
(2)选择编程语言需要考虑的因素。在进行软件开发时,应该根据待开发软件的特征及开发团队的情况考虑使用合适的编程语言。因为不同的编程语言有其各自不同的特点,有些时候,软件开发人员在选择时经常感到很矛盾。此时软件开发人员应该从主要问题入手,对各个因素进行平衡。(https://www.daowen.com)
在选择编程语言时,通常需考虑以下7个因素。
①待开发系统的应用领域,即项目的应用范围。不同的应用领域一般需要不同的语言。对于大规模的科学计算,可选用FORTRAN语言或者C语言,因为它们有大量的标准库函数,可用于处理复杂的数值计算;对于一般商业软件的开发,可选用C++、C#和Java,它们是面向对象语言,相对于面向过程语言而言,它们更具灵活性;在人工智能领域,则多使用LISP、Prolog和OPSS;对于与数据处理和数据库应用相关的应用,可使用SQL数据库语言、Oracle数据库语言或4GL(第四代语言),当然,还要考虑数据库的类型;实时处理软件对系统的性能要求较高,选择汇编语言或ADA语言比较合适。
②用户的要求。如果用户熟悉软件所使用的语言,那么会对软件的使用及日后的维护工作带来很多方便。软件开发人员应该尽量满足用户的要求,使用他们熟悉的语言。
③将使用何种工具进行软件开发。软件开发工具可以提高软件开发的效率。特定的软件开发工具只支持部分编程语言,所以应该根据将要使用的开发工具确定采用哪种语言。
④软件开发人员的喜好和能力。采用开发人员熟悉的语言进行软件开发,可以节省开发人员进行学习和培训的资源,加快软件开发的速度。
⑤软件的可移植性要求。可移植性好的语言可以使软件方便地在不同的计算机系统上运行。如果软件要适用于多种计算机系统,那么编程语言的可移植性是非常重要的。
⑥算法和数据结构的复杂性。有些编程语言可以完成算法和数据结构复杂性较高的计算,如C和FORTRAN。但是,有些语言则不适宜完成复杂性较高的计算,如Lisp、Prolog等。所以在选择语言时,还应根据语言的特点,选取能够适应项目算法和数据结构复杂性的语言。一般来说,科学计算、实时处理和人工智能领域中解决问题的算法比较复杂,数据处理、数据库应用和系统软件开发领域内的问题的数据结构也比较复杂。
⑦平台支持。某些编程语言只在指定的部分平台上才能使用。比如为iPad和iPhone开发,则只能选用Objective-C等;为Android开发,则只能使用Java、Ruby和Python等。这种情况下,软件开发人员在选择语言时,必须考虑具体的平台支持特性。
(3)结构化程序设计特点。软件需求分析阶段和系统设计阶段所产生的文档,都不能直接在计算机上执行。只有完成了程序设计、产生可执行代码后,才能使系统的需求真正实现。
软件系统的分析和设计是程序设计(编码)的前导,实践表明,编码中出现的问题主要是由设计中存在的问题引起的。因而我们主张在编码之前进行分析、设计,尽可能在编码之前保证设计的正确性、高质量。然而这并不是说编码阶段无足轻重。相反,程序员应该能像优秀的翻译员,在编码时简明、清晰、高质量地将系统设计付诸实施。否则,软件工程前期阶段分析、设计的质量再高,如果在程序设计时质量不高的话,最后得到的软件质量仍得不到保证。
结构化程序设计(Structured Programming,SP)有3个基本特点。
①结构化程序设计采用自顶向下、逐步求精的程序设计方法。
②结构化程序设计的定义是:只使用顺序、选择和循环三种基本控制结构来构造程序。结构化程序设计用顺序、选择和循环三种结构的有限次组合或嵌套,描述模块功能的实现算法。这三种基本结构的共同特点是每个代码块只有一个入口和一个出口。结构化程序设计主张以容易理解的形式和避免使用GOTO语句等原则进行程序设计。
③采用主程序员组的组织形式。用经验多、能力强、技术好的程序员作为主程序员。其他人多做事务工作,为主程序员提供充分的支持,而所有的联络工作都通过程序管理员来进行。
结构化程序设计技术是实现结构化设计(过程设计)的关键技术。程序设计语言的选择和编码的风格会对程序的可读性、可靠性、可测试性和可维护性产生直接的影响。