程序理解是软件工程中的一个经典话题,又叫作软件理解或系统理解。自从软件出现,甚至在软件工程提出前,就有了程序理解问题。首先我们需要知道的是什么是程序理解?按照百度的话来说就是:程序理解是一个从计算机程序中获取知识信息的过程。这些知识信息可以应用于程序排错、增强程序、重用程序以及整理文档等方面的工作上。程序理解是软件工程领域里的一个重要部分。[1]我们稍微通俗一点来说,程序理解就是通过一些设施方法来明白程序是做什么怎么做的。那么程序理解的现状与未来又和我们这学期学习的软件工程导论又有什么关系呢?程序理解是软件工程中的关键活动,在软件开发、维护、重用等任务中发挥着重要的作用。
当我们要建一座房子的时候,我们需要先有设计图,有建筑材料。有了这些东西之后,先要建立一个房子的框架,然后根据设计图,将每一个建筑材料用到该用的地方。建筑材料包括:钢筋,水泥,砖等等。我们不需要知道这些钢筋,水泥,砖是怎么做出来的,我们只需要拿来用就可以盖出一个房子,这就是框架。所谓的框架,就是整个盖房子项目的主体,有了这个主体,我们就可以将框架的每个部分交给不同的团队的不同工种的建筑工人来实施,有的负责建主墙,有的建内墙,有的砌砖,有的粉刷等等。所谓构件,比如在铺设管道的时候,我们不需要自己用水泥和钢筋去做,而直接买水泥管道铺设就可以了,这些直接买来就可以用,具有特定功能的成品就是所谓的构件。所谓设计模式,我们在对整个房子,甚至每个房间都有一个设计,这些设计通过设计图的形式呈现出来,他们是抽象的东西,代表着一种思想。在实施不同部位时可以使用不同的设计模式。所谓应用程序编程接口,我们不需要知道怎么生产构件,但是我们可以直接从建筑提供商那里购买到,至于建筑提供商是哪里来的,我们不关心,这个建筑提供商起到的就是所谓的应用程序编程接口的作用,他给我们提供某些服务。这便是程序理解。
想要对程序理解进一步加深,我们便需要了解计算机语言发展历史:随着程序规模的不断扩大,在二十世纪60年代末期出现了软件危机,在当时的程序设计模型中都无法克服错误随着代码的扩大而级数般的扩大,以至到了无法控制的地步,这个时候就出现了一种新的思考程序设计方式和程序设计模型-----面向对象程序设计,由此也诞生了一批支持此技术的程序设计语言,比如eiffel,c++,java,这些语言都以新的观点去看待问题,即问题就是由各种不同属性的对象以及对象之间的消息传递构成。面向对象语言由此必须支持新的程序设计技术,例如:数据隐藏,数据抽象,用户定义类型,继承,多态等等。这些都促成了软件理解的现状。
程序理解以程序分析为基础。通过对程序进行人工或自动分析,以验证、确认或发现软件性质。程序分析贯穿于软件开发、维护和复用阶段:在开发阶段,对正在开发的程序进行分析,以快速、高效地开发出高质量的软件;在维护阶段,对已经开发、部署或运行的程序进行分析,以准确理解并维护该程序,从而使其能够提供更好的服务;在复用阶段,对之前开发的程序进行分析,以复用其中有价值的成分。上述不同阶段的程序分析过程差异较大, 需要的分析技术也各有不同。[1]根据其分析过程是否需要运行程序,可以将程序分析分为静态分析和动态分析:静态分析不需要运行程序,直接对程序源代码进行分析,获取相关信息[2][3];动态分析则是分析程序运行时性质[5],通过程序的运行获取程序的输入/输出关系或程序内部状态等,以验证或发现程序的性质。
对于程序理解的认知过程、技术方法和工程应用,首先我们要从认知过程看程序理解,其次是基于静态分析的程序理解,程序静态分析由M.E.Fagan于1976年提出,主要通过分析程序源码以发现其中的错误。Fagan于1976年发表的文献[5]提到,使用静态分析技术发现了30%~70%的逻辑和编码错误。后来,程序静态分析成为程序理解的重要方面。除了基于静态分析的程序理解,还有基于动态分析的程序理解。程序动态分析用于分析程序运行时性质,分析时需要采集程序运行时信息,通过分析这些运行时信息来获得程序运行时属性。[1]程序动态分析的原因包括:一方面,动态链接库被广泛使用,软件只有在完成部署之后才能完整地表达程序的功能,这种情况下,传统的仅依赖源码分析的静态分析获得的结果由于可能缺少涉及动态链接库的信息而不够精确[6];另一方面, 面向对象语言(尤其是Java)被广泛使用,这类语言具有动态绑定、多态、线程等特征,这些特性也使静态分析的结果受到限制。当然还有基于学习的程序理解,这里就不过多解释了。
基于程序理解,还有一部分延伸的任务,例如:代码补全、代码注释生成、代码模式检测、克隆检测和缺陷检测以及代码风格修正。近年来, 深度学习方法的引入, 使得程序理解逐步趋向于自动化, 也延伸了程序理解在软件开发过程中的作用[1]。
2017年7月,中国国务院发布《新一代人工智能发展规划》提出在中小学阶段推广编程,人工智能上升为国家发展战略。2018年1月,教育部公布高中新课标,编程、计算思维成必修内容。各地方政府也相继发力,大力推广少儿编程。重庆市:2018年3月23日,《重庆教育信息技术与装备中心关于印发2018年工作要点的通知》。小学3-6年级累计上课不少于36课时、初中阶段累计上课不少于36课时,同时要配备专门的编程教师。天津市:天津政府招生办发布的《2018年天津科技特长生招生计划》中,多所中学将信息学奥赛、信息技术、人工智能等纳入了招生范畴。浙江省:2018年高考,以浙江为首,将往年高考的“6选3”,改为“6+1选3”,而这里所指的“+1”就是信息技术(含编程),编程正式成为了高中必学科目。目前,有超过24个国家,包括日本,韩国,以及欧洲多个国家,已经将编程教育纳入课程大纲或者教学场景。未来编程将普及到义务教育,变成刚需学科,少儿编程教育势在必行。当一项教育从非刚需转向半刚需,将来完成变成刚需,少儿编程也会成为下一门英语。从2019年3月,教育部发布了《2019年教育信息化和网络安全工作要点》,要求中小学逐步推广编程教育。挂钩自国务院,教育部将变成纳入课堂教学及大学考试后,全国主要省市已经陆续完成落地,深圳部分省市还将变成和升学挂钩。这看似与程序理解没有任何关系,但是仔细思索,当编程成为中学生必须学习的一门课,那么中学生提早接触编程有助于从计算机程序中获取知识信息,进而促进了孩子们对于程序理解的了解,为将来他们进入大学走进社会、成为程序员,有着一定的意义!
软件是现代科学技术发展的产物,随着其规模和复杂性的提高、适用范围的扩大,需要从技术和管理两方面对软件开发过程进行控制,本质是希望系统的开发变得像工程学科中的产品生产一样。通过一系列的标准和规范,利用科学的技术、方法、工具和管理手段,以较低的成本获得较高的质量,可维护性好的软件产品。而软件是建立在程序上的,因而对于程序理解,也就是俗称的软件理解,未来应该有很好的展望!软件系统已经成为信息社会的基础设施,它面临其软硬件环境及外部资源不断变化的挑战。增强软件系统的自适应和持续演化能力,使其能够长期生存并不断成长,是当前学术界研究的新热点。前面的技术分析显示,软件理解技术将在软件系统自适应和持续演化中扮演重要的角色,是支撑软件系统能够长期生存和不断成长的不可或缺的基础技术。
浙公网安备 33010602011771号