software-strategy-book/Ch2-2-SoftwareTheory.tex

216 lines
36 KiB
TeX
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

任何一个学科的发展都需要基础理论作为支撑。涵盖计算理论与程序理论的软件理论为软件学科的发展奠定了理论基础。重要的理论结果和方法也有助于实际软件开发。信息技术的快速发展推动了整个社会的信息化程度不断提高。软件作为重要的基础设施之一需要不断提高其品质。著名软件工程师Laurence Peter Deutsch [1]给学生的建议包括“Good software requires the ability to think formally (mathematically),…Make sure you have some exposure to assertions, proofs, and analysis of algorithms, …”
在满足实际需求的过程中,理论本身不断完善。随着软件应用需求和场景的持续发展和丰富、软件运行环境和硬件平台的不断变革、以及软件基础性地位的日益提升,软件理论有着更为广阔的应用前景和发展机遇,但同时也面临巨大的挑战。最近十余年,物联网、大数据、人工智能等信息领域技术浪潮不断兴起,对计算和程序理论提出了一系列新的需求和挑战。
首先新型的软件应用需求和场景为软件理论带来挑战。大数据应用需要新型算法和复杂性理论支持海量数据的高效处理云计算的发展需要新型的分布式计算理论以及新型的编程模型人工智能的发展使得具有不确定性的知识表示和推理成为一种常规的思维方式从而为算法和复杂性理论、编程模型、以及软件的可靠性分析等带来众多问题信息物理系统CPS和物联网应用则使得系统的建模、分析和验证成为难以回避的挑战。
其次,软件运行环境和硬件平台的变革为软件理论带来机遇和挑战。一方面,处理器能力和网络带宽的大幅提升,使得以往受限于计算或通信能力的技术变得更具有实用性,包括特定的编程模型以及程序的自动化分析和验证技术,从而为软件理论的发展带来新的驱动力。另一方面,运行环境和硬件平台的变革也带来巨大挑战:人、机、物的融合使得软件运行在具有高度动态化和不确定性的环境中,为软件的规约、建模、分析和验证带来困难;多核处理器的普及促进了并发程序的使用,但对于高效并发算法的验证缺少理论和工具支持;其他挑战还包括搭载异构芯片的处理器、云平台上数据一致性的形式化规约和验证等。
其三,软件基础性地位的提升为软件理论带来挑战。软件作为基础设施,日益深入到我们生产生活的方方面面,相应地,对软件可靠性的要求也变得越来越强。人们开始期望那些在以往仅仅针对特定算法和协议的验证技术能够应用于代码级的完整系统验证上,特别是底层系统软件的验证,如操作系统内核、编译器、密码算法和协议实现等。信息物理融合系统以及基于学习的人工智能技术在自动驾驶等安全攸关系统中的应用使得混成系统和概率系统的形式验证需求越发迫切。同时,软件复杂度的提高,对于可信软件的自动化开发和验证技术也提出了更高的要求。
本章将针对软件理论的核心内容,包括算法及复杂性理论、程序正确性理论等,逐一探讨其面临的挑战,以及将来需要开展的研究。
\section{重大挑战问题}
在新的时代背景下,特别是在人机物融合的大环境下,软件理论遇到了新的挑战。具体包括:如何应对大规模的数据与计算(§1.1.1);如何保证复杂软件系统的正确性、可靠性、安全性(§1.1.2);针对新型计算机的硬件架构与新的计算平台,如何建立其理论分析基础(§1.1.3)。
\subsection{算法与计算复杂性理论}
算法复杂性度量和NP完全性理论的建立与发展形成了计算机科学的重要研究领域算法与计算复杂性。常见的理论结果往往是给出某个问题的多项式时间算法或给出某个问题的计算复杂性证明如NP困难性。算法分析和计算复杂性理论要考虑计算资源即时间与空间。新时代的软件不仅催生出新的计算模型对传统的算法分析也带来新的挑战。
首先如何设计可伸缩的算法是人机物融合背景下对计算复杂性理论的一个挑战。传统的计算复杂性理论最关注的是P vs. NP问题通常认为多项式时间能够解决的问题都可以算是能被有效求解的问题。但是在当今大数据时代很多大图动辄都有百万量级的节点、千万量级的连接边一个经典的$O(n^{2})$时间的图论算法将完全无法在这样的图上运行。因此设计具有可扩展性的算法,使得在小规模数据上运行较好的软件和算法能够容易的应用到大数据集上,是当前针对大数据算法研究的一个重要挑战。一般认为在大数据时代,$O(n logn)$时间或者线性时间的算法是可伸缩的,这种算法的结果通常都是近似性的,而非精确的,同时经常需要使用随机化的算法设计技术,包括采样、随机游走等设计技术,以达到$O(n logn)$乃至线性时间的复杂度。
其次,目前随着信息技术的发展和应用的多样化与日常化,对于软件的实时性要求越来越高,例如:导航软件、打车软件等,这为相关的算法研究带来了新的挑战。挑战之一是由于数据不断的产生和到来,与传统的离线算法不同,需要研究在线算法,算法既需要高效(算法的复杂度低),同时还要能够保证较小的竞争比(在线算法的性能与最优的离线算法性能的比值)。另外一个挑战是数据的不确定性,很多场景下输入的数据不是确定性的,而是服从某种概率分布的一个具体采样。一个典型的例子是多臂老虎机问题,动态导航问题就可以转化为一种复杂的组合多臂老虎机问题。如何在数据具有不确定性的情况下仍然能设计出具有较小的期望近似比的算法是该研究方向的一个重要挑战。
最后,云计算的普及和发展,为软件、算法的研究带来了新的分布式计算的挑战。分布式算法不仅仅关注时间复杂度,还更加关注节点之间的通信开销以及每个节点自身的存储开销。这里节点之间的通信开销可以建模成一个多方通信问题,但同时节点的存储开销又牵扯到空间复杂度。另外,由于可能存在某些节点临时掉线、断网、软硬件故障等,其中又涉及到传统分布式计算中的拜占庭问题等。
\subsection{复杂系统的可靠性保证}
近年来,计算机越来越深入到人们生活中的方方面面,对软件系统可靠性的要求越来越高。另一方面,随着处理器计算能力的增强和形式验证理论与技术的发展,软件验证的能力也在提高。因此,用形式化验证技术来确保复杂系统的可靠性成为一种可行的方案,得到了越来越多的关注和研究,近年来也出现了一些有代表性的优秀成果。
然而,在软件日益得到广泛应用的同时,其复杂度也在不断增加。软件系统的复杂性主要体现在单点技术特性复杂、系统结构复杂、系统规模庞大等方面。复杂软件系统的验证技术也随之面临重要挑战。在形式化方法中,系统的可靠性或其他安全攸关性质可以通过规约描述,而系统是否满足规约的分析过程依赖于系统的形式化建模、分析和验证。
复杂系统的可靠性挑战主要体现在以下几个方面:
首先,如何准确表示复杂系统的规约。系统的规约一般通过逻辑公式、集合论等来描述对系统安全性、可靠性、正确性等各方面的需求。系统规约要解决的主要问题是,将各种非形式化表述中使用的关键概念和性质,采用简洁直观又容易被用来推理验证的数学和逻辑语言进行描述。
随着系统复杂性的增加和系统应用场景的多样化使得需要描述的性质变得更加复杂。例如信息物理系统除了关心功能正确性还关心非功能相关的性质包括实时、空间位置等时空特性机器学习算法和系统的正确性和安全性的研究目前仍处于起步阶段即便非形式的定义和刻画这些性质仍然是开放性问题其中一些已经被大家所接受的重要性质如鲁棒性Robustness其性质刻画与经典的程序功能正确性刻画显著不同。在并发系统中除了线性一致性linearizability这种经典的对并发对象的功能正确性的刻画以外人们还提出了各种新型的量化松弛算法它们部分放松了线性一致性的要求但仍然能够提供一定的正确性保证。这些放松后的保证该如何进行形式化的刻画是目前面临的关键挑战。与之类似为了解决云计算中分布式多拷贝数据的一致性问题并在一致性、可用性、以及系统性能方面取得平衡人们提出了各种不同强度的数据一致性包括最终一致性、因果一致性、顺序一致性以及各种变体还包括多种数据一致性相结合的算法和系统这些不同的一致性的形式化规约是当前研究的热点问题。在信息安全领域很多安全特性不是描述程序一次运行的性质而是要刻画程序多次运行之间的关系如信息流安全中经典的非干扰性Non-Interference这一类性质往往被称为“超安全性质”Hyper-properties其规约也和经典的功能正确性有所不同。
其次,如何形式化表示复杂软件系统。安全攸关领域的很多系统往往可看成是信息物理系统在复杂环境中的运行。由于系统的非确定性,或克服复杂性而进行的简化,很多都具有概率与随机行为。例如,由于风对飞行器运动的影响,网络控制的系统中消息的丢失及其他随机事件。因此,对既有随机、离散事件又有连续状态变化的随机混成系统的建模、分析与验证是非常困难的。为了实现随机混成系统的分析,可以通过添加概率或随机性对混成自动机进行扩展。然后对随机混成系统的验证转化成通过概率模型检验或统计模型检验进行可达性分析。但是,现有的基于随机混成系统的可达性分析方法仍存在很多不足。
第三,如何保证具有复杂数据结构、算法或协议的系统的可靠性。现有软件系统中含有非常复杂的数据结构、算法和协议等,现有的验证理论难以完全支持。例如,操作系统内核中,为了提高系统效率,往往会使用非常复杂的指针数据结构,其复杂度远远超出双向链表、红黑树等教科书上的经典数据结构。操作系统内核和文件系统中,还会使用很多巧妙的无锁并发算法,其验证一直是形式化验证中的难点。加密算法和协议的验证则需要概率相关的特定验证理论。云计算平台中普遍使用地理上分布的多拷贝数据,其数据一致性算法的验证目前也缺少成熟理论的支持。
第四如何保证具有复杂体系结构的系统的可靠性。复杂系统往往由大量模块构成模块之间的组合方式复杂总体体现为两点a从纵向看模块之间相互调用抽象层次不同。一方面不同抽象层次的代码特性不同所需要的验证理论和技术也会不尽相同另一方面为了实现完整系统的验证需要将这些不同抽象层次的模块验证后得出完整系统的可靠性结论。这需要验证技术能够有效集成不同的验证方法、理论和工具并具有很好的纵向可组合性。b从横向看模块之间有多重组合方式例如多线程并发、事件驱动等。不同的组合方式导致模块执行的控制流的多样性这也对系统的模块化验证以及水平方向的可组合性带来挑战。
第五,如何提高软件开发的自动化程度,实现构建即正确的系统。综成(synthesis)技术可以提高软件的自动化程度。基于演绎的方法可以从高层规范的实现中派生出低层实现基于归纳的方法可以根据实例的行为生成满足实例的程序。但状态空间爆炸问题制约了可合成的系统规模。符号化方法、组合式方法可以提高可合成系统的规模却难以真正投入使用。随着推理、求解技术的发展与硬件计算能力的提高学术界出现了一系列程序自动综成工具如Sketch、Rosette等并用于学术界及业界的研究机构中。然而由于可合成系统规模有限软件的自动化仍缺乏实际应用。
最后,如何验证基于学习技术的复杂系统。机器学习的准确率难以达到百分之百。有必要对使用机器学习的系统鲁棒性进行分析。这种鲁棒性分析首先根据系统使用的神经网络结构构建相应的抽象关系,再基于抽象关系分析输入在一定的扰动下,输出是否会出现分类错误。由于复杂神经网络的神经元个数是百万级别的,而且使用了大量的非线性函数,传统的方法如基于线性规划或约束求解的方法很难实现对实际系统的分析。基于神经网络中使用的非线性函数的利普希茨(lipschitz)连续特点对非线性函数进行抽象,或使用多面体(zonotope)抽象表示神经网络每层的值域可以提高可分析系统的规模,但仍缺乏对实际基于学习系统的验证[17]。
\subsection{新型体系结构和计算平台下的程序语义刻画和正确性保证}
近年来新的体系结构和计算平台大量涌现包括多核处理器、GPU和异构芯片、分布式云计算平台等。它们对编程有各自特定的要求也对相应的程序验证带来了重要的机遇和挑战。
首先多处理器架构对程序本身的内存模型分析与设计带来新的挑战。多核处理器的流行让并发编程由一种高级编程技巧变为一种基本的编程技能。然而并发编程自身的困难并未随之消失特别是经典的共享内存的多任务并发模型及其基于锁的同步机制为并发程序设计带来了数据竞争、原子性违背、死锁、活锁等各种问题。针对这些问题新的易用、可靠的并发编程模型一度成为研究的热点提出的新型编程模型包括软件事务型内存Software Transactional Memory简称STM、事件驱动的并发模型、基于消息传递的并发模型等。然而从易用程度和程序效率的需求看现有编程模型仍然无法替代经典的共享内存并发模型。并发编程的另一大挑战是内存模型问题。编译器和处理器的优化导致每个并发任务的执行并不是严格按照代码顺序逐条指令运行。虽然这些指令执行顺序的改变不会影响单个任务的串行行为但会对多任务的程序行为产生影响。相应的并发程序行为呈现出所谓的弱内存模型。任何一个并发编程语言需要都需要描述其内存模型然而由于编译器优化的复杂性为高级语言定义内存模型的工作仍然是一个开放性问题。例如Java和C++现有的内存模型仍然存在各种问题。因此,对这些模型的形式化定义和改善成为当前研究的一大热点。
其次,多处理架构引发了并发程序数据一致性分析的挑战。多核平台中存在多线程并发程序对共享资源的访问冲突。多线程并发程序已经成为现代程序设计的趋势。并发软件应用中的并发数据结构提供支持多线程并发访问。但并发线程的执行存在不确定性,传统的测试方法很难发现这类错误。多核平台下的弱内存模型则使得多线程间数据访问的一致性难以保证。并发数据结构实现的可线性化(或其量化松弛)验证问题已经取得了一定进展,可线性化条件对有界多并发线程是可判定的,但对无界多并发线程是不可判定的。
最后新型计算平台引发了分布式系统数据一致性分析的挑战。云计算平台中为了提高系统的可用性往往采用地理上分布的多拷贝数据这也使得系统开发需要面对数据一致性、可用性和对网络分割的容忍性这三者不可兼得的经典问题即所谓的CAP定理需要在三者中做出取舍取得合理折中。考虑到强数据一致性串行一致性的实现对效率影响较大实际系统中往往根据业务特点来适当放松对一致性的保证这样带来的结果是一方面系统中可能多种一致性并存另一方面应用级程序员在使用弱一致性数据的时候难以保证程序业务的正确性。如何在编程语言和模型中既支持多种一致性又能简化编程负担并且对程序的可靠性和正确性给出指导原则和分析验证技术是当前研究的热点。
\section{主要研究内容}
为了应对人机物融合环境下对软件理论的诸多挑战,需要开展多方面的研究工作。首先,为了支持有效的大数据处理,需要研究针对性的算法(§1.2.1);其次,为了保证复杂系统的可靠性,需要围绕着规约、建模、分析与验证等环节进行研究(§1.2.2);其次,为了支持新的处理器结构与计算平台上的程序设计,需要构建相应的理论(§1.2.3);最后,为了提高新型软件的可靠性,需要研究新型软件的特点,从而给出相应的分析方法(§1.2.4)。
\subsection{面向大数据的算法与计算复杂性}
在大数据应用越来越普遍的背景下,研究面向数据科学的算法与计算复杂性理论是有效解决大数据应用问题的基础与核心。主要内容包括:新型计算模型上的算法设计与分析范式以及计算复杂性下界;数据科学所引发的非传统计算问题的高效算法与计算复杂性理论;数据依赖的算法设计与非最坏情况复杂度分析等。具体问题包括:并行、分布式、低通信、亚线性开销、动态输入、局部计算等约束下的算法设计与分析;优化、采样、推断等数据科学的计算原语在大数据环境下有理论保证的高效算法;面向隐私性、公平性等新型计算约束的算法设计与分析。
\subsection{形式化方法的理论研究}
一般来说,形式化方法的理论研究内容主要涉及规约、建模、分析与验证方法。
\begin{itemize}
\item 形式规约
\end{itemize}
形式规约可以分为基于模型的方法与基于代数的方法。基于模型的方法有VDM、Z、B、CSP等。基于代数的方法有Lotos、Larch、LTL等。近些年来针对串行程序的形式规约语言的进展集中在分离逻辑方面。除了针对分离逻辑的研究工作为了验证不同的系统研究人员对经典时序逻辑如LTL、CTL和CTL*等做了各种扩展上包括博弈扩展、概率扩展、实时扩展、量子扩展等。时序逻辑的概率扩展主要包括PCTL、PCTL*等。对于离散马尔可夫链模型PCTL的模型检验问题可在多项式时间内完成而LTL和PCTL*的模型检验问题仍是PSPACE-完全的。时序逻辑的实时扩展包括MTL和TCTL。MTL的可满足性问题和针对时间自动机的模型检验问题在连续时间上是不可判定的在离散时间上是EXPSPACE-完全的。时序逻辑的量子扩展主要包括QCTL、QCTL*等。QCTL在量子马尔可夫链上的验证可在多项式时间内完成同样该逻辑的可满足性的判定问题目前仍然没有解决。另外时序逻辑的“超性质”是基于计算机安全背景的扩展主要包括HyperLTL、HyperCTL*等。HyperLTL的模型检验算法在最坏情况下是非初等可判定的同时这两种逻辑的可满足性问题也是非初等可判定的但对于其某些特定片段却存在较为高效的算法。除了基于时序逻辑形式规约的研究进展还出现了同步语言Quartz、描述动态自适应系统的RLEAX等描述系统规约。此外基于本体论的网络本体语言(web ontology language)也用于描述机器人、航天领域的形式规约描述系统需求。
\begin{itemize}
\item 形式建模方法
\end{itemize}
形式建模方法用于精确地刻画计算机软硬件系统的行为。在一些安全关键领域为了描述和验证系统的安全性既需要描述离散的机器指令又需要描述系统所处环境的连续特性。通常使用混成自动机进行刻画。然而与状态机类似混成自动机缺乏对结构的描述。因此出现了很多辅助复杂系统模块化表示的方法。例如支持混成行为的层次化规范的环境SHIFT、PTOLEMY描述并发混成行为的I/O自动机、CHARON描述混成行为的规范HCSP(hybrid CSP)、描述基于逻辑与组合分析的混成Hoare逻辑HHL(hybrid Hoare logic)等。工业界常使用Simulink/Stateflow环境实现复杂系统的建模但它缺乏统一的形式语义。为了对复杂系统的建模人们还提出了组合建模方法如HMODEST随机混成程序。
刻画无穷状态系统有随机、参数化等模型除了使用相应的分析工具如INFANY、JKind等还可以统一在进程重写系统(Process Rewrite System, PRS)中进行分析。
最近深度神经网络的健壮性分析是研究热点之一。神经网络的结构常被表示为一组在整数域或实数域上的线性算术方程组与激活函数对应的非线性方程组的集合。然而已有的线性优化算法或者SMT求解器不擅于直接求解非线性方程。比较普遍的方法是根据具体的非线性方程对线性优化算法或SMT求解器进行扩展验证神经网络的安全性或找到对抗干扰实例。
\begin{itemize}
\item 形式分析与验证方法
\end{itemize}
软件系统的分析与验证的核心问题与挑战是如何应对系统的复杂性,缓解状态空间爆炸问题,并提高分析的精度与效率。形式分析与验证方法主要包括符号执行、抽象解释、定理证明、模型检验等,从不同方法与角度提高分析验证系统的精度与规模。
1)基于符号执行的程序分析方法
符号执行提供了一种系统性遍历程序路径空间的手段。提高可伸缩性方面的研究包括设立特定的搜索策略、约束输入范围减少程序的路径空间、优化路径条件、或面向特征的高效编码提高可伸缩性。在可行性方面的研究基本都是在分析的精确性、可靠性、建模工作量以及可扩展性之间进行权衡和折中。面向新的分析需求,也有一些新的符号执行技术出现,其中比较有代表性的是概率符号执行技术。符号执行技术与其他技术之间的紧密融合,以提高分析的效果,也是目前新的发展趋势,包括与模型检验、抽象解释、模糊测试、随机测试等的一些技术结合,以提高程序的覆盖率或缺陷发现效率。
2)基于抽象解释的形式验证方法
抽象解释理论为程序分析的设计和构建提供了一个通用的框架并从理论上保证了所构建的程序分析的终止性和可靠性。抽象解释的核心问题是提高抽象的精度。为提高抽象解释分析精度可以结合符号化方法来提高分析精度利用SMT求解器、插值等技术来计算程序语句迁移函数的最佳抽象也可以提高抽象域的非线性表达能力。如何有效降低存储开销和提高计算效率是提高抽象解释可扩展性需要考虑的主要问题。在提高抽象解释的可行性方面研究工作包括复杂数据结构如数组内容、数值与形态混合程序自动分析的支持不同谱系目标程序如多线程程序、中断驱动型程序、概率程序的支持活性性质如时序性质、终止性分析的支持。
3)基于演绎推理的定理证明方法
定理证明的基本思想是将程序满足其形式规约的证明问题转化为一组数学命题的证明。为了提高证明的效率推广定理证明的应用定理证明方面的研究可以分成两部分交互式定理证明Interactive Theorem Proving和自动推理Automated Theorem Proving。交互式定理证明最常用的两个证明辅助工具是Coq和Isabelle。Lean是一个最新的证明辅助工具其中的一个设计重点是允许更有效的证明策略的实现。自动定理证明的基础包括SMTSatisfiability Modulo Theories和归结(Resolution)。SMT的研究对象是各种领域知识的逻辑组合经常表达为带等词的一阶逻辑公式。惰性算法是目前主流的SMT求解方法采用了被称为DPLLT的算法框架。为了DPLL求解与理论求解更为有效地结合理论判定过程一般要设计为增量式的Incremental和可回溯的Backtrackable。主流SMT求解器还采用多种策略加速求解过程如理论预处理选择分支理论推导理论冲突分析和引理学习等。此外基于定理证明的方法也可以支撑构造即正确的系统软件开发如具有分层规范与公式推导特征的DeepSEA程序能够生成由CompCert编译的C程序、低层的Coq规范以及表明该程序满足规范的证明。
4)基于模型检验的形式验证方法
反例制导的抽象精化方法Counter-Example Guided Abstraction RefinementCEGAR是当前复杂系统模型检验的主要手段之一。同时基于插值Interpolant来对抽象谓词进行精化、有界模型检验Bounded Model CheckingBMC也是主流的研究方向。目前相关方向的工作主要集中于如何对代码中各种数据结构如数组、位向量、堆等进一步提供编码机制如何对给定深度内行为空间进行有效编码及剪枝等来提升可验证系统规模并提高验证效率等。此外通过多技术深度融合来进行代码验证是近年来的重要趋势之一。如将抽象解释Abstract Interpretation与模型检验相结合将插值技术与SMT结合等等。其中最具有代表性的工作为CPAChecker工具。它基于若干技术的结合通过统一接口集成多种求解器和技术来对软件系统进行验证从而得到更好的性能和可伸缩性。
简单混成系统的验证可以通过时间自动机、多速率自动机等实现。基于决策过程的Tarski代数的方法可以计算特定线性混成系统的可达集计算。HYTECH模型检验工具是第一个实现线性混成系统的精确符号化可达性分析工具用的是基于多面体polyhedral计算的方法。而CHECKMATE、d/dt工具使用多面体方法计算线性混成系统可达集的上近似。除此以外还可以通过惰性定理证明方法分析线性或非线性混成系统的限界可达性问题混成系统的分析还可以采用基于网格或谓词抽象的连续动力学特性的离散化等技术。
能够避免可达集计算的演绎推理方法被越来越多的用于复杂混成系统的验证其核心是用来描述与推理系统属性的规范逻辑的表达能力。例如Platzer等人提出的Differential (algebraic) dynamic logic可用于大部分混成系统的建模与自动化推理。
5)面向复杂系统的统计模型检验方法
统计模型检验方法通过有限多次的执行对系统进行模拟,并使用假设检验来推断这些样本是否提供满足或违反规范的统计证据。虽然基于仿真的解决方案并不能保证正确的结果,但可以限制发生错误的概率。而且,基于模拟的方法比基于搜索的精确方法使用的计算资源要小得多。
6)面向复杂系统的运行时验证方法
由于可以在系统运行时检测系统是否满足规范或出现异常,运行时验证技术使用的更为广泛。它的基本思想是将形式化描述的规范转换成监测器,插桩在实际的系统中,观测系统行为是否出现异常。目前,可监测的范围既可以是形式描述的规范,也可以是抽象出来的系统行为,不仅可以对传统的软件进行监测,也可以对基于学习的软件进行监测。为了降低监测行为对系统的开销,还出现了硬件形式的监测器,实现对实时系统的监测。
\subsection{新型体系结构和计算平台下的程序设计理论}
为了应对新涌现的体系结构与计算平台,软件与程序理论主要研究运行于新体系架构程序的语义、可靠性保证等问题。
新型体系结构下内存模型的形式化定义是软件理论研究的领域之一。片上多核众核处理器已成为计算机体系结构发展的主流。传统的顺序一致性sequential consistency模型虽然符合程序设计的直觉但已不能满足编译优化、处理器性能提升等多方面的需要。目前主流的多核处理器如x86、ARM和Power等所实现的内存模型都放松了对一致性的要求允许同一线程对不同地址的读写访问可以乱序执行。在程序设计语言层面如C11/C++11、Java等也直接定义了内存模型支持基于共享内存的多线程程序设计为编译优化、虚拟机性能提升等提供必要基础。但目前处理器及程序设计语言层面的内存模型仍缺乏严格的形式化定义使并发程序设计及验证变得更加困难。已有的语义有x86-TSO内存模型的操作语义、Power内存模型的公理语义。但如何严格刻画不同处理器、程序设计语言的内存模型仍有待进一步研究。
多处理器架构的并发程序可线性化问题是新型体系架构下的另一个研究内容。可线性化是多处理器并发程序设计的一种正确性条件沿袭了顺序式程序设计的惯性但可能会由于顺序瓶颈Sequential bottleneck制约并发软件的性能和可扩展性。近年来提出的准可线性化Quasi-Linearizability及更一般的量化松弛框架允许放松可线性化标准所要求的严格顺序规约如放松并发队列的FIFO顺序以适应多核平台性能优化的灵活性。可线性化问题对有界多并发线程而言是可判定的但对无界多并发线程而言已经是不可判定的。在理论方面已证明准可线性化问题对有界多并发线程而言是不可判定的一般而言弱内存模型可线性化在无界多调用/返回操作的情况下是不可判定的,但在有界多调用/返回操作的情况下是可判定的,因此可以采用静态方法来验证限界条件下并发数据结构实现的弱内存模型可线性化问题。
近年来,高性能计算机的峰值计算能力不断提高。但相关软件的发展还难以跟上。如何保证这类软件的可靠性,更是一个尚未解决的难题。目前,虽然有少量研究[13],但不能用于大规模并行程序的验证。
\subsection{新型软件及应用的处理与分析方法}
对于近年来新出现的各种软件及应用,核心问题是在提高系统效率的同时,如何保证系统的可靠性。基于人工智能(学习)的系统是近期出现的主流新型软件之一。根据不同的系统需求,有不同的研究方法。
一类研究围绕着如何攻击与防御人工智能系统。基于学习的模型极易受到噪音的影响,输入中的一点噪音就会改变输出结果。因此对抗样本是不可避免的。在实际系统中,对抗样本攻击的成功率非常高。如何快速地寻找对抗样本,进行攻击,是个重要的研究问题。它本质是一个优化问题,通常可以利用梯度下降优化的方法得到较好的解。目前较新的方法将模型与噪声都转变成优化目标项,而输出限制条件转换成损失函数,值域限制被转换成了平滑截断函数的变量,这样优化器可以通过直接优化目标函数,得到对抗样本。除了对抗样本的寻找,另一个方向是如何进行防御,如对抗训练、防御蒸馏等。有研究表明,即使在有防御蒸馏保护的前提下,仍可以通过转移学习生成有效的对抗样本。
另一类研究以形式化分析为基础,提供该类系统的可靠性、鲁棒性等保证。基于神经网络的智能系统结构复杂,神经元结点数众多。如何验证这类系统的正确性、分析其可靠性,是一个挑战性的问题。基于抽象的方法大大提高了可处理的神经元个数。由于实际系统的输入具有不确定性,针对确定的神经网络结构判断系统对每个输入的鲁棒性难以推广,目前缺乏对实际系统可用的验证方法。一种可行的方法是对接近输出的中间层进行验证。或者,针对神经网络的可解释性问题,把语义作为训练内容,与现有的系统结合,增加网络的可解释性。另一种可行的方法是根据系统训练过程中网络结构特点,构建输出的监测器。在使用中若某个输入导致了异常的网络内部结构,则该输入可能未在训练集范围内,输出结果不一定可靠。
\section{本章小结}
计算机软硬件的飞速发展以及不同领域需求的日益复杂,催生出各种实际问题,为软件的设计与开发带来巨大的机遇与挑战。作为软件学科基础的理论与方法也需要与时俱进;我们需要不断探索解决这些挑战性问题的新途径。软件理论依赖于各种数学手段;反过来,软件及理论的发展也可能给数学研究带来新的问题。
\section{参考文献}
[1]. L. Peter Deutsch, Ronald B. Finkbine. ACM Fellow profile. ACM SIGSOFT Software Engineering Notes 24(1): 21 (1999).
[2]. Y. Afek, G. Korland, E. Yanovsky. Quasi-linearizability: Relaxed consistency for improved concurrency. 14th International Conference On Principles of Distributed Systems (OPODIS10), 395-410, 2010.
[3]. T. Henzinger, C. Kirsch, H. Payer, A. Sezgin, A. Sokolova. Quantitative relaxation of concurrent data structures. 35th ACM Symposium on Principles of Programming Languages (POPL10), 395-410, 2013.
[4]. X. Huang, M. Kwiatkowska, S. Wang, et al. Safety Verification of Deep Neural Networks[C]. CAV 2017, LNCS 10426, pp. 3-29. Springer.
[5]. L. de Moura, S. Kong, J. Avigad, F. van Doorn, and J. von Raumer. The Lean Theorem Prover[C]. CADE 2015. LNAI 9195, pp. 378-388, Springer.
[6]. D. Kroening and O. Strichman, Decision Procedures—An Algorithmic Point of View[M], Springer, 2008.
[7]. R. Nieuwenhuis, A. Oliveras, and C. Tinelli, Solving SAT and SAT Modulo Theories: From an abstract Davis--Putnam--Logemann--Loveland procedure to DPLL(T)[J], Journal of ACM 53(6), pp. 937-977, 2006.
[8]. Y. Sun, M. Wu, W. Ruan, X. Huang, Marta Kwiatkowska, Daniel Kroening: Concolic testing for deep neural networks. ASE 2018: 109-119.
[9]. T. Gehr, M. Mirman, D. Drachsler-Cohen, P. Tsankov, S. Chaudhuri, M. T. Vechev: AI2: Safety and Robustness Certification of Neural Networks with Abstract Interpretation. IEEE Symposium on Security and Privacy 2018: 3-18.
[10]. D. Beyer, M. E. Keremoglu. CPAchecker: A Tool for Configurable Software Verification. CAV 2011, LNCS 6806, pp. 184-190. Springer.
[11]. E. M. Clarke, O. Grumberg, S. Jha, Y. Lu, H. Veith. Counterexample-guided abstraction refinement. CAV 2000, LNCS 1855, pp. 154169. Springer.
[12]. R. Alur, K. McMillan, D. Peled. Model-checking of correctness conditions for concurrent objects. 7th IEEE Symposium on Logic in Computer Science (LICS96), 219-228, 1996.
[13]. A. Bouajjani, M. Emmi, C. Enea, J. Hamza. Verifying concurrent programs against sequential specifications. 22nd European Symposium on Programming (ESOP13), LNCS 7792, 290-309, 2013.
[14]. X. Fu, Z. Chen, Y. Zhang, C. Huang, W. Dong, J. Wang. MPISE: Symbolic Execution of MPI Programs. HASE 2015: 181-188.
[15]. X. Jin, B. W. Wah, X. Cheng, Y. Wang. (2015). Significance and challenges of big data research. Big Data Research, 2(2), 59-64.
[16]. E. Kazemi, M. Zadimoghaddam, A. Karbasi. Scalable deletion-robust submodular maximization: Data summarization with privacy and fairness constraints. In International conference on machine learning: 2549-2558.
[17]. Xiaowei Huang, Daniel Kroening, Wenjie Ruan, James Sharp, Youcheng Sun, Emese Thamo, Min Wu, Xinping Yi. A Survey of Safety and Trustworthiness of Deep Neural Networks. arXiv:1812.08342.