基于综合模型的核电程序理解

2013-12-29 00:00:00付世敏
电脑知识与技术 2013年4期

摘要:随着我国经济和社会的发展,我国核电产业已进入繁荣发展时期,但现有核电软件已不能满足我国现阶段核电发展需求。为了对我国现有核电软件进行升级改造,在原有核电软件基础之上进行软件重用或再工程成为一个迫切的需求,这就会涉及到核电程序理解的问题。由于核电领域的专业性和复杂性,在核电软件分析的实践基础上,通过引入一般性程序理解采用的技术、模型,引出了核电软件理解需要的技术、模型、步骤。以Copernic程序为例,重点介绍了核电软件理解的过程以及物理模型的建立过程,总结出了一套对核电软件程序理解切实可行的方案,这对我国核电的发展具有十分现实的意义。

关键词:核电国产化;程序理解;核电程序理解技术;模型

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)04-0893-04

Based on the Integrated Model of the Nuclear Power Program Un-Derstanding

FU Shi-min

( School of Computer Science and Technology, University of South China, Hengyang 421001, China)

Abstract: With China's economic and social development, China's nuclear power industry has entered the prosperity and development period, but the existing nuclear power software already can’t satisfy our country present stage of nuclear power development needs. In order to China's current nuclear power software upgrading, in the original nuclear power for software reuse based on software engineering or to become a urgent demand, this will be involved in nuclear power software program understanding. Because in the field of nuclear power professional and complexity, in nuclear power software analysis based on practice, by introducing the general procedure to understand the technology, model, leads to a nuclear power software understand need technology, model, steps. To Copernic program as an example, this paper introduces the process of nuclear power software understanding and physical model of the process, summed up a set of software for nuclear power program understanding feasible scheme, this to our country the development of nuclear power has very realistic significance.

Key words: nuclear power localization; program understanding; nuclear power program understanding technology; model

1 概述

由于核电软件常常涉及到知识产权、商业机密,甚至是国家秘密。出于对自我知识产权的保护,在被引进的核电软件中,能给出核电软件自身的完整设计文档的例子是少之又少。然而,随着时间的推移,我国核电已进入繁荣发展的时期。过去那种出于安全性和经济性考虑而引进的国外核电软件已不能满足现时代我国核电发展的需求。因此,为了对我国现有核电软件进行升级,满足现阶段的核电发展需求,在原有核电软件基础之上进行软件重用或再工程成为一个迫切的需求,这就会涉及到核电程序理解的问题。因此,对核电程序理解的研究对我国核电产业发展具有十分重要的现实意义。

2 一般性程序理解的模型、技术

2.1程序理解的定义

程序理解是一个从计算机程序中获得该程序知识信息的过程,它是软件工程学中日益引起人们兴趣的一个领域,是指分析目标系统,标识目标系统组件及其相互关系,创建不同形式或更高抽象层次的系统表示的过程。其目标是理解软件系统以促进性能提高、纠错、建档、再设计或使用另外一种语言重新编程。

2.2程序理解模型

程序理解中,采用一种有效的理解模型是非常重要的,因为程序理解过程中信息前后数据不一致或信息丢失这些情况经常发生,这些都给程序理解带来了很大的困难。因此,为了程序理解的完整性和正确性,采用一定的程序理解模型是很有必要的。常用的程序理解模型有:

1) 基于自顶向下的模型:该模型应用于代码或代码类型已知的情况,采用拥有知识公式化假设,把系统分解成各个能在代码中实现子系统,再分解每一子系统直到取得实现既定功能的代码块。

2) 基于自底向上的模型:该模型理解每行程序代码,发现相似的模式及其集合,则抽象出能用于识别更高抽象层的新模式。

3)基于知识库模型

此模型由三个部分组成:①知识库:包含了程序员经验、问题域知识、论述规则、计划和目的。②思维模型:分为三层:由规格说明层、实现层和注解层组成。规格说明层是程序抽象的最高层次,完整地描述了程序的意图;实现层包括了数据结构和功能在内的最低级抽象;注解层连接规格说明层中的每个目标到它在实现层里的具体实现。这些连接可以是不完全的。③消化吸收过程:描述思维模型如何根据程序员的经验和程序信息进行理解。吸收过程既有自底向上又有自顶向下方式。具体按照哪种方式进行完全依赖程序员。其过程中关键部分是查询阶段。在这个阶段,程序员针对目标进行询问,猜测结果,最后经过搜查代码和文档来证实或推翻已有的假设。

4) 综合模型

包括三个主要部分:自顶向下模型、自底向上模型和知识库模型。该模型是将自顶向下模型、自底向上模型和知识库模型三个方法集成为一个思维模型。

2.3程序理解技术

从大的方面来说,程序分析可以分为静态程序分析和动态程序分析。静态程序分析是在不执行程序的前提下,根据程序的模型推断出程序本质结果的过程,而动态程序分析是一个分析程序运行时的依赖关系的过程。常用的静态分析技术包括:有词法分析、语法分析、控制和数据流分析、类型检查和推理、交叉引用、复杂度度量和结构化分析等,而动态分析技术包括对象实例依赖、方法调用图、动态链接和多态性、路径覆盖测试、登记和回调函数、内存管理、分支、并发、功能瓶颈等。不同的程序理解技术之间考虑的侧重点不同,将各种程序理解技术适当搭配,势必可以提高程序理解的效率。

3 核电程序理解的模型、技术及过程

由于核电软件涉及的专业知识性强,代码数量庞大,功能比较复杂,因此,针对这个特殊的软件应用领域,采用何种有效的程序分析模型、在众多的程序分析技术中选取何种对核电程序理解有效的分析技术,这些将关系到核电程序理解的效率,甚至是核电程序理解成功与否的关键。

3.1核电程序理解模型

由于核电领域是个专业性很强的领域,其中可能会涉及到复杂的公式以及计算不同的参数可能会采用不同的计算模型。这就要求核电理解人员不仅具备相应的计算机专业知识,而且要求理解人员对核电领域的基础知识、物理变量、物理模型等熟悉理解,这就需要程序理解人员有相应的知识库。同时,当对代码熟悉时,理解人员通常采用自顶向下模型进行理解;而当对代码完全不熟悉时,采用自底向上模型进行理解。一般来说,最初通过自顶向下的方式推进理解过程,这期间应该会遇到不熟悉的代码部分,于是需要转回去进行自底向上的理解。基于此,对核电软件程序理解过程中采用综合模型是比较恰当的。

3.2核电程序理解技术

核电领域是典型的安全关键领域,它的安全性事关重大。应用在该领域的软件系统一旦发生故障,将来会产生巨大的经济损失、危及人的生命甚至会造成生态灾难,因此这就对核电站生产用软件的质量提出了很高的要求。而这些被分析、理解的核电软件一般是在经过了严格的测试并被核电站实际安全运行了很多年的软件,可以被认为是安全的。基于安全性的考虑,即使对于核电软件在某些突发情况下也很少执行的情况我们也要进行分析,而不能仅仅分析核电软件中的关键信息。这就要求我们在对核电软件分析理解的过程中,要全面地展示出核电软件的具体内部信息。为了能够更全面地反应核电软件的信息,保证核电软件运行过程中所有可能的执行路径得到挖掘,在核电软件的理解分析中用到更多的是静态分析技术。根据实战经验,核电软件分析常用的静态分析技术有:词法分析、语法分析、结构分析、控制流分析、符号执行等。

3.3核电程序理解过程

在核电软件理解采用的模型、技术都确定之后,接下来我们就要考虑采用何种步骤实现对核电软件的逐步理解。根据项目实战经验,现总结出核电程序理解采用的以下几个步骤:

1)从应用领域的角度整体把握该核电软件在其领域中的作用;

由于核电软件的保密性和特殊性,被分析的核电软件一般都严重缺乏软件说明、注释等对软件理解至关重要的信息,如果此时对其直接分析源代码或是逆向工程,此时无疑像大海捞针,没有方向。但如果此时能确定该软件的应用领域,(如:我们要分析的Copernic程序是反应堆控制程序的子程序,因此,我们可以明白我们要处理的程序是用来的反应堆进行控制的),然后再从实际的应用领域中去考察该应用领域大体上应该包含有哪些功能实体,这显然有助于程序的理解。此时我们可以利用知识库模型,用语义网络将该实体的具体知识信息和知识点描述出来,并加入知识库中以备后续的使用,如下图1所示:

图1

该图粗略描述了堆芯的组成,这对我们发现堆芯的各功能实体更为有助,而软件是对现实世界的模拟,这对我们推测要分析的软件大体上应分为那些功能模块是有帮助的,如:根据上图的语义网络,我们可以大胆猜测,反应堆控制程序可能包含燃料棒的受力、中子通量计算等模块,这样就使我们在分析反应堆控制程序之前做到大体上心中有数。当然我们可以将语义网络进一步细化,如:燃料棒涉及哪些物理变量、物理过程,这些物理变量、物理过程之间的关系又是如何的等等,这些都加入知识库中以有助于核电程序的理解。

2)利用程序理解工具将核电软件分割成各功能模块并与上步分析出的实际功能尝试匹配;

面对核电软件,如果仅从代码本身去发现问题领域是怎么被模拟的,势必是困难的,也会显得很盲从。而软件是对现实世界的模拟,很多具体应用领域的实际功能会在软件的模块功能中有所体现。根据自顶向下模型,利用程序理解工具将待分析的核电软件分割成相对独立的模块(由于保密的要求,该文的图形均以非具体核电软件为例) 如图2所示:

图2

这就将一个待解决的大问题划分为具体小问题。此时,根据自顶向下模型的创建假设、证实假设、改善假设的思维将各软件模块与上一步分析出的实体功能进行尝试匹配。结合反应堆中含有的功能实体,确定各模块的“宏观”功能。在确定各子模块的“宏观”功能时我们可以同过看参考文档、看命名模块的英文的汉语语义、看软件的注释、通过模块内部变量的物理意义推测模块的功能、运用排除法等手段来证实。剩余一些确实难以匹配的模块,让其处于待定状态,等待以后分析。如:通过阅读源代码中的部分注释(如:注释中含有“rod”,“cladding”,“ posson ratior”,“elastic constants”等)并结合有限的文档参考资料,我们可以确定Copernic子程序的“宏观”功能是对燃料棒的受力进行分析。

3)针对被为分割好的核电软件各功能模块进行数学建模;

经过模块匹配之后,尽管有的核电软件模块宏观功能明确,但是其中可能会涉及复杂的物理过程。对宏观功能明确但物理过程又比较复杂的模块进行直接分析有时会显得难以下手,此时,若对有物理过程的模块进行数学建模,将其物理过程以公式的形势表现出来,并在物理模型的“宏观指导下”,理解人员再去理解程序,这无疑有利于程序的理解。同时在建模过程中,会驱动理解人员去思考,该物理模块包含哪些物理变量、其某个物理过程是如何的等,这无形中也会加深理解人员对程序的认识。由匹配结果可知,Copernic模块是处理燃料棒受力的。由于Copernic模块物理过程较为直观,我们以它为例来说明建模过程。既然要建模就要在建模前要做好充足的准备工作:

一是:对物理过程涉及的领域知识进行补充,并加入知识库中。由于涉及到力学分析,在建模之前我们要先了解基本的力学基础知识(如:弹性力学,塑性力学等),对一些物理变量等做好充分的理解(如:弹性模量,泊松比,应力,应变,屈服条件等)。

二是:了解物理过程。燃料棒处于包壳中,在反应堆运行过程中会发热、肿胀、伸长、产生气体,因此,它会受到径向、切向、轴向的应力。因此,只要我们求出这三个应力并以此为突破口,就能弄清楚软件模块时怎么对燃料棒受力进行处理的。

建模:结合燃料棒的具体实际,并运用数学知识进行建模。由于燃料棒是圆柱形的,它关于轴向对称,因此采用极坐标进行建模比较方便、简洁。根据弹性力学知识,与圆柱体密切相关的方程有:几何方程,本构方程,平衡方程。将几何方程代入本构方程就得出了三个应力的关于位移的微分形势,再将三个应力代入平衡方程,得到一个控制方程,控制方程是一个关于位移的偏微分方程,对偏微分方程求解,就得到了关于位移的的解。将所得的位移的解代入几何方程,便得到了三个方向形变的解,将形变的解代入本构方程便得到了三个方向力的解。此时,粗略模型就建立起来了,为了保证模型的基本正确性,要进行多次验证计算,为以后分析程序做好指导和铺垫。

4)选取一个软件功能模块进行分析;

在有物理过程的核电软件模块被建立数学模型以后,接下来就考虑选取一个合适的模块进行分析。可以依据如下选取策略来选取模块:一是:选取代码规模尽量小的模块;二是:选取物理模型尽量简单的模块;三是:选取程序注释尽量多的模块;四是:选取提供了较多参考文档的模块。

由于Copernic模块受力过程较为直观且我们已为其建立了数学模型,其代码规模也较为合适,我们决定首先选取该模块来分析。而对于物理过程不明确或者看不出有什么物理过程的模块的选择,可以依据如下选取策略来选取模块:一是:选取提供较多参考文档的模块;二是:选取程序注释尽量多的模块;三是:选取代码规模尽量少的模块。

经过以上几个步骤,我们就能选取出一个较为合适的软件模块了。

5)分析选取的软件模块;

对选取的Copernic模块进行分析时,根据自顶向上模型,利用程序理解工具将该模块划分为若干子模块。由于核电环境的复杂性,有的大的软件模块除了含有一个物理模型之外,大模块包含的子模块有时也会含有各自的物理模型。对于含有物理模型的子模块要为其建立相应的数学模型。如:在第三步求解径向、切向、轴向三个应力时,出现了常数C,只有将C值求出来,我们所求出的力的表达式才有意义,因此,我们就要怀疑在Copernic模块的子模块中可能会含有对常数C计算的模块。 根据分析,我们得知:在将燃料棒划分为很多小环的过程中,每一环都有各自的常数C,因此我们必须求出常数每一环的常数C,这时就要根据各小环受力平衡为其建模。将各环的受力方程组成一个方程组,并对其求解,便得出了每一环的常数C的表达式。

由于核电程序的复杂性,有时在大模块的物理模型中涉及的变量并不能通过数值直接量化,而是需要在其包含的小模块中采用拟合、迭代等方式得出,实现对该变量的计算。这就会使我们求出的大的模块的物理模型的数学表达式的变量会被散落在不同的子模块中进行计算。因此,此时我们可以利用知识库模型,将各子模块的可能的功能尝试与我们从物理模型导出的数学表达式的变量进行模式匹配,在匹配过程中,可以采用诸如:查看子模块的参考文档、子模块源代码的注释、子模块含有的变量的意义等手段来确定子模块可能的功能。

对于其余的小模块,经过参考有限的文档及观察上一步的建模得出的表达式,暂时看不出涉及物理模型的,可暂时不用考虑建模。对于确实含有物理模型但暂时还看不出含有物理模型的模块,可在稍后分析过程中去逐渐建立(如:有的模块的逻辑很难理解,此时就要考虑它可能会涉及到物理模型)。

在大模块的各小子模块的数学模型或者子模块的宏观功能被大体确立之后,接下来应考虑选择一个子模块分析。在选取哪个子模块先入手分析时,可以按照有数学模型的优先、“宏观”功能相对明确的其次、功能模型都不清楚的最后的原则进行选择分析。由于计算常数C的模块含有物理模型且其“宏观”功能相对明确,我们首先选择计算常数C的这个子模块来分析。

6)分析选取的子模块的子程序;

首先,根据自顶向下模型,将待分析的子模块的包含的所有子程序分割出来。同样,在我们选取子模块的哪个子程序分析时,最好先考虑子程序可能的“宏观”功能。此时,我们可以查看已数学形式化的计算常数C的物理模型中含有哪些物理变量,然后再去考虑子程序的“宏观”功能。根据知识库模型,将公式中含有的变量与子程序的“宏观”功能进行模式匹配,使公式的变量的物理含义与子程序的“宏观”功能对应。既然要选取子模块的子程序进行分析,我们要选取一个子程序,选取子程序的策略依次如下:

一是:该子程序有参考文档;二是:子程序的的宏观功能尽可能明确;三是:子程序中含有的注释尽量多;四是:子程序的规模尽量小。

组成一个程序的元素有:常量、变量、函数、表达式、类等诸多要素,其中以变量的物理含义、函数的功能最为重要。程序的功能是由变量组成的若干表达式及函数实现的,因此先弄清楚程序中变量的物理含义是十分必要的。

依据知识库模型,根据命名恢复规则将程序变量与知识库中的知识点进行模式匹配来确定程序变量的物理意义,对于不能匹配的程序变量,可以通过查看参考文档、程序代码注释、参阅推导出的数学表达式等方式来确定程序变量可能的物理意义,如果这样还不能确定变量的物理意义,甚至还可以大胆推测其可能的物理意义,在稍后的分析中通过搜索代码或文档等方式逐渐对其修正。然后,根据关系恢复规则将程序块中的顺序过程调用、单过程调用和构造定义等与知识库中的知识关系进行模式匹配。由于此时有些变量的物理意义我们已匹配出来,因此,对于不能匹配的顺序过程调用、单过程调用等可以参照控制流图来读取其源代码以推测出其可能的功能,其实这是一个逐渐聚合的过程,这也是自底向上模型所强调的,如:对于代码pcboards=pcboards-sold,自底向上模型的状况模型将其描述为“通过出售PC主板减少库存量”,这样经过若干步,低级的涉及知识可以组织成更高级的涉及知识。

据此,结合该模块的数学模型推导出的公式或表达式,我们就可以推出表达式的物理意义、函数的功能等子程序隐含的信息,进而推出该子程序的功能。

7)将理解出的程序信息加入知识库,并在后续理解过程中对知识库逐渐更新、修正;

对一个子程序完成理解之后,将其变量的物理意义、其含有的函数的功能、整个子程序的功能、子程序的控制流图、理解过程中对子程序语句添加的注释等信息整理成文档保存,并将诸如变量的物理意义、其含有的函数的功能等加入知识库,为后续其它子程序或子模块的理解做好铺垫和准备。经过以上步骤的多次执行以后,该子模块包含的所有子程序都会被逐个分析出来。

由于在起初程序理解过程中,我们对很多变量的物理意义、函数功能等信息库信息在认识上难免会存在不足,有时甚至是错误的认识,这就需要我们在后续的理解过程中对知识库不断进行修正和更新,最终形成一个准确的信息库。因此,待子模块的所有子程序都理解出了以后,将各子程序的信息加入知识库的同时,我们还要采用自底向上的模型,统筹各个子程序的功能来考虑整个子模块的功能。对于含有物理模型的子模块,在结合各子程序的功能时,还要对照推导出的该模块物理模型的数学形式对子模块进行理解,这样既便于子模块的快速理解,也有利于对该模块物理模型的数学形式的修正,因为我们开始建立的该物理模型的数学形式是粗略的、不准确的,程序才是精确的,我们要以程序推出的公式为准。这样经过若干步,整个程序都会被渐渐理解出来,也就实现了程序理解的目的。

4 总结

本文通过对一般性程序理解涉及的技术、模型的介绍,引出了对核电软件这个特殊的软件应用领域程序的理解。由于核电软件的复杂性,其可能会涉及到很多复杂的物理公式、甚至是物理模型,该文根据本人对核电软件的实战经验,总结出了核电软件理解过程中需要用到的技术、模型,并以Copernic子程序为例,介绍了核电程序的理解过程。由于物理模型事关程序理解的效率及准确性,在介绍核电程序理解过程的同时,Copernic子程序为例,重点介绍了在核电程序的分析过程中数学模型的建立过程,这些理论和实践经验,对今后核电软件的理解具有十分重要的现实意义。

参考文献:

[1] 李莹,张琴燕.程序理解[J].计算机应用研究,2001(6).

[2] 郭颖,钱渊.逆向工程的应用研究和发展[J].信息与电子工程,2004(2).

[3] 谢仲生,尹邦华.核反应堆物理分析[M].北京:原子能出版社,1996.

[4] 马灵春.程序理解中静态分析与抽取技术的研究及实现[D].杭州:浙江工业大学,2007.

[5] 梅宏,王千祥,张路,等.软件分析技术进展[J].计算机学报,2009(9).