Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
aea6b9a956
|
@ -2,14 +2,14 @@
|
|||
|
||||
%\section{引言}
|
||||
|
||||
《计算机科学技术百科全书》中对软件给出了如下描述:
|
||||
《计算机科学技术百科全书》中对软件给出了如下描述~\cite{张效祥2005计算机科学技术百科全书}:
|
||||
\begin{center}
|
||||
\begin{minipage}{.8\textwidth}
|
||||
\kaishu 细言之,软件一词具有三层含义。一为个体含义,即指计算机系统中的单个程序及其文档;二为整体含义,即指在特定计算机系统中所有上述个体含义下的软件的总体。三为学科含义,即指在研究、开发、维护以及使用前述含义下的软件所涉及的理论、原则、方法、技术所构成的学科。在这种含义下,软件宜称为软件学,但一般仍称作软件。
|
||||
\end{minipage}
|
||||
\end{center}
|
||||
|
||||
上述描述主要是从计算机系统中与硬件相对应的角度,给出了软件的一种存在形式的描述。而从软件历史渊源看,它本质上是刻画完成给定应用目标的可计算函数,这构成了软件的实质内容。在本书中,我们将软件\index{软件}视作是以计算为核心手段实现应用目标的解决方案。软件属于人工制品,以适应其所处环境的方式完成应用目标;更进一步,它是一种计算的逻辑制品,既有图灵可计算性和计算复杂性的刚性约束,同时又有通用图灵机模型给予的无与伦比的计算解空间。这也造就了软件成为人类认识世界、改造世界的文明发展的承载。
|
||||
上述描述主要是从计算机系统中与硬件相对应的角度,给出了软件的一种存在形式的描述。而从软件历史渊源看,它本质上是刻画完成给定应用目标的\index{可计算函数}可计算函数~\cite{Turing:1937:ComputableNumbers},这构成了软件的实质内容。在本书中,我们将软件\index{软件}视作是\emph{以计算为核心手段实现应用目标的解决方案}。软件属于人工制品,以适应其所处环境的方式完成应用目标;更进一步,它是一种计算的逻辑制品,既有图灵可计算性~\cite{Turing:1937:ComputableNumbers, Cooper:2002:CT:961908}和计算复杂性~\cite{Cook:1983:OCC:358141.358144}的刚性约束,同时又有通用图灵机模型给予的无与伦比的计算解空间。这也造就了软件成为人类认识世界、改造世界的文明发展的承载。
|
||||
|
||||
软件科学与工程学科(以下简称软件学科)是以软件为基本研究对象的人工科学(或曰“人工制品科学”,Science of Artificial~\cite{Simon:1996:SA:237774}),包括研究和分析、开发和运行、使用和演化软件等活动所涉及的理论、原则、方法、技术、工具和系统。回顾计算机科学技术的发展历史,从1966年首届图灵奖至2018年的53次颁奖中,属于软件领域的有37次(69.8\%),其中以程序设计语言、编译和操作系统为主获奖的有22次获奖,还有4次数据库获奖。 因此,在方法论的意义上,软件学科构成整个计算机科学技术学科的相当大的部分,并与系统科学、控制科学以及经济学、社会学等相关学科交叉融合,具有高度综合性。作为本书第一部分的开篇,本章将简要回顾软件和软件技术的发展历程,通过梳理软件发展脉络,总结软件学科的基本内涵、关键问题、研究方法和发展规律,为第一部分软件学科历史回顾的展开进行铺垫,同时为第二部分学科发展战略提供基础。
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
|||
本节我们试图从 “编程”表达解决方案和 “抽象”实现复杂性控制两个基本视角简要回顾软件发展历史,为下节讨论软件学科发展基本规律提供背景。
|
||||
|
||||
\subsection{人力/机械计算时代}
|
||||
程序化是人类思维的基本形式之一。如果我们广义地理解“计算”,“软件"的历史可以追溯到千年之前。人类历史上最早的计算设备是中国算盘,其算法口诀可视为一种程序化计算的规则。到东汉年代,提花机(参见图\ref{fig:1-1})的设计中蕴含了用程序方式编织特定图案的思想。类似的设备晚至1805年才在欧洲出现,即所谓Jacquard's Loom(参见图\ref{fig:1-2})。1842年人类的第一位程序员Ada Lavelace为Babagge的分析机写了第一个程序,功能是计算Bernoulli数(参见图\ref{fig:1-3}和图\ref{fig:1-4})。可见早在机械计算时代,可编程的思想已经产生了萌芽。
|
||||
程序化是人类思维的基本形式之一。如果我们广义地理解“计算”,“软件"的历史可以追溯到千年之前。人类历史上最早的计算设备是算盘,其算法口诀可视为一种程序化计算的规则。到东汉年代,提花机(参见图\ref{fig:1-1})的设计中蕴含了用程序方式编织特定图案的思想。类似的设备晚至1805年才在欧洲出现,即所谓Jacquard's Loom(参见图\ref{fig:1-2})。1842年人类的第一位程序员Ada Lavelace为Babagge的分析机写了第一个程序,功能是计算Bernoulli数(参见图\ref{fig:1-3}和图\ref{fig:1-4})。可见早在机械计算时代,可编程的思想已经产生了萌芽。
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
|
@ -54,26 +54,30 @@ Computer一词历史上出现在1613年,用来指完成演算或计算的人
|
|||
|
||||
|
||||
\subsection{电子计算时代}
|
||||
上世纪四十年代出现了电子计算机。计算机先驱们相继研制了Colossus(1943)、ENIAC(1946)、EDSAC(1949)和Mark I(1949)等计算机。EDSAC作为第一台存储程序结构的电子计算机开启了通用计算的时代。此时的程序通过一种微开关的形式加载到机器硬件上。五十年代后,出现了用户和计算机之间的简单交互。Grace Hopper在1951年和1952年为UNIVAC I编写了A-0系统,这是第一个电子计算机的编译器。从今天的角度看,A-0更像现代编译器概念的Loader或Linker,可以认为是第一个系统软件。UNIVAC I的程序由一组子程序和参数序列组成。两年后,A-2系统成为了第一个开源软件。早期的驻留管理程序将程序从纸带或者穿孔卡上读入到计算机中进行加载,这种技术直接导致了历史上第一个商用操作系统,即1956年推出的IBM 704的操作系统。五十年代后,人们开始意识到1936年提出的图灵机模型的理论意义,图灵机由此成为计算机科学发展的理论基础。通用图灵机和通用计算使人们进一步认识到可编程是计算的基本属性,人们通过编写程序使得计算机完成指定的任务。
|
||||
上世纪四十年代出现了电子计算机。计算机先驱们相继研制了Colossus(1943)、ENIAC(1946)、EDSAC(1949)和Mark I(1949)等计算机~\cite{Aspray:1986:IDC:1435661.1436778}。EDSAC作为第一台存储程序结构的电子计算机开启了通用计算的时代。此时的程序通过一种微开关的形式加载到机器硬件上。五十年代后,出现了用户和计算机之间的简单交互。Grace Hopper在1951年和1952年为UNIVAC I编写了A-0系统,这是第一个电子计算机的编译器~\cite{Ridgway:1952:CR:800259.808980}。从今天的角度看,A-0更像现代编译器概念的Loader或Linker,可以认为是第一个系统软件。UNIVAC I的程序由一组子程序和参数序列组成。两年后,A-2系统成为了第一个开源软件。早期的驻留管理程序将程序从纸带或者穿孔卡上读入到计算机中进行加载,这种技术直接导致了历史上第一个商用操作系统,即1956年推出的IBM 704的操作系统。五十年代后,人们开始意识到1936年提出的图灵机模型的理论意义,图灵机由此成为计算机科学发展的理论基础。通用图灵机和通用计算使人们进一步认识到可编程是计算的基本属性,人们通过编写程序使得计算机完成指定的任务。
|
||||
|
||||
\subsection{软件和软件工程的出现}
|
||||
“软件”一词最早出现在1953年兰德公司R.R. Carhart的报告中,用来说明讨论可靠性时与硬件相对应的“人因”。而人们现在通常理解中的“软件”这一术语来自John W. Tukey在1958年所发表的论文,文中指出 “软件由精心编写的解释程序、编译器和自动编程等组成,它们至少像电容器、晶体管、电线和磁带等现代计算机硬件一样重要”。软件形成了独立形态。1968年,或许是巧合,出现了两个软件发展史上的重大事件。这两个事件的背景都与IBM著名的IBM S/360系统相关。
|
||||
“软件”一词最早出现在1953年兰德公司R.R. Carhart的报告中,用来说明讨论可靠性时与硬件相对应的“人因”。而人们现在通常理解中的“软件”这一术语来自John W. Tukey在1958年所发表的论文~\cite{Tukey:1958:Software},文中指出 “软件由精心编写的解释程序、编译器和自动编程等组成,它们至少像电容器、晶体管、电线和磁带等现代计算机硬件一样重要”。软件形成了独立形态。1968年,或许是巧合,出现了两个软件发展史上的重大事件。这两个事件的背景都与IBM著名的IBM S/360系统相关。
|
||||
|
||||
第一个事件是软件与硬件的解绑~\cite{Humphrey:2002:SUP:513126.513132}。早期的软件依附在硬件之上解决应用问题,此时的计算机系统中硬件和软件是相互捆绑的。所谓“捆绑”,是指计算机公司(如IBM)在收费上采取只考虑硬件价格而软件和系统服务免费的策略。这在当时对于用户是很有吸引的,也增强了公司的竞争力。到1964年时情况发生了变化,IBM发布了新的IBM S/360系统,其目标是用户能够升级硬件系统而不需要替换或改变它们的应用程序。这在事实上形成了一种把应用解决方案剥离出硬件系统的技术可行性。而稍后RCA也宣布了其新的Spectra 70系统与IBM S/360兼容。这使得IBM难以阻止RCA在市场上“免费”使用其软件。1968年,IBM宣布了其软件和硬件系统的解绑。此后,软件从计算机系统硬件中剥离出来,获得了可以独立发展的空间,有机会产生独立的商业和竞争模式。可以看到,除了商业上的反垄断和市场竞争因素外,软件本质上所具备的“解决方案”的独立性和计算平台抽象使得解绑具备了历史必然性和技术可行性。之后的发展以Bill Gates创立Microsoft和Larry Ellison创立Oracle为标志,软件成为独立产品并形成巨大产业,应用领域从以科学计算和商业计算不断扩大,逐渐从作为硬件附属品的软硬一体化阶段过渡到软件产品化、产业化阶段。人们逐步认识到软件是计算机系统的灵魂,其共性沉淀形成的系统软件向下管理计算机系统的各类资源,向上满足用户对计算机系统的应用需求。
|
||||
|
||||
第二个事件是软件工程\index{软件工程}的提出。计算机能力的快速提高和软件复杂性增加导致了所谓的“软件危机”现象。典型的案例是IBM S/360的操作系统OS/360的进度、开销和可靠性均不尽人意。北大西洋公约组织(NATO)在1968年举行了首次软件工程会议。在这次会议上,专家们首次提出需要与其他领域的工程方法一样系统化地进行软件开发。正如Margaret Hamilton在开发阿波罗在轨飞行和导航系统项目中所明确指出的,“我努力使软件具有应有的地位,使得构造软件的活动受到应有的尊重,因而我开始用‘软件工程’将其与硬件和其他类型的工程区分开来,成为整个系统工程的一部分”。软件工程的出现激活了软件发展的巨大活力。这一史实也提示了软件发展的外在驱动力,即不断增长的应用需求和计算能力。
|
||||
第二个事件是软件工程\index{软件工程}的提出。计算机能力的快速提高和软件复杂性增加导致了所谓的“软件危机”现象。典型的案例是IBM S/360的操作系统OS/360的进度、开销和可靠性均不尽人意。北大西洋公约组织(NATO)在1968年举行了首次软件工程会议~\cite{Naur:1969:SER:1102020}。在这次会议上,专家们首次提出需要与其他领域的工程方法一样系统化地进行软件开发。正如Margaret Hamilton在开发阿波罗在轨飞行和导航系统项目中所明确指出的,“我努力使软件具有应有的地位,使得构造软件的活动受到应有的尊重,因而我开始用‘软件工程’将其与硬件和其他类型的工程区分开来,成为整个系统工程的一部分”~\cite{Cameron:2018:ComputingEdge}。软件工程的出现激活了软件发展的巨大活力。这一史实也提示了软件发展的外在驱动力,即不断增长的应用需求和计算能力。
|
||||
|
||||
\subsection{软件发展的主线}
|
||||
|
||||
软件通常可分为应用软件、系统软件和支撑软件。应用软件是指特定应用领域专用的软件,面向终端用户完成既定应用目标,例如办公软件、聊天软件、财务软件等;系统软件位于硬件层之上,为应用软件提供服务,如Windows或Linux操作系统、各种数据库系统、编译程序及软件中间件等;支撑软件是支撑各种软件的开发与维护的软件,如软件开发工具及环境等。系统软件和支撑软件又统称为基础软件。
|
||||
|
||||
追溯软件发展可以有多条线索,既可以考察计算机系统平台、应用形式的发展,也可以采用程序设计语言、系统软件、支撑软件等角度。从计算平台看,软件运行平台从主机平台、微机平台、局域网平台、互联网平台到万物互联平台,系统软件从批处理式、交互式、网络化发展到云边端融合的软件形态。从应用形式看,软件的应用目标从最初军事为主的科学计算起步,发展到商业计算、个人计算、网络计算、云计算、到如今泛在计算等林林总总各个领域的场景需求,应用软件极大丰富。为更好地面向需求,满足各类质量、进度和成本约束,驾驭各类复杂性成为软件重要主题,软件语言从机器语言、汇编语言、高级语言、发展到领域语言,成为描述软件的基本方式。之上形成所谓的软件方法学\index{软件方法学},主要涉及指导软件设计的原理和原则,以及基于这些原理、原则的方法和技术。狭义的也指某种特定的软件设计指导原则和方法体系。从ALGOL诞生至今,软件方法学从结构化方法、对象化方法、构件化方法、服务化,发展到网构化方法,形成一系列的支撑软件。
|
||||
追溯软件发展可以有多条线索,既可以考察计算机系统平台、应用形式的发展,也可以采用程序设计语言、系统软件、支撑软件等角度。
|
||||
从计算平台看,软件运行平台从主机平台、微机平台、局域网平台、互联网平台到万物互联平台;系统软件从批处理式、交互式、网络化发展到云边端融合的软件形态。
|
||||
从应用形式看,软件的应用目标从最初军事为主的科学计算起步,发展到商业计算、个人计算、网络计算、云计算、到如今泛在计算等林林总总各个领域的场景需求,应用软件极大丰富。
|
||||
为更好地面向需求,满足各类质量、进度和成本约束,驾驭各类复杂性成为软件重要主题,软件语言从机器语言、汇编语言、高级语言、发展到领域语言,成为描述软件的基本方式。
|
||||
在此之上形成所谓的软件方法学\index{软件方法学},主要涉及指导软件设计的原理和原则,以及基于这些原理、原则的方法和技术。狭义的也指某种特定的软件设计指导原则和方法体系。从ALGOL~\cite{Naur:1960:ALG:1061146.1061147}诞生至今,软件方法学从结构化方法~\cite{Dahl:1972:SP:1243380}、对象化方法~\cite{Booch:1986:OD:9794.9797, Meyer:1997:OSC:261119}、构件化方法~\cite{Heineman:2001:CSE:379381}、服务化方法~\cite{Huhns:2005:SCK:1053547.1053596},发展到网构化方法~\cite{Mei:2016:INS:3086926}。%,形成一系列的支撑软件。
|
||||
|
||||
\subsubsection{以抽象为主线的软件学科发展}
|
||||
|
||||
软件解决问题的过程是从应用目标需求的问题空间到计算平台给予的解空间的映射过程。软件可以看成是现实世界中的问题及其求解方案在计算机上的符号表示。如何将现实世界表示为人和计算机都能够理解的符号系统是软件学科最核心的问题之一,此即软件模型及其建模问题,其本质是抽象。一方面,软件模型是现实世界的抽象表示,另一方面,它又是现实世界问题及其求解方案在计算机上实现(即计算机软件)的抽象规约。换言之,软件模型是将现实世界问题空间映射到计算机世界解空间的“桥梁”。
|
||||
软件解决问题的过程是从应用目标需求的问题空间到计算平台给予的解空间的映射过程。软件可以看成是现实世界中的问题及其求解方案在计算机上的符号表示。如何将现实世界表示为人和计算机都能够理解的符号系统是软件学科最核心的问题之一,此即软件模型及其建模问题,其本质是抽象~\cite{Booch:2007:ooadwa, Kramer:2007:AKC:1232743.1232745}。一方面,软件模型是现实世界的抽象表示,另一方面,它又是现实世界问题及其求解方案在计算机上实现(即计算机软件)的抽象规约。换言之,软件模型是将现实世界问题空间映射到计算机世界解空间的“桥梁”。
|
||||
|
||||
因而,软件学科本质上一门方法论学科,其中的关键是软件的范型。软件范型是从软件工程师(或程序员)视角看到的软件模型及其构造原理,而构造软件模型的语汇(也称基本元素)是各类软件抽象设施,构造模型的方法是各类抽象的分解、组合和变换。Sapir-Whorf的语言相对论假设对语汇的重要性给出了一个表述。其较弱的版本称为语言相对论,是指语言影响思维与决策;而较强的版本称为语言决定论,则是指语言决定思维与认知边界。认识软件的切入点是认识各种软件抽象。它们构成了软件的语汇,包括但不限于程序设计语言设施、软件构件、软件服务等。宏观地说,软件方法学的核心是建立(一般的)软件抽象。
|
||||
因而,软件学科本质上一门方法论学科,其中的关键是软件的范型~\cite{Floyd:1979:PP:359138.359140, Lu:2009:ISS:1640206.1640213, Mei:2012:ISP:2311627.2311662, Kuhn:1970:StructureSciRev}。软件范型是从软件工程师(或程序员)视角看到的软件模型及其构造原理,而构造软件模型的语汇(也称基本元素)是各类软件抽象设施,构造模型的方法是各类抽象的分解、组合和变换。Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite{Lucy:1997:LinguisticRelativity}。其较弱的版本称为语言相对论,是指语言影响思维与决策;而较强的版本称为语言决定论,则是指语言决定思维与认知边界。认识软件的切入点是认识各种软件抽象。它们构成了软件的语汇,包括但不限于程序设计语言设施、软件构件、软件服务等。宏观地说,软件方法学的核心是建立(一般的)软件抽象。
|
||||
%而系统软件的核心在于实现这些抽象,软件工程则使用这些抽象构造应用软件。不同层次的抽象、抽象的计算实现和使用组成了软件发展的脉络。我们试图以软件各种抽象为主线来梳理和汇聚软件发展的基本历程。
|
||||
%例如,在典型的大数据处理系统(如Google搜索引擎)中,我们可以看到接口与服务、方法与设施、虚拟化与实现等不同层次组成的抽象栈,它们分别对应着Web服务、MapReduce、Dryad、Pregel、BigTable、集群调度、分布式文件、操作系统等抽象层。
|
||||
|
||||
|
@ -98,21 +102,24 @@ Computer一词历史上出现在1613年,用来指完成演算或计算的人
|
|||
|
||||
程序设计语言提供着计算平台直接实现的抽象和构建抽象的设施,是软件范型的表示载体和描述工具。程序设计语言总是力图以更一致、更准确的方式实现从问题域到解空间的映射,更方便地表达问题求解思路,从而使开发者可以用更少的代码完成更多的工作,用更优的结构来控制编程复杂性,用更加严格规范的语法来预防编程错误等。换言之,程序设计语言的设计总是以更具表达能力和提高软件开发效率和质量为主要追求目标。
|
||||
|
||||
军事领域的科学计算是计算应用的最初需求。面向科学计算建立的抽象成为软件发展的早期里程碑。为了满足数值计算的需求,John Backus于1953年发明了Fortran语言,是历史上第一个正式推广的高级程序设计语言,于1957年在IBM 704计算机上实现。Fortran语言提供的抽象对用数学公式表达的问题求解提供了直接支持。经过多年的版本更替,Fortran语言至今仍在使用。Fortran的主要贡献者获得了图灵奖。
|
||||
军事领域的科学计算是计算应用的最初需求。面向科学计算建立的抽象成为软件发展的早期里程碑。为了满足数值计算的需求,John Backus于1953年发明了Fortran语言~\cite{Backus:1978:HFI:960118.808380},是历史上第一个正式推广的高级程序设计语言,于1957年在IBM 704计算机上实现。Fortran语言提供的抽象对用数学公式表达的问题求解提供了直接支持。经过多年的版本更替,Fortran语言至今仍在使用。Fortran的主要贡献者获得了图灵奖。
|
||||
|
||||
1960年,面向常规商业信息处理,COBOL语言发布,成为COBOL-60。COBOL提供了面向周期性循环处理和数据变换的抽象,适合于报表、情报、计划编制等商业数据处理,如今仍有应用。同一时间段,面向通用计算的算法语言ALGOL 60诞生,成为ACM当时算法描述的标准,它提供了数据结构、块结构、递归等设施。ALGOL语言的意义重大,一是它确立了结构化高级程序设计语言设计的基础,之后的Pascal、C、Java等命令式程序设计语言的基础;二是它催生了试图严格或形式化定义语言和程序的一大批软件基础理论成果。ALGOL 60的主要贡献者Peter Naur获得了2006年图灵奖。
|
||||
1960年,面向常规商业信息处理,COBOL语言发布,成为COBOL-60~\cite{Sammet:1978:EHC:800025.1198367}。COBOL提供了面向周期性循环处理和数据变换的抽象,适合于报表、情报、计划编制等商业数据处理,如今仍有应用。同一时间段,面向通用计算的算法语言ALGOL 60诞生,成为ACM当时算法描述的标准,它提供了数据结构、块结构、递归等设施~\cite{Perlis:1978:ASD:800025.1198352, Naur:1978:ESL:800025.1198353}。ALGOL语言的意义重大,一是它确立了结构化高级程序设计语言设计的基础,之后的Pascal~\cite{Wirth:1993:RDP:154766.155378}、C~\cite{Ritchie:1993:DCL:154766.155580}、Java等命令式程序设计语言的基础;二是它催生了试图严格或形式化定义语言和程序的一大批软件基础理论成果。ALGOL 60的主要贡献者Peter Naur获得了2006年图灵奖。
|
||||
|
||||
60年代末至80年代,历经Simula 67、Smalltalk、C++等语言,面向对象程序设计范型形成,提供了类(对象)、方法(消息传递)、继承等设施,建立了封装和多态等机制。面向对象语言的创立者Ole-Johan Dahl、Kristen Nygaard和重要贡献者Alan Kay也分别于2001年和2003年获得了图灵奖。
|
||||
60年代末至80年代,历经Simula 67~\cite{Nygaard:1978:DSL:800025.1198392}、Smalltalk~\cite{Kay:1993:EHS:154766.155364}、C++~\cite{Stroustrup:1993:HC:154766.155375}等语言,面向对象程序设计范型形成,提供了类(对象)、方法(消息传递)、继承等设施,建立了封装和多态等机制。面向对象语言的创立者Ole-Johan Dahl、Kristen Nygaard和重要贡献者Alan Kay也分别于2001年和2003年获得了图灵奖。
|
||||
|
||||
与命令式程序设计语言不同,50年代末人们还探索了声明式程序设计语言,其代表是基于Lambda演算的函数式语言LISP、基于Horn Logic的Prolog、基于关系演算的SQL等。以LISP为例,它提供了用于问题求解的函数抽象,首次在语言中支持递归函数定义。LISP的设计思想深刻地影响了ML、Haskell等函数式程序设计语言的发展。
|
||||
与命令式程序设计语言不同,50年代末人们还探索了声明式程序设计语言,其代表是基于Lambda演算的函数式语言LISP~\cite{McCarthy:1978:HL:800025.1198360}、基于Horn Logic的Prolog~\cite{Colmerauer:1993:BP:154766.155362}、基于关系演算的SQL~\cite{Chamberlin:2012:EHS:2420618.2420665}等。以LISP为例,它提供了用于问题求解的函数抽象,首次在语言中支持递归函数定义。LISP的设计思想深刻地影响了ML~\cite{Gordon:1978:MIP:512760.512773}、Haskell~\cite{Hudak:2007:HHL:1238844.1238856}等函数式程序设计语言~\cite{Backus:1978:PLV:359576.359579}的发展。
|
||||
|
||||
随着人们对程序设计安全可靠、便捷有效等需求的提高,以及计算平台向并发、分布、异构发展,程序设计语言呈现了两方面走向:一是,程序设计范型的融合,例如面向对象语言和函数式语言的融合并支持并发、安全计算,出现了Scala、Rust等程序设计语言,展现了强劲的势头;另一方面是,面向特定领域的语言受到了重视,它们针对领域应用提供高效便捷的抽象,例如面向大数据处理的Map Reduce、面向区块链智能合约的Solidity。
|
||||
随着人们对程序设计安全可靠、便捷有效等需求的提高,以及计算平台向并发、分布、异构发展,程序设计语言呈现了两方面走向:一是,程序设计范型的融合,例如面向对象语言和函数式语言的融合并支持并发、安全计算,出现了Scala、Rust等程序设计语言,展现了强劲的势头;另一方面是,面向特定领域的语言受到了重视,它们针对领域应用提供高效便捷的抽象,例如面向大数据处理的Map Reduce~\cite{Dean:2008:MSD:1327452.1327492}、面向区块链智能合约的Solidity。
|
||||
|
||||
程序设计语言向上要面向问题求解方法的表达,向下要在计算机系统上实现。围绕语言的语法、语义和语用等方面的程序理论和问题求解的计算理论成为了软件理论的重要部分。从ALGOL60开始,关于程序(构造)的理论研究就开始了,其基本内容是在计算理论的基础上建立程序的形式语义,并对程序及其性质进行推理,其本质是基于数学的方法来建立抽象及抽象之间的联系。在60年代到70年代,人们建立了程序设计语言的操作语义学、公理语义学、指称语义学和代数语义学。程序语言与形式语义的研究紧密联系,例如,1974年Barbara Liskov提出了抽象数据类型的程序设计思想~\cite{Liskov:1974:PAD:800233.807045},建立了现代面向对象语言的核心特征,包括强类型检查和通用类型支持,支持了对象化方法语言中的类抽象。以形式语义学为基础,人们长时期探索程序的形式开发和形式验证等形式化方法和技术以提高软件生产率和软件质量,取得显著的进展,例如模型检验获得了2005年图灵奖。与程序相关的问题的求解判定和算法复杂性也成为程序设计语言设计和形式化方法的重要内容。
|
||||
程序设计语言向上要面向问题求解方法的表达,向下要在计算机系统上实现。围绕语言的语法、语义和语用等方面的程序理论和问题求解的计算理论成为了软件理论的重要部分。从ALGOL60开始,关于程序(构造)的理论研究就开始了,其基本内容是在计算理论的基础上建立程序的形式语义,并对程序及其性质进行推理,其本质是基于数学的方法来建立抽象及抽象之间的联系~\cite{floyd:1967:assigning, 陆汝钤:2017:计算系统的形式语义}。在60年代到70年代,人们建立了程序设计语言的操作语义学、公理语义学、指称语义学和代数语义学。程序语言与形式语义的研究紧密联系,例如,1974年Barbara Liskov提出了抽象数据类型的程序设计思想~\cite{Liskov:1974:PAD:800233.807045},建立了现代面向对象语言的核心特征,包括强类型检查和通用类型支持,支持了对象化方法语言中的类抽象。以形式语义学为基础,人们长时期探索程序的形式开发和形式验证等形式化方法和技术以提高软件生产率和软件质量,取得显著的进展,例如模型检验获~\cite{Clarke:2000:MC:332656}得了2005年图灵奖。与程序相关的问题的求解判定和算法复杂性也成为程序设计语言设计和形式化方法的重要内容。
|
||||
|
||||
\subsubsection{以实现抽象为目标的系统软件}
|
||||
|
||||
随着硬件能力快速提高,以操作系统和编译器为代表的系统软件成为建立抽象、使用抽象来实现更高级抽象的焦点。系统软件力图凝练应用软件中的共性并加以复用,以尽可能提高软件开发和运行的效率。事实上,程序设计语言中许多重要概念来自于操作系统和编译器的设计。John Cocke在解决上下文无关语言的有效扫描中发明了动态程序设计范型,而Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程序作为抽象结构。这些抽象是用来支持相对应的设计方法,也就是问题求解的方法。
|
||||
随着硬件能力快速提高,以操作系统和编译器为代表的系统软件成为建立抽象、使用抽象来实现更高级抽象的焦点。系统软件力图凝练应用软件中的共性并加以复用,以尽可能提高软件开发和运行的效率。
|
||||
事实上,程序设计语言中许多重要概念来自于操作系统和编译器的设计。
|
||||
%John Cocke在解决上下文无关语言的有效扫描中发明了动态规划,而
|
||||
Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程序作为抽象结构。这些抽象是用来支持相对应的设计方法,也就是问题求解的方法。
|
||||
|
||||
追求充分发挥硬件的能力,利用软件技术统筹管理好硬件以形成灵活、高效、可信、统一的虚拟资源是系统软件的首要驱动力。六十年代,集成电路的兴起增强了计算机的能力,高效的管理硬件、发挥硬件效能成为操作系统重要驱动力。操作系统出现了不少新技术,并变得强大复杂。典型的技术有多道程序设计、分时、实时、多处理器技术等等。70年代,操作系统的设计进一步发展,形成了UNIX操作系统,成为当今主机操作系统的基础。80年代,商业计算和微处理器时代到来,出现了一批微机和工作站操作系统,代表的是MS-DOS,Linux、Solaris 和Windows等。90年代,在"网络就是计算机"的推动下,以主机和微机操作系统为基础,中间件或网络化操作系统成为系统软件的增长点。进入新世纪后,以iOS和Android代表的移动操作系统,与主机操作系统向数据中心扩展的云操作系统形成了云端计算的软件基础设施的基本格局。更好地满足用户对易用性的需求成为系统软件生态化发展的重要因素。
|
||||
|
||||
|
@ -123,10 +130,10 @@ Computer一词历史上出现在1613年,用来指完成演算或计算的人
|
|||
|
||||
\subsubsection{基于抽象构建应用解决方案的软件工程}
|
||||
|
||||
可编程和抽象作为软件的基本形态,随着软件工程思想的出现,软件开发方法和技术体系逐渐发展起来。面向应用建立问题解决方案的抽象成为软件开发方法的共识。软件开发可以看作是利用抽象构建新抽象获得问题解的过程。分而治之的模块化和组合化是使用抽象和在使用中建立新抽象的基本思路,信息隐藏是其基本原则。软件开发方法中的诸多抽象大多来自于程序设计语言的思路。例如,70年代的结构化系统分析和设计方法、80年代的面向对象分析和设计等等。软件开发和程序设计在抽象上尽可能地保持了一致或相容,使得软件工程模型不同阶段、不同层次的抽象有着较好的对应。另一方面,在程序设计语言抽象的基础上,为了与人们应用问题求解思维过程的一致,在软件的需求和高层设计上也出现了高层的抽象设施,也称软件建模语言。例如,在面向对象方法学的统一建模语言UML,用Use Case对需求进行抽象建模,用Message Sequence对设计中类交互序列进行抽象。
|
||||
可编程和抽象作为软件的基本形态,随着软件工程思想的出现,软件开发方法和技术体系逐渐发展起来。面向应用建立问题解决方案的抽象成为软件开发方法的共识。软件开发可以看作是利用抽象构建新抽象获得问题解的过程。分而治之的模块化和组合化是使用抽象和在使用中建立新抽象的基本思路,信息隐藏是其基本原则。软件开发方法中的诸多抽象大多来自于程序设计语言的思路。例如,70年代的结构化系统分析和设计方法、80年代的面向对象分析和设计等等。软件开发和程序设计在抽象上尽可能地保持了一致或相容,使得软件工程模型不同阶段、不同层次的抽象有着较好的对应。另一方面,在程序设计语言抽象的基础上,为了与人们应用问题求解思维过程的一致,在软件的需求和高层设计上也出现了高层的抽象设施,也称软件建模语言。例如,在面向对象方法学的统一建模语言UML~\cite{Booch:1999:UML:291167},用Use Case对需求进行抽象建模,用Message Sequence对设计中类交互序列进行抽象。
|
||||
更进一步,随着软件抽象粒度和层次的提升,软件开发方法和软件语言的发展愈加紧密。例如,基于复用思想的软件构件化方法中提出了软件体系结构,构件和构件间的连接子成为其重要组成;服务化方法定义了服务和服务间的流程编排;以及网构化方法提供了自主实体和实体间的按需连接,等等。
|
||||
|
||||
在计算为手段的解空间中,人们一方面不断地建立抽象,一方面不断地在计算平台上高效能实现抽象,两者相辅相成,螺旋上升。例如,结构化程序设计开创了程序设计得到的程序具有良好的结构,在这个指导思想下,问题求解可以看作是一系列的分解过程,即从一个较高层的过程,逐步地加入细节得到较低层的抽象,从而完成整个程序。逐步精化和层次化的程序结构是结构化程序设计的基本原理。在结构化程序设计的基础上,当程序员在某个抽象层次上使用下一层次提供的抽象时并不需要考虑底层的实现细节。然而高级程序设计语言不可能以内嵌的方式提供问题求解需要的所有抽象,需要一种方式可以从内嵌类型构造不同层次抽象的能力。这些动机促使了抽象数据类型的出现。抽象数据类型用抽象对象上一组操作的方式定义了该类抽象对象,即用类型上的操作来定义新类型。它一方面封装了底层操作抽象的细节,又构造了一组新的类型抽象。迭代地,这些不同抽象之间的关系通过分解、组合封装的方式,形成低级抽象实现高级抽象、高级抽象精化为低级抽象的软件栈,呈现一个垂直方向的模型映射关系。这形成了模型驱动(Model-driven)的软件开发方法。模型作为了软件系统的抽象描述,逐渐基于模型(Model-based)这个说法就成为更能够表达其宽泛含义的术语,基于模型的软件开发得到了较大的发展,出现了基于模型的软件开发(Model-based Software Development)、基于模型的测试(Model-based Testing)、基于模型的规约(Model-based Specification)等技术。
|
||||
在计算为手段的解空间中,人们一方面不断地建立抽象,一方面不断地在计算平台上高效能实现抽象,两者相辅相成,螺旋上升。例如,结构化程序设计开创了程序设计得到的程序具有良好的结构,在这个指导思想下,问题求解可以看作是一系列的分解过程,即从一个较高层的过程,逐步地加入细节得到较低层的抽象,从而完成整个程序。逐步精化和层次化的程序结构是结构化程序设计的基本原理。在结构化程序设计的基础上,当程序员在某个抽象层次上使用下一层次提供的抽象时并不需要考虑底层的实现细节。然而高级程序设计语言不可能以内嵌的方式提供问题求解需要的所有抽象,需要一种方式可以从内嵌类型构造不同层次抽象的能力。这些动机促使了抽象数据类型的出现~\cite{Liskov:1974:PAD:800233.807045}。\index{抽象数据类型}抽象数据类型用抽象对象上一组操作的方式定义了该类抽象对象,即用类型上的操作来定义新类型。它一方面封装了底层操作抽象的细节,又构造了一组新的类型抽象。迭代地,这些不同抽象之间的关系通过分解、组合封装的方式,形成低级抽象实现高级抽象、高级抽象精化为低级抽象的软件栈,呈现一个垂直方向的模型映射关系。这形成了模型驱动(Model-driven)的软件开发方法~\cite{Schmidt:2006:MDE}。模型作为了软件系统的抽象描述,逐渐基于模型(Model-based)这个说法就成为更能够表达其宽泛含义的术语,基于模型的软件开发得到了较大的发展,出现了基于模型的软件开发(Model-based Software Development)、基于模型的测试(Model-based Testing)、基于模型的规约(Model-based Specification)等技术。
|
||||
|
||||
%如图,结构化抽象与THE OS、C与UNIX、面向对象与CORBA和EJB、服务化与Docker虚拟机交相辉映,形成了以计算为手段的解平台提升,并与结构化、对象化、构件化、服务化等软件开发方法携手同行。
|
||||
|
||||
|
@ -143,7 +150,7 @@ Computer一词历史上出现在1613年,用来指完成演算或计算的人
|
|||
\end{description}
|
||||
不同于一般物品,软件是一种人工制品,同时也是一种纯粹的逻辑制品。作为逻辑制品,其困难不在于物理限制而在于逻辑构造。因此,软件开发活动本质上不同于传统工程制造:后者在于“造物”,前者可谓“拟人”—即表达人脑思维形成的问题解决方案;后者可有规模效应,而对前者而言,每一个软件系统都是独一无二的创造。
|
||||
|
||||
软件学科是以软件为研究对象,研究以软件求解应用问题的理论、原则、方法和技术,以及相应的工具支持、运行平台和生态环境的学科。其核心内容是以计算为工具的问题求解方法论,目标是达成效能、效率和价值的统一。N. Wirth在“软件工程简史”一文中指出 “如果说我们能从过去学到什么,那就是计算机科学本质上是方法论学科。它开发并教育在广泛多样应用的共性受惠的知识和技术”。我们认为,在这个意义上,软件学科实质上就是Wirth所说的计算机科学的主体。
|
||||
软件学科是以软件为研究对象,研究以软件求解应用问题的理论、原则、方法和技术,以及相应的工具支持、运行平台和生态环境的学科。其核心内容是以计算为工具的问题求解方法论,目标是达成效能、效率和价值的统一。N. Wirth在“软件工程简史”一文中指出 “如果说我们能从过去学到什么,那就是计算机科学本质上是方法论学科。它开发并教育在广泛多样应用的共性受惠的知识和技术”~\cite{Wirth:2008:BHS:1449571.1449577}。我们认为,在这个意义上,软件学科实质上就是Wirth所说的计算机科学的主体。
|
||||
|
||||
软件的功能性、目的性和适应性,使得软件学科呈现出了艺术、科学和工程共存的学科特征。这源自于软件本身融合了人类活动、数学物理规律约束的计算模型和装置、以及面向应用价值的工程设计。软件之目的性是其工程属性的来源,而功能性的设计及设计的柔性孕育了艺术、方法和原创的结合,软件最终运行的计算平台的物理和图灵可计算内生了软件发展遵循的科学规律。艺术、科学和工程在软件发展的不同阶段和侧面会相互渗透乃至相互转换。归根到底,其目的性表征的价值、软硬平台与外部环境所形成的功能及界面适应性是其核心,这也成就了软件成为万能集成器和粘合剂的基础设施地位。
|
||||
|
||||
|
@ -213,7 +220,7 @@ Computer一词历史上出现在1613年,用来指完成演算或计算的人
|
|||
|
||||
软件范型重点解决软件是什么的问题,描述了软件的模型和模型构造、运行的基本理论,包括了计算理论、程序设计语言和程序理论。计算理论包括可计算性理论、算法理论等。可计算性理论回答什么能或不能在计算平台上求解,算法理论回答如何在计算平台上高效能行求解问题。程序设计语言和程序理论回答软件抽象是什么以及它们之间联系的问题。我们将软件范型的学科内容归入程序设计语言与理论。
|
||||
|
||||
软件开发方法重点解决如何面向应用目标开发软件的问题。其主要围绕相应的软件范型,研究大型软件系统高质量高效率开发的方法、技术和工具,属于软件工程的范畴。软件开发是一项困难的任务,而困难可区分为实质性(Essential)的和附属性(Accidental)的。可以认为,前者来自于软件所要解决问题本身所固有的复杂性和多变性,而后者源自解决问题时所用技术手段和过程步骤方面的不妥。软件开发方法旨在消除附属性困难,并帮助开发者理解和驾驭问题本身的实质性困难。软件开发技术核心是有效控制问题求解的附属复杂性,是一个不断建立抽象、使用抽象来实现抽象的过程。
|
||||
软件开发方法重点解决如何面向应用目标开发软件的问题。其主要围绕相应的软件范型,研究大型软件系统高质量高效率开发的方法、技术和工具,属于软件工程的范畴。软件开发是一项困难的任务,而困难可区分为实质性(Essential)的和附属性(Accidental)的~\cite{Brooks:1987}。可以认为,前者来自于软件所要解决问题本身所固有的复杂性和多变性,而后者源自解决问题时所用技术手段和过程步骤方面的不妥。软件开发方法旨在消除附属性困难,并帮助开发者理解和驾驭问题本身的实质性困难。软件开发技术核心是有效控制问题求解的附属复杂性,是一个不断建立抽象、使用抽象来实现抽象的过程。
|
||||
|
||||
在运行支撑方面重点解决如何在计算平台上高效高可靠的运行软件的问题。其基本途径是逐层的虚拟化技术和系统优化技术,运行平台包括操作系统、数据库、中间件等。操作系统可视为构架在硬件资源上的软件虚拟机,以追求更高效地发挥各种硬件资源所提供的计算能力,提供友好的人机交互界面。而数据库、中间件等均可视为架构在下层资源上的一层虚拟机,充分发挥下层资源的计算能力,提供高效的资源管理和更自然的人机界面。我们将运行支撑方面的学科内容归入系统软件的范畴。
|
||||
|
||||
|
|
|
@ -150,7 +150,7 @@
|
|||
总之,敏捷软件开发通过自组织和跨职能团队及其客户/最终用户的协作努力,使需求和解决方案不断演化发展的方法,它倡导适应式规划、演化式发展、尽早交付和持续改进,同时鼓励快速应变和灵活反应。实际上,迭代增量开发可追溯到1957年~\cite{larman2003iterative},而演化式项目管理~\cite{gilb1981evolutionary}和自适应软件开发~\cite{edmonds1974process}也早在70年代就已经出现。他们都早于敏捷宣言,并都被包含进敏捷软件开发方法。
|
||||
|
||||
\subsection{软件质量保障}
|
||||
软件是一种人工制品,需要有相应的软件质量保障(Software Quality Assurance, SQA)机制,包括监控软件工程过程以确保质量。软件质量保障涵盖整个软件开发过程,包括需求定义、软件设计、编码、源代码控制、代码审查、软件配置管理、测试、发布管理和产品集成等。
|
||||
软件是一种人工制品,需要有相应的质量保障(Software Quality Assurance, SQA)机制,包括监控软件工程过程以确保质量。软件质量保障涵盖整个软件开发过程,包括需求定义、软件设计、编码、源代码控制、代码审查、软件配置管理、测试、发布管理和产品集成等。
|
||||
|
||||
\subsubsection{软件质量体系}
|
||||
软件质量是反映软件系统或产品满足明确或隐含需求能力的特性的总和。有四个方面的含义: 其一,能满足给定需要的特性的全体;其二,具有所期望的各种属性的组合的程度;其三,用户觉得能满足其综合期望的程度;其四,软件的组合特性,它确定软件在使用中将满足顾客预期要求的程度。软件质量常常用下列特性来评价:
|
||||
|
@ -168,12 +168,12 @@
|
|||
\item 易移植性:软件产品从一种环境迁移到另外一种环境的能力。
|
||||
\end{itemize}
|
||||
|
||||
Boehm等人于1976年提出了定量评价软件质量的概念,提出了60个质量度量公式,首次提出了软件质量度量的层次模型。1978年Walters和McCall提出了从软件质量要素、准则到度量的三层次式的软件质量度量模型,将质量要素降到11个。国际标准化组织于1985年建议的质量度量模型是:高层——软件质量需求评价准则;中层——软件质量设计评价准则;低层——软件质量度量评价准则的三层次模型。高层
|
||||
软件质量度量是用于确定软件系统或产品头屑特性的定量尺度,Boehm等人于1976年提出了定量评价软件质量的概念,提出了60个质量度量公式,首次提出了软件质量度量的层次模型。1978年Walters和McCall提出了从软件质量要素、准则到度量的三层式软件质量度量模型,将质量要素降到11个。
|
||||
|
||||
\subsubsection{软件质量标准}
|
||||
国际标准化组织(ISO)和国际电工委员会(IEC)于1991年提出了标准,给出了6个特性和21个子特性;又于2001年再次修订了标准,建立了软件产品质量的两部分模型:(1)内部质量(软件产品在特定条件下使用时,软件产品的一组静态属性满足明确和隐含需要的能力)和外部质量(系统在特定条件下使用时,软件产品使得系统的行为能满足明确和隐含需要的能力),(2)使用质量(在特定的使用周境中,软件产品使得特定用户在达到有效性、生产率、安全性和满意度等方面的特定目标的能力)。
|
||||
国际标准化组织于1985年建议的质量度量模型分为三层:高层——软件质量需求评价准则;中层——软件质量设计评价准则;低层——软件质量度量评价准则。在1991年,国际标准化组织(ISO)和国际电工委员会(IEC)又共同提出了标准,给出了6个特性和21个子特性,于2001年再次修订标准,建立了软件产品质量的两分模型:(1)内部质量(软件产品在特定条件下使用时,软件产品的一组静态属性满足明确和隐含需要的能力)和外部质量(系统在特定条件下使用时,软件产品使得系统的行为能满足明确和隐含需要的能力);(2)使用质量(在特定的使用场景中,软件产品使得特定用户在达到有效性、生产率、安全性和满意度等方面的特定目标的能力)。
|
||||
|
||||
已经存在一系列标准用于监控和评估软件生产过程过程,以支持软件质量的提升,如,ISO/IEC 15504\footnote{https://www.iso.org/standard/38932.html},其第一个版本专注于软件开发过程,后来扩展到涵盖软件业务中的所有相关流程,例如项目管理,配置管理,质量保障等,是成熟度模型的参考模型,评估者可以根据模型在评估期间收集证据,全面确定所开发产品(软件,系统和IT服务)的能力。其更新版本是ISO/IEC 33000\footnote{https://www.iso.org/standard/54175.html}。其它质量标准还包括ISO/IEC 25000\footnote{https://www.iso.org/standard/64764.html}、ISO/IEC/IEEE 29119\footnote{https://www.iso.org/standard/45142.html}等。
|
||||
还有一系列标准用于监控和评估软件生产过程过程,以支持软件质量的提升,如,ISO/IEC 15504\footnote{https://www.iso.org/standard/38932.html},其第一个版本专注于软件开发过程,后来扩展到涵盖软件业务中的所有相关流程,例如项目管理,配置管理,质量保障等,是成熟度模型的参考模型,评估者可以根据模型在评估期间收集证据,全面确定所开发产品(软件,系统和IT服务)的能力。其更新版本是ISO/IEC 33000\footnote{https://www.iso.org/standard/54175.html}。其它质量标准还包括ISO/IEC 25000\footnote{https://www.iso.org/standard/64764.html}、ISO/IEC/IEEE 29119\footnote{https://www.iso.org/standard/45142.html}等。
|
||||
|
||||
\subsubsection{形式化规约和验证}
|
||||
除了采用工程方法来组织、管理软件的开发过程,并根据标准检验过程的正确性外。还有一类工作就是深入探讨程序和程序开发过程的规律,建立严密的理论,以其用来指导软件开发实践,这类工作推动了形式化方法的深入研究,其目标是以严格的数学推演为基础,通过对系统的形式规约、验证和逐步精化来构造并实现软件,从而提高软件设计的可靠性和鲁棒性。通过对系统的形式规约、验证和逐步精化来构造并实现软件。其中,形式规约是使用形式语言构建所开发的软件系统的规约,对应软件生命周期不同阶段的制品,刻画系统不同抽象层次的模型和性质。形式化开发就是构造并证明形式规约之间的等价转换和精化关系,以系统的形式模型为指导,通过逐步精化,最后开发出满足需要的系统,也称为构造的正确性(Correct by Construction)。
|
||||
|
@ -184,7 +184,13 @@
|
|||
软件测试通过人工或自动的方式运行被测试的软件,检验其运行结果或行为是否与预期相符,其目的是发现软件中潜在的错误和问题。测试应当经过设计,并在测试用例的驱动下进行。测试用例一般包括输入、环境配置、测试步骤和期望输出。软件测试可以在不同层次上进行,包括单元测试\index{单元测试}、集成测试\index{集成测试}、系统测试\index{系统测试}和验收测试\index{验收测试}。此外,在软件进行修改后为确认修改未引入新的错误还需要重新运行相关的测试用例,即进行回归测试\index{回归测试}。软件测试的基本过程包括测试计划、测试用例设计、测试执行、测试结果分析等步骤。其中,测试用例设计是关键,一方面要确保对软件运行过程中的各种可能性有较高的覆盖度,另一方面要限制测试用例数量以节省测试时间和成本。相应的测试用例设计方法主要包括白盒测试\index{白盒测试}和黑盒测试\index{黑盒测试}两类,同时与各种测试用例选取和排序等辅助技术相结合。为了缩短测试时间、节省测试成本,自动化测试技术受到了很大关注,包括自动化的测试用例生成、执行和结果分析。
|
||||
|
||||
\subsection{软件工程工具}
|
||||
软件工程工具是辅助软件开发人员、运维人员、管理人员等不同参与者参与软件开发活动的各类软件产品的总称。软件工程工具从早期的编程工具、软件过程管理工具以及软件度量工具,逐步发展为服务于软件全生命周期的整套工具链,并且在不同的软件工程环节存在多种可供选择的工具产品。丰富的软件工程工具为软件开发人员提供了更加高效便捷的开发方法和能力。面向软件工程过程不同环节的软件工程工具,促进了软件工程的领域细分。不同的软件工程工具对工具使用者的不同技能要求,使软件工程技能培训和学习更加细化和专业化。根据软件工程工具所服务的人员角色不同,可将软件工程工具分为软件开发工具、软件运维工具、软件开发管理工具等。
|
||||
软件工程工具,或软件工具,是用来辅助计算机软件的开发、运行、维护、管理、支持等过程中活动或任务的一类软件。早期的软件开发所用到的引导程序、装入程序、编辑程序等都可以看作是最早的软件工具。在汇编语言和高级程序设计语言出现以后,汇编程序、解释程序、编译程序、连接程序和排错程序构成了早期的软件工具集。在软件工程出现后,支持软件需求分析、设计、编码、测试、维护和管理等活动的软件工具逐渐发展起来,从各个阶段支持着软件开发过程,并且自然而然出现了工具集成的需要,使得各个工具能够协同操作。
|
||||
|
||||
软件开发环境由软件工具和环境集成机制构成,是支持软件产品开发的软件系统~\cite{张效祥2005计算机科学技术百科全书}。软件开发环境在工具集成的需求中开始萌芽,上世纪70年代中后期出现了软件工具箱(Toolkit)的思想,在软件开发过程中使用成套的多个软件工具。80年代起,出现了支持图形设计方式的第二代软件工具和集成这些工具为一体的软件开发环境,采用环境信息库,支持软件开发模型和开发方法,并且集成机制有了较大发展。90年代开始出现支持面向对象方法和技术的软件开发环境。我国“七五”“八五”科技攻关中研制的\index{青鸟软件开发环境},是当时先进的软件开发环境,具有较为完善的集成化软件开发支撑能力。
|
||||
|
||||
21世纪以来,随着互联网和移动通信的普及,软件工具和软件开发环境的用途和种类进一步拓展,出现了支持软件国际化、软件开发协同工作、开源软件库和开源社区环境以及支持互联网、物联网和云计算的基础软件和应用测试支撑工具。软件开发环境不仅支持时间上的松耦合开发,还支持空间上的分布开发,并且开始以协同开发思想为基础,更强调多相关方、多工具、多活动的协同开发支撑,使得软件产品相关的所有利益相关方能在互动的软件开发协作过程中,实现包括需求管理、项目管理、软件部署和运行监控等活动在内的完整的软件生存周期过程支撑。
|
||||
|
||||
随着软件形态的演化和软件开发方法的发展,软件工具和软件开发环境正在功能智能化、网络化、服务化方向发展,并且对软件开发过程的可视化管理和定量分析优化提供支持。
|
||||
|
||||
\subsubsection{软件开发工具}
|
||||
早期的软件开发工具仅限于汇编器和编译器。20世纪五六十年代,随着Fortran、Basic等高级语言的出现,计算机程序逐步脱离了面向特定硬件系统的束缚,更加接近于自然语言而易于开发人员书写。开发人员使用文本编辑工具编写代码后,使用代码解释或编译工具将源代码转换为操作系统可以识别的代码,进而实现预期的程序行为。广义上来说,文本编辑器、汇编器、编译器都可以看作最原始的软件开发工具。
|
||||
|
@ -201,12 +207,6 @@
|
|||
|
||||
\end{itemize}
|
||||
|
||||
单一的软件开发工具很多时候由于缺少必要的上下文信息或与其他工具的联系而很难使用。因此,基于多种软件开发工具形成的集成开发环境(IDE)\index{集成开发环境(IDE)}逐渐发展起来。20世纪80年代,通用编程语言Ada带有自己的编程支持环境APSE,提供了编辑界面、编译器、测试器、连接加载器等功能模块,将集成开发环境提升到一个新的阶段。此后,微软(Microsoft)、宝蓝(Borland)等软件公司相继开发出各自的开发环境用于支持相应编程语言的开发与调试。
|
||||
|
||||
IDE的出现为软件开发人员在开发过程中集中完成软件开发任务提供了统一的环境,也为后续进一步扩展新的软件工程工具奠定了基础。例如,1987年宝蓝公司推出的Turbo C开发环境,在字符界面上提供了灵活的代码编写和调试环境,使得开发人员能够一站式完成程序编写、测试和调试。1991年为了适应微软公司的视窗(Windows)操作系统界面风格,宝蓝公司又推出Borland C++,并在90年代后期推出Borland C++ Builder提升了集成开发环境的易用性和代码编译链接的效率。在这个工具的升级过程中,不仅需要适应C/C++语言标准的变化、操作系统的变化,还考虑了开发人员的易用性需求,通过可视化的窗体设计器、对象观察器等可视化元素加入到开发环境中,推出了VCL构件库,引领了快速应用程序开发(RAD)开发方法,大大降低了开发Windows应用程序的难度。
|
||||
|
||||
开放式架构的开源集成开发环境以插件的形式提供各类辅助支持,包括在开发环境中提供各类代码静态扫描功能、代码重构功能、代码自动补全和框架自动生成功能等,大大扩展了集成开发环境的能力范围,使之能服务于不同的开发过程活动。例如最初由IBM公司主导开发的Eclipse在2001年开源转入非盈利组织Eclipse基金会管理后,开源社区的大量开发者为其开发了众多实用的功能,进而衍生出了MyEclipse、IBM Rational Software Architect等多种工具软件,服务于不同层次和复杂程度的开发需求。
|
||||
|
||||
\subsubsection{软件运维工具}
|
||||
软件的运行和维护是软件交付后的必要环节。在以桌面应用为主的上世纪90年代以前,软件产品要么以商业成品(Commercial-off-the-shelf)形式提供给最终用户,要么以商用服务项目的形式在客户现场(On-site)提供支持。此时,软件的运维主要是软件日志的收集与分析。通常只能通过现场日志的分析获知软件的可能问题,进而在开发环境中进一步测试、验证、修改软件以修复相关问题。在这种模式下,软件运维工具往往并不受重视,并且通常是融合在软件开发工具中的,即需要通过软件开发过程中写入必要的日志信息,才能实现必要的运行维护工作。随着互联网应用和应用的服务化进程的开启,21世纪以来,服务化和云化的软件使得软件运维从客户端现场支持逐步转向后端、云端。此时的软件运行具有在线动态地特性,不仅需要运行时的日志记录与分析,还需要能快速响应特定的运行问题,并快速给出维护方案、上线修复的软件产品。软件运维从简单的运行日志分析和调错,逐步向实时监控、快速响应的反向发展,这也带来了开发运维一体化(DevOps)\index{开发运维一体化(DevOps)}的兴起。由此,软件运维工具范围迅速扩大,形成了涵盖开发、构建、测试、集成及交付、容器平台等个子领域的工具集。例如自动化构建是持续集成的重要支撑,支持持续集成的工具包括开源工具Jenkins、商用工具Bamboo以及商用开源版本并存的Travis等。这些工具的特性分别适应特定的应用群体或用户,运维人员可实现多种运维工具的按需选择。
|
||||
|
||||
|
@ -272,5 +272,6 @@
|
|||
|
||||
\section{结束语}
|
||||
|
||||
随着信息技术的飞速发展,软件系统无处不在,其应用形态呈现出泛在化、社会化、情境化、智能化等特征,软件正逐步成为人类社会不可或缺的基础设施。软件工程方法和技术的进步支撑了整个的软件应用的展开,体现在软件系统的规模越来越大,所解决的问题越来越复杂、交互对象越来越多样,人们寄予越来越高的可靠性要求。现在,人机物融合应用模式的不断深入,“泛在系统”和“软件定义”也成为呼之欲出的着力点。这既孕育了软件工程学科的新的增长点,也给软件工程方法和技术带来了新的挑战,需要有新的软件工程方法和技术支撑。
|
||||
|
||||
综观软件工程的起源和发展,可以发现,软件成为独立存在的人工制品,因此需要一种系统化的方法以及相应的技术,第一使得这种人工制品的功能能满足应用需求,第二使得其开发和生产能高效地完成,第三能提供手段以保证其质量。因此软件工程的发展总是围绕需求、软件方法学和软件开发技术、以及软件质量体系和保障等几个方面展开,这形成了软件工程学科的内涵。
|
||||
但是,软件又和其它人工制品不同,它在需求和表现形式上具有极大变化性,它承载在看上去非常容易修改的代码上,随着软件和物理设备以及人的越来越深度的融合,通过软件作为核心支撑来解决的问题也越来越复杂。这也使得软件工程方法和技术不断面临新的挑战,面对的问题(需求)越来越复杂、软件操作的交互对象越来越多样,人们寄予越来越高的可靠性等等,这些是软件工程方法和技术发展的原动力。
|
||||
|
||||
|
|
|
@ -1,48 +1,58 @@
|
|||
% !TEX root = main.tex
|
||||
|
||||
\section*{总论}
|
||||
软件承载着文明\footnote{“Our civilization runs on software.” —C++之父Bjarne Stroustrup.}。时至今日,软件定义一切和“人-机-物”三元融合\footnote{这里所谓人是指系统中的人类参与者及其社会关系,机是指计算平台和信息空间的数据、软件服务等各种资源,物是指数字化的设备装置和可传感的物品。或曰“信息-物理-社会”三元融合系统。}的发展趋势使得软件成为信息社会的基础设施。软件科学与工程学科已进入一个新的阶段,其发展日新月异,重要性日益凸显。在本书上篇回顾软件学科发展历程、梳理发展脉络、总结发展规律的基础上,本篇各章讨论在人机物融合的时代背景下,面向软件作为基础设施的时代要求,软件科学与工程学科的发展趋势、关键挑战与潜在突破,为下篇给出学科发展政策建议提供依据。
|
||||
%软件承载着文明\footnote{“Our civilization runs on software.” —C++之父Bjarne Stroustrup.}。
|
||||
|
||||
软件是以计算为核心手段实现应用目标的解决方案。软件学科是研究以软件求解应用问题的理论、原则、方法和技术,以及相应的工具支持和生态环境的学科。也就是说,软件学科本质上是一门方法论学科~\cite{Wirth:2008:BHS:1449571.1449577}。其带来的是一种人类思维的创新,以人机共融的方式延伸了单纯人脑思维,形成了一种前所未有的创造力。随着软件应用范围的扩张、软件计算平台的泛化和软件方法技术的发展,软件学科的边界不断拓展,内涵不断深化。本章总论“软件作为基础设施”这一发展趋势,进而以系统观、形态观、价值观和生态观四个视角探讨软件学科的方法论新内涵。
|
||||
%\footnote{这里所谓人是指系统中的人类参与者及其社会关系,机是指计算平台和信息空间的数据、软件服务等各种资源,物是指数字化的设备装置和可传感的物品。或曰“信息-物理-社会”三元融合系统。}
|
||||
|
||||
软件学科历史回顾和发展规律论证了:软件是以计算为核心手段实现应用目标的解决方案;软件学科是研究以软件求解应用问题的理论、原则、方法和技术,以及相应的工具支持和生态环境的学科。也就是说,软件学科本质上是一门方法论学科~\cite{Wirth:2008:BHS:1449571.1449577}。其带来的是一种人类思维的创新,以人机共融的方式延伸了单纯人脑思维,形成了一种前所未有的创造力。随着软件应用范围的扩张、软件计算平台的泛化和软件方法技术的发展,软件学科的边界不断拓展,内涵不断深化。本章总论“软件作为基础设施”这一发展趋势,进而以系统观、形态观、价值观和生态观四个视角探讨软件学科的方法论新内涵。
|
||||
|
||||
\section{软件作为基础设施}
|
||||
从人类社会信息化的角度看,软件的基础设施地位具体表现为四个方面。首先,一大批基础软件作为信息基础设施,支撑着各种应用软件的运行。其次,一大批嵌入式软件已成为掌控并支撑物理基础设施运行的关键系统。第三,一大批应用软件及其所提供的服务已成为信息社会不可或缺的基础资源与设施。最后,从软件产业整体的角度看,随着传播和互联的渗透发展,计算成为了人类与物理世界互动的中介,软件成为了创造新文明的载体,大规模、高效率地生产高质量的软件产品和提供软件服务的能力已成为社会经济升级发展的新动能,构成国家的一种核心竞争力。
|
||||
|
||||
从人类社会信息化的角度看,软件的基础设施地位具体表现为两个方面。一方面,软件自身已成为信息技术应用基础设施的重要构成成分,以平台方式为各类信息技术应用和服务提供基础性能力和运行支撑。另一方面,软件正在 “融入”到支撑整个人类经济社会运行的“基础设施”中,特别是随着以互联网和其他网络(包括电信网、移动网、物联网等)的不断交汇融合,软件正在对传统物理世界基础设施和社会经济基础设施进行重塑和重构,通过软件定义的方式赋予其新的能力和灵活性,成为促进生产方式升级、生产关系变革、产业升级、新兴产业和价值链的诞生与发展的重要引擎。因而,计算成为了人类与物理世界互动的中介,软件成为了创造新文明的载体,软件“赋能、赋值”的作用正在被加速和加倍放大,对人类社会的运行和人类文明的发展进步起到重要支撑作用。大规模、高效率地生产高质量的软件产品和提供软件服务的能力已成为社会经济升级发展的新动能,构成国家的一种核心竞争力。
|
||||
|
||||
软件成为人类社会基础设施是社会信息化进程不断加深的必然结果,其技术基础是“计算的泛在化”和“软件定义一切”。
|
||||
|
||||
“计算的泛在化”是指计算变得无处不在而又无迹可寻。万物数字化、万物互联使得计算无处不在。网络化计算平台迅速拓展到无处不在的各类智能化设备和可传感物体,深入到人类社会生活的方方面面,形成了“人-机-物”三元融合的发展趋势。计算设备、网络设备、存储设备与各类传感器设备、判断设备、决策设备、作动设备所形成的数量众多、大大小小的平台已经互联融合,成为一体。与此同时,对于所服务的用户而言,计算自然融入人类生产、生活活动环境和过程之中,无需关注,不着痕迹。
|
||||
“计算的泛在化”是指计算变得无处不在而又无迹可寻。互联网和其他网络(包括电信网、移动网、物联网等)的交汇融合,进一步推动了人类社会、信息空间、物理世界的融合。计算设备、网络设备、存储设备与各类传感器设备、判断设备、决策设备、作动设备所形成的数量众多、大大小小的平台互联融合,成为一体;与此同时,对于所服务的用户而言,计算自然融入人类生产、生活活动环境和过程之中,无需关注,不着痕迹,形成新的人机物融合计算环境。人机物融合标志着我们从终端互联、用户互联、应用互联开始走向万物互联,信息技术及其应用更加无处不在,“大数据”现象随之产生,信息化的第三波浪潮正在开启。
|
||||
|
||||
“软件定义”是指软件以平台化的方式,向下管理各种资源,向上提供编程接口,其核心途径是资源虚拟化以及功能可编程。“软件定义一切”则将软件平台所管理的资源和提供的编程抽象泛化到包括计算、存储、网络、软件服务等在内的各类计算资源、包括各种数字化机电设备和可传感物体对象在内的各类物理资源、乃至可通过激励机制调配的人力资源。软件定义可递归分层,形成一种生长式、演化式的可扩展体系。这种软件定义的人机物融合平台逐渐呈现了“泛在操作系统”的发展方向。
|
||||
“软件定义”是指软件以平台化的方式,向下管理各种资源,向上提供编程接口,其核心途径是资源虚拟化以及功能可编程。需要注意的是,“软件定义”与“软件化”是不同的两个概念。“软件化”仅仅描述了根据业务需求来开发具有相应功能的软件应用系统的过程;而“软件定义”则是一种技术手段,其关注点在于将底层基础设施资源进行虚拟化并开放API,通过可编程的方式实现灵活可定制的资源管理,适应上层业务系统的需求和变化。“软件定义一切”则将软件平台所管理的资源和提供的编程抽象泛化到包括计算、存储、网络、软件服务等在内的各类计算资源、包括各种数字化机电设备和可传感物体对象在内的各类物理资源、乃至可通过激励机制调配的人力资源。软件定义可递归分层,形成一种生长式、演化式的可扩展体系。这种软件定义的人机物融合平台逐渐呈现了“泛在操作系统”的发展方向。
|
||||
|
||||
“软件定义一切”实质上是通用可编程思想在各个领域的应用,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。数字化使得几乎所有的设备都包含了独立或者集成的计算设备,完成“感知、判断、控制、作动”闭环的部分或者全部。这个改变是信息化发展的基础,使得现代设备或装置往往都具备编程控制的能力,推动了人们基于通用计算机的思维架构(人们将其总结成计算思维)来理解和求解各领域问题,而通用计算机的软件则定义了问题的求解过程。因此,软件将并正在定义一切。
|
||||
“软件定义一切”实质上是通用可编程思想在各个领域的应用,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。数字化使得几乎所有的设备都包含了独立或者集成的计算设备,完成“感知、判断、控制、作动”闭环的部分或者全部。这个改变是信息化发展的基础,使得现代设备或装置往往都具备编程控制的能力,推动了人们基于通用计算机的思维架构(人们将其总结成计算思维)来理解和求解各领域问题。可见,“软件定义一切”(SDX)意味着构造针对“X”的“操作系统”。未来的面向人机物融合的软件平台,就是对海量异构基础设施资源进行按需、深度软件定义而形成的“泛在”操作系统(Ubiquitous Operating System)。
|
||||
|
||||
\section{软件学科范畴的拓展}
|
||||
|
||||
作为一门方法论学科,软件学科拓展的驱动力来自软件应用范围扩张、计算平台的泛化和软件方法技术本身发展三个方面。
|
||||
|
||||
从软件应用范围扩张的角度看,正如上文所述,计算日益变得无处不在,“人-机-物”三元融合不断深入。在此趋势下,从宏观上看,软件从实现计算的工具逐步转变为信息社会不可或缺的基础设施;从微观上看,软件的角色也从负责应用过程中孤立、确定的信息处理环节,转变为负责定义并协同整个应用涉及的“人-机-物”各类资源,实现应用价值。软件作为系统解决方案,涉及的范畴扩展到各类物理设备、物品和人类的主观体验与价值实现;因而软件学科无可避免地涉及到控制科学、系统科学以及心理学、管理学、社会学等范畴的问题,并以软件学科自身的方法论将其内化和拓展。
|
||||
|
||||
从软件依赖的计算平台泛化的角度看,计算平台已经从传统的集中式单机发展到并行与分布式平台,再到今天的“云-边-端”异构多态计算平台。这个网络化计算平台不仅包括传统的互联网,还融合了传感网、物联网、移动互联网、社交网等,标志着计算平台不断向物理世界和人类社会快速延伸,形成了一种泛化的计算平台。软件定义技术为这个“人-机-物”融合的平台提供可编程计算抽象。同时,这个计算平台也使得海量的有关于“人-机-物”融合的应用场景数据不断被收集、处理和积累,成为平台上的重要资源。软件作为应用解决方案,在这个计算平台之上利用数据资源,协同人机物,实现应用价值;同时也通过在这个平台上提供服务,并进一步积累数据,从而不断拓展这个计算平台。
|
||||
从软件依赖的计算平台泛化的角度看,计算平台已经从传统的集中式单机发展到并行与分布式平台,再到今天的“云-边-端”异构多态计算平台。这个网络化计算平台不仅包括传统的互联网,还融合了传感网、物联网、移动互联网、社交网等,标志着计算平台不断向物理世界和人类社会快速延伸,形成了一种泛化的计算平台。软件定义技术为这个“人-机-物”融合的平台提供可编程计算抽象。同时,这个计算平台也使得关于“人-机-物”融合的应用场景的海量数据不断被收集、处理和积累,成为平台上的重要资源。软件作为应用解决方案,在这个计算平台之上利用数据资源,协同人机物,实现应用价值;同时也通过在这个平台上提供服务,并进一步积累数据,从而不断拓展这个计算平台。
|
||||
|
||||
从软件方法技术发展的角度看,当前软件的基本形态、所实现的逻辑推理形式、软件开发的隐喻(metaphor)模式、软件的生态环境、元级方法论都在发生深刻的改变。软件的基本形态从计算机硬件的附属品到独立的软件产品,再到云化的软件服务,继而转变为无处不在而又无迹可寻的泛在服务。软件所实现的逻辑推理形式在基于规则的演绎之上发展出数据驱动的归纳,统计机器学习技术就是后者的典型表现。软件开发的隐喻模式经历了从实现数学计算到模拟物理世界,再到虚实融合创造的转变。对软件作为客体对象的考察从以个体及其生产使用为主扩展到在生态的层面上考虑软件及其利益相关者群体的竞争、协作等社会性特征。在元级方法论层面,正从以还原论为主向系统论发展,软件作为解决方案越来越多地被视为开放环境中的复杂适应系统,而不是封闭规约下的确定行为系统。
|
||||
|
||||
随着软件学科的不断拓展,它也逐渐成为一门基础学科,并向其他学科渗透。所谓基础学科,是指某个拓展人类可认识改造的世界疆域之不可替代知识体系,具有独特的思维方式与方法论,为其他学科发展提供不可或缺的支撑。其一个标志是其基础内容进入国民基础教育课程体系。软件学科日益呈现出这些特征:软件是把物理世界拓展为信息-物理-社会融合世界的主要手段;与此同时,“软件定义”赋能的计算思维有可能成为继实验观察、理论推导、计算仿真、数据密集型科学之后的新的研究手段,尤其是为以信息-物理-社会融合系统为对象的科学研究提供赖以运作的理论基础和实践规范。而以软件知识为主体的计算机教育已经成为包括我国在内的多个国家的国民基础教育课程体系的主要内容之一。
|
||||
随着软件学科的不断拓展,它也逐渐成为一门基础学科,并向其他学科渗透。所谓基础学科,是指某个拓展人类可认识改造的世界疆域之不可替代知识体系,具有独特的思维方式与方法论,为其他学科发展提供不可或缺的支撑。软件学科日益呈现出这些特征:软件是把物理世界拓展为信息-物理-社会融合世界的主要手段;与此同时,“软件定义”赋能的计算思维有可能成为继实验观察、理论推导、计算仿真、数据密集型科学之后的新的研究手段,尤其是为以信息-物理-社会融合系统为对象的科学研究提供赖以运作的理论基础和实践规范。而以软件知识为主体的计算机教育已经成为包括我国在内的多个国家的国民基础教育课程体系的主要内容之一。
|
||||
%其一个标志是其基础内容进入国民基础教育课程体系。
|
||||
|
||||
\section{软件科学的新理解}
|
||||
一般而言,驾驭系统固有复杂性的基本途径是有效抽象和层次分解。与其他人工制品不同,软件是纯粹的逻辑产品,原则上只受能行可计算的限制,可以实现最纯粹的抽象,也可以支持最具扩展性的层次分解。回顾软件学科的发展,贯穿始终的主题是以软件范型(建立抽象)为轴心,系统软件(实现抽象)和软件工程(使用抽象)相互促进、螺旋上升的过程。由于软件在应对复杂性方面具有独特优势,软件成为了各类复杂应用系统的“万能集成器”,也成为了人类构造的最复杂的各类系统的核心。另一方面,正因为此,软件而使得万物互联,其所形成的系统的复杂性往往集中体现为软件的复杂性。
|
||||
|
||||
一般而言,驾驭系统固有复杂性的基本途径是有效抽象和层次分解。与其他人工制品不同,软件是纯粹的逻辑产品,原则上只受能行可计算的限制,可以实现最纯粹的抽象,也可以支持最具扩展性的层次分解。回顾软件学科的发展,贯穿始终的主题是围绕建立抽象、实现抽象和使用抽象,以软件范型基础,软件构造方法、软件运行支撑、软件度量和质量评估相互促进、螺旋上升的过程。由于软件在应对复杂性方面具有独特优势,软件成为了各类复杂应用系统的“万能集成器”,也成为了各类人造复杂系统的核心,并且这些系统的复杂性往往集中体现为软件的复杂性。
|
||||
|
||||
在软件作为基础设施、软件定义一切的背景下,软件进一步成为构造开放环境下复杂系统的关键。在展望软件学科在新时代所面临的挑战与机遇之前,我们首先在元级方法学,也就是研究方法学的层面上讨论观察软件学科内涵的若干新视角,包括以驾驭复杂性为目标的系统观、以泛在服务和持续演化为特征的形态观、以使用质量为核心的价值观、以及关注群体协作平衡的生态观。
|
||||
|
||||
\subsection{系统观}
|
||||
|
||||
所谓软件学科的系统观,有三层含义。
|
||||
|
||||
第一层含义是系统工程。也就是说,软件学科的关注点应从为应用系统提供高质量的软件部件,上升到关注“人-机-物”整个系统的价值实现。软件定义一切的趋势使得软件不仅仅是系统中的信息处理工具,也是管理各类资源、融合人机物的“万能集成器”,是实现应用价值的整体解决方案。
|
||||
第一层含义是复杂系统。现代软件系统的复杂性体现在其前所未有的代码规模、软件处理的数据量、软件用户量和使用的多样性、软件通过网络形成的连接量和种类、涉及承载运行的计算和物理设备量和种类等方面,也体现在其所处环境的开放性和由于“人在回路”所带来的不确定性。这使得看待软件的视角从封闭静态环境下的确定行为系统向开放动态环境中的可适应、可成长的系统、从单体系统向系统之系统转变。
|
||||
|
||||
第二层含义是复杂系统。现代软件系统的复杂性体现在其前所未有的代码规模、软件处理的数据量、软件用户量和使用的多样性、软件通过网络形成的连接量和种类、涉及承载运行的计算和物理设备量和种类等方面,也体现在其所处环境的开放性和由于“人在回路”所带来的不确定性。这使得看待软件的视角从封闭规约下的确定行为系统向开放环境中的复杂自适应系统、从单体系统向系统之系统转变。
|
||||
第二层含义是系统论。对于上述复杂软件系统,常常难以用其组成部件的性质去解释其整体性质。此时单纯依赖还原论方法难以驾驭其复杂性,需要借鉴系统论方法,超越还原论。
|
||||
|
||||
第三层含义是系统工程。软件学科的关注点应从为应用系统提供高质量的软件部件,上升到关注“人-机-物”融合的整个系统的价值实现。软件定义一切的趋势使得软件不仅仅是系统中的信息处理工具,也是管理各类资源、融合人机物的“万能集成器”,是实现应用价值的整体解决方案。
|
||||
|
||||
第三层含义是系统论。对于上述复杂软件系统,常常难以用其组成部件的性质去解释其整体性质。此时单纯依赖还原论方法难以驾驭其复杂性,需要借鉴系统论方法。
|
||||
\subsubsection{系统观下的软件学科发展}
|
||||
软件作为人类智力产品,无论是软件制品本身,还是软件开发、使用过程和场景都与万物和人类有着紧密关联,其开发和运行的网络化(网构软件的实践),以及软件基础设施化、服务化都触发了软件生产方式、计算平台和运行方式的变革。软件创新从个人、组织智慧发展到群体智慧创新。软件科学与自然科学、社会科学等各领域产生了千丝万缕的联系,信息物理融合、软件社会化、大数据时代的软件新形态使得软件必然成为技术-社会系统(Socio-technical System)。人机物融合的软件系统,其复杂性本身就呈现在系统乃至系统之系统的层面上,综合性和系统性也愈来愈强。系统观要求软件科学体系需超越传统还原论的思维藩篱。
|
||||
|
||||
近年来,软件科学在系统观方向上进行了不少探索,包括:基于复杂网络来认识大规模软件系统的整体性质、基于多自主体的软件系统和方法、复杂自适应软件与系统、群体化软件开发方法等。网络化和大数据催发了融合软件系统与系统论研究的切入点,数据驱动的软件设计和优化初显端倪,在一些特定领域获得很大成功。人们对于数据驱动的软件的设计,不再遵循传统的自顶向下、分而治之、逐步精化的经典还原论法则,而是采用一种基于输入输出的黑盒的数据描述,训练出深度神经网络,充当所需要的软件。这种基于深度学习的方法从海量的样本中归纳出神经网络,其泛化能力可视为通过神经元系统的涌现而达成的功能。然而,这些研究仍处于方法层次,还未到达方法论的层次,即关于研究问题需要遵循的途径和研究路线,也可视作具体方法的元级层次。
|
||||
软件作为人类智力产品,无论是软件制品本身,还是软件开发、使用过程和场景都与万物和人类有着紧密关联,其开发和运行的网络化、服务化\cite{cite网构软件书},以及软件基础设施化都触发了软件生产方式、计算平台和运行方式的变革。软件创新从个人、组织智慧发展到群体智慧创新。软件科学与自然科学、社会科学等各领域产生了千丝万缕的联系,信息物理融合、软件社会化、大数据时代的软件新形态使得软件必然成为技术-社会系统(Socio-technical System)。人机物融合的软件系统,其复杂性本身就呈现在系统乃至系统之系统的层面上,综合性和系统性也愈来愈强。系统观要求软件科学体系需超越传统还原论的思维藩篱。
|
||||
|
||||
近年来,软件科学在系统观方向上进行了不少探索,包括:基于复杂网络来认识大规模软件系统的整体性质、基于多自主体的软件系统和方法、复杂自适应软件与系统、群体化软件开发方法等。网络化和大数据催发了融合软件系统与系统论研究的切入点,数据驱动的软件性能优化甚至软件设计初显端倪。通过对软件代码大数据特别是动态运行大数据的分析,软件性能优化在云计算平台等一些特定场景获得很大成功。对于数据驱动的软件设计,人们不再遵循传统的自顶向下、分而治之、逐步精化的经典还原论法则,而是采用一种基于输入输出的黑盒的数据描述,训练出深度神经网络,充当所需要的软件。这种基于深度学习的方法从海量的样本中归纳出神经网络,其泛化能力可视为通过神经元系统的涌现而达成的功能。然而,这些研究仍处于方法层次,还未到达方法论的层次,即关于研究问题需要遵循的途径和研究路线,也可视作具体方法的元级层次。
|
||||
|
||||
新的软件方法学的关键在于如何认识因果和相关。因果观是有前提的,相对的;相关性是绝对的。软件发展在人机物融合时代,人在回路、“拟人化”计算(Human Computation)、人机共融等需要关于软件规律的元级方法论创新。
|
||||
|
||||
|
@ -50,43 +60,65 @@
|
|||
|
||||
在软件系统的机理方面,软件的语义将由传统的还原论形式语义方法,向多尺度、可演化的抽象方向发展,组合方式将从传统的静态组合方式向动态可演化的、具有涌现特性的方式发展,建立软件微观行为与宏观行为的辩证统一。面向人机物融合的认知,软件作为人工智能或者“智能+”的承载,将深化复杂自主系统的智能行为理论和方法,软件定义将成为人机物融合系统中学习赋能(型)资源的管理途径。
|
||||
|
||||
软件科学的发展也将促进系统论和系统学的发展。在软件定义一切的时代,软件成为复杂适应系统认知的载体和实验平台,而软件发展中形成的以形式化体系为基础的规则驱动软件理论,高性能计算之上建立的模拟仿真技术,与进入智能化阶段形成的大数据驱动的软件方法,为形成还原论和整体论的辩证统一奠定了良好的基础,软件走向人机物融合更是为系统论和系统学的发展提供了实践探索的大场景。
|
||||
\subsubsection{系统观下软件方法学的关键科学问题}
|
||||
软件科学的发展也将促进系统论和系统学的发展。在软件定义一切的时代,软件成为复杂适应性系统认知的载体和实验平台,而软件发展中形成的以形式化体系为基础的规则驱动软件理论,高性能计算之上建立的模拟仿真技术,与进入智能化阶段形成的大数据驱动的软件方法,为形成还原论和整体论的辩证统一奠定了良好的基础,软件走向人机物融合更是为系统论和系统学的发展提供了实践探索的大场景。
|
||||
|
||||
\subsubsection{系统观下关键科学问题}
|
||||
|
||||
软件学科的系统观形成、并与系统学的交叉融合将经历一个长期的阶段。当前软件学科所面临的一个关键科学问题是对于人机物融合系统的建模与分析,表现为两个方面:一是系统论驱动的复杂软件系统的观察和度量方法;二是兼容离散、连续、实时等不同特性的模型表示方法及其工具支持。在操作层面上,系统观下软件方法学的研究有紧密联系的两个抓手:
|
||||
|
||||
\hangafter=1
|
||||
\setlength{\hangindent}{4.4em}
|
||||
(1) 以复杂自适应软件系统为抓手,形成元级反射和学习赋能相结合的元级化理论,建立泛在操作系统的技术和平台;
|
||||
\begin{enumerate}
|
||||
|
||||
\item 以复杂适应性软件系统为抓手,形成元级反射和学习赋能相结合的元级化理论,以此研究泛在操作系统的基本理论、关键技术和实现平台,为人机物融合的资源和应用场景建模提供计算的平台抽象;
|
||||
|
||||
\item 推进数据驱动软件开发方法的发展,打通经典软件方法与数据驱动软件方法的界限,突破大数据分析的可解释性和常识推理问题,为涌现现象规律的认识、解释、设计建立基础理论和方法。
|
||||
|
||||
\end{enumerate}
|
||||
|
||||
展望未来,多自主体形成的协同与自组织以及自适应结构和能力、网络化产生的大数据与数据语义的复杂网络,将是软件系统在传统规则驱动基础上走向人机物融合超大规模系统的基础。软件作为复杂系统乃至复杂巨系统,软件科学将与系统学共同发展—软件方法学将吸收系统论成果,并支撑系统论和系统学的发展。
|
||||
|
||||
\hangafter=1
|
||||
\setlength{\hangindent}{4.4em}
|
||||
(2) 推进数据驱动软件开发方法的发展,打通经典软件方法与数据驱动软件方法的界限,突破大数据分析的可解释性和常识推理问题,为涌现现象规律的认识、解释、设计建立基础理论和方法。
|
||||
|
||||
展望未来,多自主体形成的协同与自组织以及自适应结构和能力、网络化产生的大数据与数据语义的复杂网络,将是软件系统在传统规则驱动基础上走向人机物融合超大规模系统的基础。软件作为复杂系统乃至复杂巨系统,在软件定义时代,软件科学将与系统学共同发展,软件方法学将吸收系统论成果,并支撑系统论和系统学的发展。
|
||||
\subsection{形态观}
|
||||
随着计算机技术的发展和计算机应用的不断深入,软件的外在形态逐步从硬件附属物、独立的软件制品发展到网络化服务。与之相对应,软件开发范型也经历了无结构、结构化、面向对象、面向构件、面向服务的发展历程。当前,软件的外在形态正在朝着泛在化和可持续成长的方向发展:在空间维度上,软件应用的范围越来越广,对于人类生活和现实世界的渗透力越来越强,呈现出泛在化的趋势;时间维度上,软件应用随着上下文环境及用户需求的变化不断适应和演化,呈现出持续成长的趋势。与此同时,软件开发范型也进一步向网构化以及数据驱动的方向发展。
|
||||
随着计算机技术的发展和计算机应用的不断深入,软件的外在形态逐步从硬件附属物、独立的软件制品发展到网络化服务。与之相对应,软范型也经历了无结构、结构化、面向对象、面向构件、面向服务的发展历程。当前,软件范型进一步向网构化以及数据驱动的方向发展。其应用形态在空间维度上,随着软件应用的范围越来越广、对于人类生活和现实世界的渗透力越来越强,呈现出泛在化的趋势;在时间维度上,随着应用上下文环境及用户需求的变化不断适应和演化,呈现出持续成长的趋势。
|
||||
\subsubsection{软件应用的泛在化}
|
||||
计算和信息处理早已通过各种移动设备、嵌入式设备以及各种传感器渗透到了我们日常生活的方方面面,并通过各种通信技术实现了广泛的设备互连和信息互通。各种软件应用以嵌入式的方式实现预定义的信息处理和通信功能。近些年来,信息技术呈现软件定义一切的发展趋势,即软件全面接管人类社会以及物理社会中的各种资源(包括物理、计算和人力资源),以各种形式的接口对外提供服务。这一发展建立在软件的云化与服务化基础上,这使得软件的核心能力脱离了固化的用户界面和使用环境,可以按需灵活获取并组合。另一方面,硬件专用化使得运行在各种面向特定用途的硬件设备上的软件应用能够获得更好的执行效率。
|
||||
|
||||
面向最终用户的软件应用将越来越多地以人机物融合应用的形态出现,即软件以平台化、定制化和集成化的方式融合人、机、物三个方面的资源和服务从而满足用户的各种需求。这种新型的人机物融合应用具有泛在化、社会化、情境化、智能化的特点,即:软件应用无处不在同时又无迹可寻;所融合的人机物资源具备社会属性,来自于不同所有者并以社会化的方式产生价值交换;软件应用面向最终用户所处的情境按需构造,以满足即时的用户需求为目标;软件应用在智能化技术基础上,以非预设的方式按需聚合人机物资源并进行定制。
|
||||
\subsubsection{软件应用的持续成长}
|
||||
越来越多的软件都已具备面向动态变化环境的适应性和面向需求变化的演化性。软件通过监控、分析、决策、执行的反馈环路对其结构和行为进行调控,并通过不断演化来保持其有用性。快速响应变更请求并实现持续的软件演化是软件产品保持竞争优势的一个必要条件。在过去的几十年中,软件开发的主流方法已经从以瀑布模型为代表的计划驱动的方法演变为以敏捷开发为代表的快速迭代开发方法。基于云的软件应用以及软件开发平台的发展进一步催生了开发运维一体化(DevOps)的技术趋势。由此反映出软件演化中的反馈和迭代周期越来越短,演化越来越频繁。另一方面,越来越多的软件应用以服务化和云化的方式运行,在提供服务的同时持续收集用户的行为及其反馈,并在云端汇聚形成软件用户大数据。这种不断积累的用户数据为软件应用的持续优化和改进提供了新的途径。数据驱动的软件演化方式反映了用户行为已经在一定程度上取代专家成为掌握软件演化方向的主导力量。软件将逐步从被动演化转变为基于内生机制的持续生长。
|
||||
\subsubsection{新形态下的软件学科内涵}
|
||||
在软件定义一切以及人机物融合的发展背景下产生的软件应用的泛在化和持续成长的新特征对于软件学科的内涵发展将产生多个方面的影响。
|
||||
越来越多的软件都已具备面向动态变化环境的适应性和面向需求变化的演化性。软件通过监控、分析、决策、执行的元级反馈环路对其结构和行为进行调控,并通过不断演化来保持其可用性。快速响应变更请求并实现持续的软件演化是软件产品保持竞争优势的一个必要条件。在过去的几十年中,软件开发的主流方法已经从以瀑布模型为代表的计划驱动的方法演变为以敏捷开发为代表的快速迭代开发方法。基于云的软件应用以及软件开发平台的发展进一步催生了开发运维一体化(DevOps)的技术趋势。由此反映出软件演化中的反馈和迭代周期越来越短,演化越来越频繁。另一方面,越来越多的软件应用以服务化和云化的方式运行,在提供服务的同时持续收集用户的行为及其反馈,并在云端汇聚形成软件用户大数据。这种不断积累的用户数据为软件应用的持续优化和改进提供了新的途径。数据驱动的软件演化方式反映了用户行为和体验的反馈已经在一定程度上成为掌握软件演化方向的主导力量。软件将逐步从被动演化转变为基于内生机制的持续生长。
|
||||
|
||||
\subsubsection{形态观下的软件学科发展}
|
||||
在软件定义一切以及人机物融合的发展背景下软件应用的泛在化和持续成长的新特征对于软件学科将产生多个方面的影响。
|
||||
|
||||
首先,“软件定义+计算思维”将成为每个人解决现实问题、满足自身需求的新范式。未来的人类社会及日常生活的方方面面都将以软件定义的人机物融合应用的方式来实现。实现用户需求的应用软件将越来越多地以最终用户编程的方式面向应用场景按需构造。因此,最终用户必须具备基于计算思维的问题解决方案规划和构造能力。同时,这也要求我们为支持人机物融合的泛在服务软件提供通用的编程抽象(包括编程模型和语言),支持这种最终用户编程。
|
||||
|
||||
其次,适应泛在化、专用化的计算设备和运行平台成为软件的普遍要求。大量的应用软件将从通用的硬件和平台迁移到专用的硬件和平台上,需要新的方法和工具支持来实现大范围的软件迁移和优化。针对通用目的开发的软件需要具备面向不同专用硬件和平台的高效定制和裁剪能力。
|
||||
其次,适应泛在而专用化的计算设备和运行平台成为软件的普遍要求。大量的应用软件将从通用的硬件和平台迁移到专用的硬件和平台上,需要新的方法和工具支持来实现大范围的软件迁移和优化。针对通用目的开发的软件需要不依附于硬件的长期生长演化能力,并具备面向不同专用硬件和平台的高效定制和裁剪能力。
|
||||
|
||||
再次,内生的持续成长能力将成为软件的基本能力。除了自适应能力外,软件将越来越多地具备支持自演化的持续生长能力。这种持续生长意味着通过各种智能化算法调整软件的算法和策略从而实现优化运行,而且还意味着软件通过各种生成以及合成能力不断增强自身的能力。因此,未来软件定义中功能与数据的界限将进一步模糊,越来越多的功能将通过数据定义(代码也可以看作一种数据)的方式进行表示,并通过数据驱动的方式实现自演化和自生长。
|
||||
再次,内生的持续成长能力将成为软件的基本能力。除了自适应能力外,软件将越来越多地具备支持自演化的持续生长能力。这种持续生长意味着通过各种智能化算法调整软件的算法和策略从而实现优化运行,而且还意味着软件通过各种生成以及合成能力不断增强自身的能力。因此,未来软件定义中功能与数据的界限将进一步模糊,越来越多的功能将通过数据驱动的方式进行设计,并实现自演化和自生长。
|
||||
|
||||
最后,软件与人将在不断汇聚的群体智慧中实现融合发展。软件的覆盖面越来越广、渗透性越来越强,最终用户对于软件的依赖也越来越强。由此,软件所能获得的关于用户行为和反馈的数据越来越全面和丰富,并在此基础上形成越来越强的群体智慧。这种群体智慧注入软件后又将服务于每个最终用户,使得他们能够在各种应用场景中以更加智能化和个性化的方式满足自身的需求,从而使得软件在使用中越来越有“灵性”和“人性”。未来的软件学科及相关研究需要摈弃“人”与“软件”二元分离的思维定式,更加自觉的考虑人机共融,不仅考虑“人因”,更要考虑“群智”。
|
||||
|
||||
\subsubsection{形态观下关键科学问题}
|
||||
|
||||
形态观下软件学科面临的核心科学问题是如何面向最终用户场景、通过人机物资源的按需融合与自适应、自演化持续满足用户的多样化需求。这一问题的解决有赖于编程语言及系统软件支撑、软件构造方法、软件演化与维护方法等多个层面的方法和技术发展。
|
||||
|
||||
\begin{enumerate}
|
||||
|
||||
\item 最终用户是人机物融合应用的使用者,同时也直接参与在其所见的人机物资源视图上构造应用。这方面涉及的科学问题是如何面向最终用户提供基于软件定义的建模方法并提供相应的编程模型和语言,技术层面包括如何发展示教编程(programming by demonstration)、图形化编排等面向非专业开发者的最终用户编程方法以及相配套的工具环境。
|
||||
|
||||
\item 软件应用的泛在化要求各种面向通用目开发的软件以解构再重构的方式,以用户为中心按需分布到泛在化、专用化的计算设备和运行平台上,从而适应应用按需融合与自适应、自演化的要求。这方面的科学问题在于如何为“解构再重构”建立抽象,技术层面包括:如何通过新型编译器、翻译器及其他系统软件工具支持遗留软件系统实现面向不同专用硬件和平台的高效定制和裁剪;如何基于超轻量级容器、泛在操作系统等新型系统软件支持泛在环境下软件部件的高效动态部署和运行。
|
||||
|
||||
\item 软件应用的持续生长要求软件以更加柔性的方式进行定义和构造,同时以更加智能化的方式实现软件的动态构造和更新。这方面的科学问题在于如何构建软件适应性演化、成长性构造的体系结构和核心机理,技术层面包括:如何通过运行时模型实现软件功能和实现策略的运行时定义;如何基于用户行为和反馈数据实现对于软件用户满意度及环境适应性的评价;如何根据用户目标、代码上下文及运行时反馈实现程序的自动合成和适应性调节。
|
||||
|
||||
\item 软件作为“万能集成器”扮演着人机物融合时代万物互联平台的重要角色,向下通过软件定义的方式接入各种人机物资源,向上支撑面向最终用户的人机物融合应用场景的实现。这方面的问题包括:如何将传统软件系统中局限于确定系统边界之内的人机物交互建模与实现方式扩展到面向开放系统的人机物交互建模与实现方式?如何支持跨越人机物三元空间的统一的数据流、控制流和状态空间表示及运行时制成?如何面向用户需求实现人机物资源的统一调度并确保开放环境下的可信交互?
|
||||
|
||||
|
||||
\end{enumerate}
|
||||
|
||||
\subsection{价值观}
|
||||
传统的软件质量观以软件制品为中心,人们主要通过客观度量软件系统来评估软件。新时代下,软件制品的内外部质量要求进一步强化和扩展。更重要的变化是,软件通过服务的方式满足用户需求,软件无迹可寻的趋势强化了软件作为人类价值载体的特征,需要在传统的质量观的基础上发展以人为中心的价值观。
|
||||
\subsubsection{从质量走向价值}
|
||||
传统的软件质量模型定义了内部质量、外部质量和使用质量,其主要关注包含内部质量和外部质量的系统质量。新时代下,软件生态和形态特征变化使得对于软件质量需要有新的认识。一方面变化是软件的服务化特征,即:软件系统通过服务满足用户需求,用户不再拥有软件制品,只享受软件提供的服务。软件服务可能由单一软件系统,或多个质量参差不齐的软件组合完成,因此,软件质量既针对单一软件系统,也针对软件系统的组合。另一方面,技术对社会的影响,使得软件体现了人类价值观。人类价值观,指的是“基于人的一定的思维感官之上而作出的认知、理解、判断或抉择,体现了人、事、物一定的价值或作用”,价值观具有稳定性、持久性、历史性和选择性等特点;软件通过一系列价值要素体现了主观的人类价值观,这些价值要素包括隐私性、安全性(Safety \& Security)、平等性等。传统的质量观转变为 “以软件制品为基础,以用户体验为中心”的价值观。在价值观主导下,不同用户会有不同的软件预期,也会使得同一软件系统具有不同的价值;软件系统体现的价值观,在人机物融合的发展背景下将作用于物理世界,影响物理世界的价值走向。
|
||||
\subsubsection{新时代软件系统的价值要素}
|
||||
软件会有多个不同的角度来评价其价值。未来人机物融合的软件系统将在可信性、安全性、伦理观和持续性等价值要素上推动软件学科的发展。
|
||||
传统的软件质量模型定义了内部质量、外部质量和使用质量,其主要关注包含内部质量和外部质量的系统质量。在人机物融合的趋势下,软件形态和生态特征变化要求重新认识软件质量。一方面变化是软件的服务化特征,即:软件系统通过服务满足用户需求,用户不再拥有软件制品,只享受软件提供的服务。软件服务可能由单一软件系统,或多个质量参差不齐的软件组合完成,因此,软件质量既针对单一软件系统,也针对软件系统的组合。另一方面,技术对社会的影响,使得软件体现了人类价值观。人类价值观,指的是“基于人的一定的思维感官之上而作出的认知、理解、判断或抉择,体现了人、事、物一定的价值或作用”,价值观具有稳定性、持久性、历史性和选择性等特点;软件通过一系列价值要素体现了主观的人类价值观,这些价值要素包括隐私性、安全性(Safety \& Security)、公平性等。传统的质量观转变为“以软件制品为基础,以用户体验为中心”的价值观。在价值观主导下,不同用户会有不同的软件预期,也会使得同一软件系统具有不同的价值;软件系统体现的价值观,在人机物融合的发展背景下将作用于物理世界,影响物理世界的价值走向。
|
||||
\subsubsection{价值观下的软件学科发展}
|
||||
软件会有多个不同的角度来评价其价值。未来人机物融合的软件系统将在可信性、安全性、伦理和持续性等价值要素上推动软件学科的发展。
|
||||
|
||||
(1)可信性
|
||||
|
||||
|
@ -94,74 +126,79 @@
|
|||
|
||||
(2)安全性
|
||||
|
||||
安全性要求为人类活动和生存环境提供必要的安全保障,包括系统安全(Safety)和信息安全(Security)。系统安全是指能及时有效地避免给人员、设施、环境、经济等造成严重损害,信息安全是指能有效防控各类的非法获取、传播和使用。软件信息安全保障失效的后果之一就是系统安全故障,因此,本书将两种安全性合二为一,统称为安全性(Safety\&Security)。传统软件质量观将安全视作系统质量的一部分,强调软件个体的安全性。随着人机物融合,软件系统已融入人类社会,并与人类无缝交互。换言之,泛在计算平台上软件与软件、软件与人的交互无处不在,软件个体可影响整个泛在网络计算平台的行为;软件个体的漏洞等故障很容易扩散(传播)。软件作为基础设施,参与并掌控了很多关键领域的资源,其安全性威胁会给整个系统带来致命的威胁。因此,安全性这一质量属性随着软件成为基础设施的现状变得愈发重要。
|
||||
安全性要求为人类活动和生存环境提供必要的安全保障,包括系统安全(Safety)和信息安全(Security)。系统安全是指能及时有效地避免给人员、设施、环境、经济等造成严重损害,信息安全是指能有效防控各类的非法获取、传播和使用。软件信息安全保障失效的后果之一就是系统安全故障,因此,本书将两种安全性合二为一,统称为安全性(Safety \& Security)。传统软件质量观将安全视作系统质量的一部分,强调软件个体的安全性。随着人机物融合,软件系统已融入人类社会,并与人类无缝交互。换言之,泛在计算平台上软件与软件、软件与人的交互无处不在,软件个体可影响整个泛在网络计算平台的行为;软件个体的漏洞等故障很容易扩散(传播)。软件作为基础设施,参与并掌控了很多关键领域的资源,其安全性威胁会给整个系统带来致命的威胁。因此,安全性随着软件成为基础设施的现状变得愈发重要。
|
||||
|
||||
(3)伦理观
|
||||
(3)伦理
|
||||
|
||||
作为人类价值载体,软件行为体现了人类价值观;由于软件无迹可寻,导致人类价值观又通过软件影响人类社会。因此,软件系统的行为应符合社会道德标准,不会对个人和社会产生负面结果,这种规范称为软件系统的伦理观。社会道德定义了一定时间区域内人们行为规范,可具体表现为无歧视、尊重隐私、公平公正等,并最终体现于软件系统的具体行为。因此,软件系统的伦理观,也体现于软件行为的上述方面,并需要通过软件开发和运行的诸多机制进行支持。
|
||||
作为人类价值载体,软件行为体现了人类价值观;由于软件泛在化,导致人类价值观往往通过软件影响人类社会。软件与人从以往的“使用”关系变为了“伙伴”关系。因此,软件系统的行为应符合社会道德标准,不会对个人和社会产生负面结果,这种规范称为软件系统的伦理。社会道德定义了一定时间区域内人们行为规范,可具体表现为无歧视、尊重隐私、公平公正等,并最终体现于软件系统的具体行为。因此,软件系统的伦理,也体现于软件行为的上述方面,并需要通过软件开发和运行的诸多机制进行支持。
|
||||
|
||||
(4)持续性
|
||||
|
||||
软件系统成为支撑社会经济运行的基础设施,掌控了国民经济和社会关键基础资源,需具有持续提供服务的能力。软件系统提供服务的可持续性(Sustainability),指的是在持续不间断运行、维护和发展过程中,面对各种突发异常事件,仍能提供令人满意的服务的能力。软件支撑的基础设施服务,为满足各类应用快速增长、新技术不断涌现的需求,需要具有开放扩展能力,即能集成各种异构的技术及系统,支持各类软件制品的即时加载/卸载,对内部状态及外部环境变化的感应、自主响应以及调控机制,以及个性化服务的定制等。显然,这种开放体系架构常常引入系统设计的脆弱性和质量隐患,从而给持续提供服务带来挑战。
|
||||
\subsubsection{价值观下,软件方法学的关键科学问题}
|
||||
新时代下,软件价值观不仅囊括传统的软件质量观,而且凸显了新时代下软件系统对物理世界的使能作用带来的影响,强调通过人的主体作用减少避免软件系统违反人类价值观。具体地,价值观强化了可信性、安全性、伦理观、持续性等具有新时代特色的价值要素,这些价值要素与软件开发运行维护过程的交融将经历一个长期的阶段,其带来的关键科学问包括四个方面:
|
||||
|
||||
\hangafter=1
|
||||
\setlength{\hangindent}{3.4em}
|
||||
1) 软件以何种方式承载人类价值观?具体地,如何通过需求等阶段获得项目特定的价值观,将其细化并融合于软件开发过程(包括软件的分析、设计和实现等环节)中?
|
||||
\subsubsection{价值观下关键科学问题}
|
||||
软件价值观不仅囊括传统的软件质量观,而且凸显了新时代下软件系统对物理世界的使能作用带来的影响,强调通过人的主体作用减少避免软件系统违反人类价值观。具体地,价值观强化了可信性、安全性、伦理、持续性等具有新时代特色的价值要素,这些价值要素与软件开发运行维护过程的交融将经历一个长期的阶段,其带来的关键科学问包括四个方面:
|
||||
|
||||
\hangafter=1
|
||||
\setlength{\hangindent}{3.4em}
|
||||
2) 如何定义复杂开放软件的可信性度量模型,并以此为基础通过开发运行环境证据的收集评估软件可信性?在开放环境下,可信性的定义也是动态多变的,如何在系统实现和运行中支持动态的可信性?
|
||||
\begin{enumerate}
|
||||
\item 软件以何种方式承载人类价值观?具体地,如何通过需求、设计等阶段获得项目特定的价值观,将其细化并融合于软件开发过程(包括软件的分析、设计和实现等环节)中?
|
||||
\item 如何定义复杂开放软件的度量模型,并以此为基础通过开发运行环境证据的收集评估软件价值要素?在开放环境下,价值要素的定义也是动态多变的,如何在系统实现和运行中支持动态的价值变化?
|
||||
\item 如何在复杂软件开发和运行过程中引入持续保值的机制,使得作为基础设施的软件系统在各种内外部非确定动态因素影响下不仅具有持续性,而且在演化成长中持续保值?
|
||||
\end{enumerate}
|
||||
|
||||
% 3) 如何在泛在网络计算平台下,系统地从硬件层、系统层、应用层等全栈来考量软件安全性(Safety\&Security)?
|
||||
|
||||
\hangafter=1
|
||||
\setlength{\hangindent}{3.4em}
|
||||
3) 如何在泛在网络计算平台下,系统化地从硬件平台、操作系统、应用软件等多层考虑软件安全性(Safety\&Security)?
|
||||
|
||||
\hangafter=1
|
||||
\setlength{\hangindent}{3.4em}
|
||||
4) 如何在软件开发和运行过程中引入灵活性的机制,使得作为基础设施的软件系统提供的服务具有持续性?此外,这种灵活性机制,有可能会给软件质量等带来的影响,这也是支持持续性的软件系统需要在设计实现中需要解决的问题。
|
||||
\subsection{生态观}
|
||||
软件的开发、维护和应用所涉及的各种元素(包括开发者、用户、代码、项目、社区、企业及其环境等)彼此交互互相依赖,逐渐形成复杂生态系统,需要用生态化的观点去理解和研究。生态化是软件的强大渗透力的必然结果:一方面软件活动延伸到了个体、群体和社会;另一方面软件所涉及的各种元素之间存在越来越多的依赖性、相关性和相互作用。
|
||||
软件的开发、维护和应用所涉及的各种元素(包括开发者、用户、代码、项目、社区、企业及其环境等)彼此交互、互相依赖,逐渐形成复杂生态系统,需要用生态化的观点去理解和研究。生态化是软件的强大渗透力的必然结果:一方面软件活动延伸到了个体、群体和社会;另一方面软件所涉及的各种元素之间存在越来越多的依赖性、相关性和相互作用。
|
||||
\subsubsection{软件生态系统}
|
||||
“人-机-物”三元融合的新型应用模式涉及到广大社会群体,涉及面广,分工精细,不仅需要术业专攻的各种企业和个体参与,也使得它们可以根据其本身特点和业务诉求参与到开发、应用及其支撑的各个环节,从而形成联合生态。
|
||||
|
||||
开源是一类典型生态系统。开源以燎原之势渗透到了软件产业各个领域,目前80\%的软件开发都是开源模式,几乎100\%的IT企业都借鉴开源代码,故而代码片段、软件包、软件以及技能、知识和上下游项目等的依赖无处不在,生态以一种自然的方式呈现于软件、开发者、开发社区和企业中。一些大规模复杂软件(尤其是基础软件)例如Linux内核,OpenStack等,因其基础性和流行度涉及到众多厂商的利益,因此也会吸引庞大的群体(企业和个体)在其开发和应用市场中扮演不同的角色,形成生态。
|
||||
开源是一类典型生态系统。开源以燎原之势渗透到了软件产业各个领域。目前80\%的软件开发都是开源模式,几乎100\%的IT企业都借鉴开源代码,这使得代码片段、软件包、软件以及技能、知识和上下游项目等的依赖无处不在。一些大规模复杂软件(尤其是基础软件)例如Linux内核,OpenStack等,因其基础性和流行度涉及到众多厂商的利益,因此也会吸引庞大的群体(企业和个体)在其开发和应用市场中扮演不同的角色,形成生态。
|
||||
|
||||
总的来说,软件生态系统指参加软件活动(开发、运行、维护、应用等)的一组实体及其环境组成的、彼此交互的社区体系(系统之系统)。生态系统可以从下述几个维度来刻画。
|
||||
总的来说,软件生态系统由软件活动(开发、运行、维护、应用等)中各类实体元素及其环境组成的、彼此交互的社区体系。生态系统可以从下述几个维度来刻画。
|
||||
|
||||
首先,多元素交互(开发者、用户、代码、项目、社区、企业等)是软件生态系统的最典型特征,而且交互的元素具有深刻的社会性(因为核心参与者——开发者和用户——都是社会体)。元素关系主要体现为协作、竞争和混合并保持生态的平衡。系统中要素关系(对立、独立或互补)之间的平衡是秩序之本,非平衡是运动变化之源。
|
||||
首先,多元素交互是软件生态系统的最典型特征,而且交互的元素具有深刻的社会性。元素关系主要体现为协作、竞争和混合并保持生态的平衡。系统中要素关系(对立、独立或互补)之间的平衡是秩序之本,非平衡是运动变化之源。
|
||||
|
||||
其次,生态系统的关键元素是个体、代码和项目/社区,三者互相融合、依赖和影响。个体之间、代码之间、项目之间存在各种依赖,形成各种供应链,而个体、代码和项目之间因为彼此依存也存在各种影响。生态的要义在于供应链的形成和各种影响的相互作用需要抵达平衡。
|
||||
其次,生态系统的关键元素是个体、代码、项目,三者互相融合、依赖和影响。个体之间、代码之间、项目之间存在各种依赖,网状的依赖形成各种供应链。个体、代码和项目之间因为彼此依存也存在各种影响,故而生态的要义在于供应链的形成和各种影响的相互作用需要抵达平衡。
|
||||
|
||||
第三,生态系统是由群体智能和计算机智能交互并融合而实现的。群体智能体现为分布在全球的开发者和用户,计算机智能体现为支撑分布式开发和使用的工具和基础设施(计算机辅助支持和人机交互)。群体智能(体现了众多的个体认知的汇聚,并涵盖商业智能和宏观调控的战略智能等)通过计算机智能凝炼为代码和产品,计算机智能支持人们更好地协作、开发和无处不在的使用,并且在开发和使用活动中不断迭代增强。
|
||||
\subsubsection{生态观下的软件学科的关键科学问题}
|
||||
软件从过去的个体作坊开发,到不同组织内或组织间参与下的组织式开发,发展到了数以万计互相依赖的软件或项目形成的供应链和庞大的生态系统。其转变给软件开发带来了前所未有的创新水平。同时,规模指数级增长的软件或项目及其之间庞杂的依赖关系使得软件供应链的复杂度激增,进而给软件开发和应用及市场带来诸多挑战。
|
||||
第三,生态系统是由人类智能和机器智能交互并融合而实现的。人类智能体现为分布在全球的开发者和用户;机器智能体现为支撑分布式开发和使用的工具与基础设施,支持人们更好地协作、开发和无处不在的使用,并且在开发和使用活动中不断迭代增强。通过众多的个体认知的汇聚,以及商业和宏观调控角度的战略调控,人类智能和机器智能凝练为代码和产品,并向混合群体智能方向发展。
|
||||
|
||||
第一,个体开发者学习成本进一步增大。首先因为软件之间广泛存在的依赖关系使得掌握一个新的软件需要学习别的软件。例如,对某个软件进行调试需要学习的相关软件依赖包可能会很多。其次,复杂依赖关系带来了新的问题,涉及更多的学习内容。例如,不同开源项目遵循相应许可证(License)的约束,并且不同许可证之间存在兼容问题,这就要求开发者在借鉴开源代码时需要了解对应的许可证。这其中的关键科学问题是:个体开发者如何学习并加入复杂项目和生态?
|
||||
\subsubsection{生态观下关键科学问题}
|
||||
软件从过去的个体作坊开发,到不同组织内或组织间参与下的组织式开发,发展到了数以万计互相依赖的软件形成的供应链和庞大的生态系统下的社会化开发。其转变给软件开发带来了前所未有的创新可能。同时,规模指数级增长的项目及其之间庞杂的依赖关系使得供应链复杂度激增,进而给软件开发和应用及市场带来诸多挑战。
|
||||
|
||||
第二,群体协作更加复杂。首先群体元素更为多样,其次不同元素围绕生态中的各种软件活动存在错综复杂的协作关系,最后协作行为并非恒定而是不断发展和演化的。例如供应链上的软件项目互相依赖,开发者需要跨越多个项目去实现目标功能,开发者之间的协作不再拘泥于单个项目。例如具有不同商业目标的公司需要各司其职,互补有无,还需要跟竞争对手建立协作,在商业利益和群体目标之间实现平衡。已有的群体协作机制大多聚焦对单个项目的支持,互相依赖的项目之间因缺少有效的信息沟通与集成机制使得群体协调的复杂度增大。总之,这其中的关键科学问题是:复杂生态中群体如何协作,协作行为如何发展?
|
||||
第一,个体开发者学习成本进一步增大。首先因为软件之间广泛存在的依赖和供应链关系使得掌握一个新的软件需要学习别的软件。例如,对某个软件进行调试需要学习的相关软件依赖包可能会很多。其次,复杂依赖关系带来了新的问题,涉及更多的学习内容。
|
||||
%例如,不同开源项目遵循相应许可证(License)的约束,并且不同许可证之间存在兼容问题,这就要求开发者在借鉴开源代码时需要了解对应的许可证。
|
||||
其面临的关键科学问题是:个体开发者如何学习并加入复杂项目和生态?
|
||||
|
||||
第三,生态可持续性受到的威胁持续增加。软件供应链上的节点是组成生态的关键元素,它们互相依赖互相影响。一个软件的漏洞有可能使得其他依赖该软件的项目面临同样的危机。例如,影响昭著的Heartbleed漏洞所涉及的OpenSSL项目中的两个文件至少存在于其他六千多个开源项目中。各大企业因为软件供应链的存在对软件溯源(即追踪代码问题的来源)有很大的需求,投资也是可观的。然而软件供应链上节点间的依赖关系隐藏在开发活动数据中,看不见摸不着但广泛存在,这就使得软件生态的可持续受到更多潜在威胁。而生态的形成和可持续发展影响到软件甚至信息产业的革新和发展。这方面的关键科学问题是:大规模代码和项目的供应链行为如何理解?产业生态如何形成,如何实现可持续发展?
|
||||
第二,群体协作更加复杂。群体元素更为多样,不同元素围绕生态中的各种软件活动存在着错综复杂的协作关系,协作行为并非恒定而是不断发展和演化的。
|
||||
%例如供应链问题使得开发者需要跨越多个项目去实现目标功能,开发者之间的协作不再拘泥于单个项目。又如具有不同商业目标的公司需要各司其职,互补有无,还需要跟竞争对手建立协作,在商业利益和群体目标之间实现平衡。已有的群体协作机制大多聚焦对单个项目的支持,互相依赖的项目之间因缺少有效的信息沟通与集成机制使得群体协调的复杂度增大。
|
||||
其面临的关键科学问题是:复杂生态中群体如何协作,协作行为如何发展?
|
||||
|
||||
总之,尽管有数千万个软件和项目及超过一千亿的源代码文件,但人们对软件生态中供应链的形成和发展,及其可能带来的风险和挑战却知之甚少。随着软件生态系统的快速延展,各类供应链关系逐步显现,如开发供应、技术供应、以及产销供应等。供应链中数以千万计的个体开发者、软件项目、公司等围绕软件形成复杂生态的各种活动数据都被软件支持工具记录下来,可以方便的获取,这为公众或者企业自己更好地理解生态的形成和发展,以降低或消除上述生态中的依赖风险、识别其他可能存在的风险提供了一种很好的方法。利用社会学理论对海量数据可视化出来的软件供应链网络进行分析,可以允许我们从个体学习、群体协作、以及生态持续的角度去识别评估风险,进而地更好保障软件生态的可持续发展。
|
||||
第三,生态可持续性受到的威胁持续增加。软件供应链上的节点是组成生态的关键元素,它们互相依赖互相影响。一个软件的漏洞有可能使得其他依赖该软件的项目面临同样的威胁。
|
||||
%例如,影响昭著的Heartbleed漏洞所涉及的OpenSSL项目中的两个文件至少存在于其他六千多个开源项目中。
|
||||
各大企业因为软件供应链的存在对软件溯源有很大的需求。然而软件供应链上节点间的依赖关系隐藏在开发活动数据中,看不见摸不着但广泛存在,这就使得软件生态的可持续受到更多潜在威胁。而生态的形成和可持续发展影响到软件甚至信息产业的革新和发展。这方面的关键科学问题是:大规模代码和项目的供应链行为如何理解?产业生态如何形成,如何实现可持续发展?
|
||||
|
||||
尽管有数千万个软件项目及超过一千亿的源代码文件,但人们对软件生态中供应链的形成和发展,及其可能带来的风险和挑战却知之甚少。随着软件生态系统的快速延展,各类供应链关系逐步显现,如开发供应、技术供应、以及产销供应等。供应链中数以千万计的个体开发者、软件项目、公司等围绕软件形成复杂生态的各种活动数据都由软件支持工具记录下来,可以方便的获取,这为公众或者企业自己更好地理解生态的形成和发展,以降低或消除上述生态中的风险、识别其他可能存在的风险提供了一种很好的方法。利用社会学理论对海量数据可视化出来的供应链网络进行分析,可以从个体学习、群体协作、以及生态持续的角度去识别评估风险,进而地更好保障软件生态的可持续发展。
|
||||
|
||||
综上,生态观对软件方法学带来显著的变化和跨越,软件学科跟其他学科的交叉性将更为凸显。软件和软件学科需要从以往关注个体软件的构建和运维转变到关注有广泛社会参与的软件体系的构建、运维和成长,以及软件生态的平衡和可持续发展。
|
||||
|
||||
\section{软件学科的发展趋势}
|
||||
本部分余下各章将采用上述系统观、形态观、价值观和生态观的新视角,结合学科自身的发展规律,讨论学科内各个领域方向所面临的一些主要挑战问题。
|
||||
我们大胆预测,软件学科的未来发展将由这些问题上的突破和进展所塑造。
|
||||
|
||||
\begin{itemize}
|
||||
\item 在软件理论方面,需研究如何应对大规模的数据与计算;如何保证复杂软件系统的正确性、可靠性、安全性;针对新型计算机的硬件架 构与新的计算平台,如何建立其理论分析基础等。
|
||||
%为此,需要重点研究
|
||||
\item 在软件语言方面,需研究如何通过对领域和应用问题的抽象,开发有效的领域特定语言;如何支持多范式程序设计,特别是加强大数据时代语言对数据处理的支持;如何开发人机物融合的泛在混合系统的编译技术;以及如何构建程序语言的安全性保障机制等。
|
||||
\item 在软件开发方法方面,需研究人机物融合复杂场景分析与建模、软件自适应与自成长、基于人机协作的群智化软件开发、数据驱动的软件自动化、安全可信高度智能的开发运维一体化等新方法和新技术。
|
||||
\item 在操作系统与运行平台方面,需研究支持软件定义的新型运行平台架构、泛在资源的高效虚拟化和灵活调度、复杂软件系统持续适应演化的共性支撑、人机物融合过程中的安全与隐私保护等关键技术问题。
|
||||
\item 在数据管理方面,需研究如何管理大数据、特别是如何利用新硬件混合架构来实现大数据的管理。在数据工程方面,需要应对异构数据整理、数据分析和数据安全与隐私保护等挑战。
|
||||
\item 在人机物融合的领域特定软件系统构造方面,面对系统边界的可伸缩性、系统成分的异构性和系统模型的混成性,需研究环境建模及其软件定义方法、模型驱动场景感知和认知、异构资源的统一表示和封装、系统学习赋能机制及性能确保、异构模型的融合和验证以及空间分布系统的的时空一致性等关键技术问题。
|
||||
\item 在软件质量与安全保障方面,需重点研究数据驱动的智能软件系统质量保障、人机物融合场景下的软件系统可信增强、大规模复杂系统安全缺陷检测与保障以及物联网软件安全保障等挑战性问题。
|
||||
\item 在软件生态方面,需要研究并阐明各类软件生态如何形成,如何可持续发展的基本规律,进而理解并驾驭大规模代码和项目的供应链行为、支持个体学习并加入复杂项目和生态,改进复杂生态中群体的协作等。
|
||||
\item 最后,在软件教育方面,需研究面向不同受众对象和认知水平的普及教育、反映人机物融合时代特点的专业教育、融合软件学科知识的其他学科专业教育,给出适应软件学科发展的人才培养理念及教育方法。
|
||||
\end{itemize}
|
||||
本书在第一篇总结了软件学科是由软件范型、软件开发方法、软件运行支撑、软件度量和质量评估等四方面形成有机整体,其中软件范型是软件学科的核心内容范型的变化将牵引软件技术体系的变化。而上述系统观、形态观、价值观和生态观的新视角将引起软件范型的变化,并辐射到软件开发、运行和度量各个层面方法和技术的变革,进而从整体软件的生态与教育方面产生深刻的影响。
|
||||
|
||||
软件理论和软件语言方面将着力建立适应人机物融合的软件范型的基础性问题。软件理论的核心是从复杂系统的角度来建立构建正确、高效、可靠、安全软件系统的理论和算法基础,特别是需要应对大规模的数据与计算的算法理论,以及在新的硬件架构(异构多态)和计算平台(量子计算)下程序理论等等。与软件理论紧密相关,软件语言应重点研究领域和应用问题表达和求解的新抽象,加强大数据时代语言对数据处理的支持,以及开发人机物融合的泛在混合系统的编译技术,在领域特定语言和语言工程、多范式程序设计范式融合、软件语言和实现的内生安全等方面奠定软件定义的形态基础。
|
||||
|
||||
软件构造方法将面向人机物融合场景的“软件定义”,软件需要在万物互联的平台上开发、运行、并持续演进地提供服务,具有自主性、协同性、演化性、情境性、涌现性和可信性等诸多特性。这在软件构造的技术方法和组织模式上均需要新方法和技术,包括:复杂场景分析与建模、软件自适应与自成长、基于人机协作的群智化软件开发、数据驱动的软件自动化、安全可信高度智能的开发运维一体化等。
|
||||
|
||||
软件运行支撑需要满足软件作为社会基础设施的规模、效能、持续、演进等诸多关键需求,并适应人机物融合的各类资源和应用场景的管理和实现。这将集中反映在未来的泛在操作系统与运行平台方面,需研究支持软件定义的新型运行平台架构、泛在资源的高效虚拟化和灵活调度、复杂软件系统持续适应演化的共性支撑、人机物融合过程中的安全与隐私保护等关键问题。
|
||||
|
||||
软件度量和质量评估是软件学科的科学观察、工程构造相交融的重要方面。未来的重要变化是在复杂系统和软件生态层面的科学观察并以此为基础开展在软件开发和运行层面的持续发展。以各类软件大数据为核心的度量抽象将揭示
|
||||
软件生态如何形成、如何可持续发展的基本规律,进而理解并驾驭大规模代码和项目的供应链行为、支持个体学习并加入复杂项目和生态,改进复杂生态中群体的协作。数据驱动和规则驱动将在软件质量与安全保障上发挥重要的作用。
|
||||
|
||||
“数据为中心”是人机物融合时代的最为突出的特征,数据工程和数据管理是未来软件构造和运行支撑的共性沉淀。在数据工程方面,需要应对异构数据整理、数据分析和数据安全与隐私保护等挑战。在数据管理方面,需研究如何管理大数据、特别是如何利用新硬件混合架构来实现大数据的管理。
|
||||
|
||||
软件学科的发展呈现了纵横交错的发展态势,即共性沉淀和领域牵引相辅相成的格局,这在人机物融合时代复杂多变的应用和开放平台上将更为显现。在不同的应用领域,面对系统边界的可伸缩性、系统成分的异构性和系统模型的混成性,需研究各领域的环境建模及其软件定义方法、模型驱动场景感知和认知、异构资源的统一表示和封装、系统学习赋能机制及性能确保、异构模型的融合和验证以及空间分布系统的的时空一致性等关键技术问题,在共性方法上发展领域特定方法,并反馈于共性方法的发展,从而系统综合地把握“以纵带横、纵横交错、落实在横”的学科未来。
|
||||
|
||||
软件学科的发展离不开软件教育体系、内容、方法、手段的变革。软件教育需要适应“软件定义一切”普及教育的需求,还要在顺应人机物融合时代特点的专业教育、融合软件学科知识的其他学科专业教育上有新发展。
|
||||
|
||||
本部分余下各章将讨论学科内各个领域方向所面临的一些主要挑战问题。
|
||||
我们大胆预测,软件学科的未来发展将由这些问题上的突破和进展所塑造。
|
|
@ -1,16 +1,17 @@
|
|||
|
||||
世界离不开计算,描述计算离不开程序设计语言\index{程序设计语言}。不同的程序设计语言描述不同的计算模式\index{计算模式},比如,命令式语言描述以状态的变换作为计算的模式,函数式语言描述以函数作为计算的模式,逻辑语言描述以证明作为计算的模式,而量子语言则描述量子计算的模式。在第\ref{book1-PL}章,我们对众多的程序设计语言进行了比较并回顾了程序设计语言的发展历史,从中我们可以看到,新的程序设计语言的出现通常是为了应对新的计算模式、新兴应用、或者新兴硬件和计算平台的需要。
|
||||
世界离不开计算,描述计算离不开程序设计语言\index{程序设计语言}。不同的程序设计语言描述不同的计算模式\index{计算模式}
|
||||
,比如,命令式语言描述以状态变迁作为计算的模式,函数式语言描述以函数作为计算的模式,逻辑语言描述以证明作为计算的模式,而量子语言则描述遵循量子力学规律调控量子信息单元进行计算的模式。在第\ref{book1-PL}章,我们对众多的程序设计语言进行了比较并回顾了程序设计语言的发展历史,从中可以看到,新的程序设计语言的出现通常是为了应对新的计算模式、新兴应用、或者新兴硬件和计算平台的需要。
|
||||
|
||||
“软件定义一切”本质上是可编程思想扩张到整个社会和物理世界,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。随着人机物融合的发展,计算的泛在化成为必然,程序设计语言向下需要对物理世界进行抽象并提供处理物理世界的接口,向上需要能够处理不同场景的多范式的应用编程。{泛在计算}\index{泛在计算}中不断涌现出的新的计算模式、新的计算平台和新的应用问题给程序设计语言的定义和实现带来了新的机遇和挑战。
|
||||
“软件定义一切”本质上是可编程思想扩张到整个社会和物理世界,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。随着人机物融合的发展,计算的泛在化成为必然,程序设计语言向下需要对物理世界进行抽象并提供处理物理世界的接口,向上需要能够处理不同场景的应用编程。{泛在计算}\index{泛在计算}中不断涌现出的新的计算模式、新的计算平台和新的应用问题给程序设计语言的定义和实现带来了新的机遇和挑战。
|
||||
|
||||
|
||||
首先,新的计算模式需要新的程序设计语言。随着不断涌现的新的计算模式,如适合于抽象描述机器学习的概率计算、神经网络计算、大数据计算、保护隐私的计算\cite{DBLP:conf/sp/RastogiHH14}等,我们需要新的语言定义和实现技术,快速开发各种各样新的程序设计语言,支持各类新型计算模式。
|
||||
|
||||
|
||||
第二,新的硬件和计算平台需要新的语言实现技术。新的硬件(如GPU、非易失性内存等)和新的计算平台(如云、网构等)不断涌现。除了设计新的程序设计语言,我们还需要研究新的编译技术以生成适合于新的硬件和体系结构的高效代码。
|
||||
第二,新的硬件和计算平台需要新的语言实现技术。新的硬件(如XPU(GPU、TPU等)、非易失性内存等)和新的计算平台(如云、网构等)不断涌现。除了设计新的程序设计语言,我们还需要研究新的编译技术以生成适合于新的硬件和体系结构的高效代码。
|
||||
|
||||
|
||||
第三,新的应用问题需要新的程序设计语言来高效地解决。随着社会的发展,我们会遇到各种各样的、新的复杂应用问题,除了利用既有程序设计语言开发新的软件之外,我们还可以通过设计更好的程序设计语言来解决这些问题。新型语言不单单提供了描述解决该问题本身的一个方法,而且可以提供解决一类相似问题的方便而可信的一般途径。程序设计语言技术提供给我们解决类似问题的方便而可信的途径。
|
||||
第三,新的应用问题需要新的程序设计语言来高效地解决。随着社会的发展,我们会遇到各种各样的、新的复杂应用问题,除了利用既有程序设计语言开发新的软件之外,我们还可以通过设计更好的程序设计语言来解决这些问题。新型语言不单单提供了描述解决该问题本身的一个方法,而且可以提供解决一类相似问题的方便而可信的一般途径。程序设计语言技术会提供解决类似问题的方便而可信的途径。
|
||||
|
||||
|
||||
第四,程序设计语言的发展需要健全的语言生态。程序设计语言的生态,包括支撑环境、集成开发环境、扩展功能支持库、第三方功能模块、帮助文档和知识库、技术交流社区、资源下载网站、教程和培训等。程序设计语言生态的繁荣决定了程序设计语言的繁荣。
|
||||
|
@ -19,7 +20,7 @@
|
|||
在这一章里,我们将从计算的泛在和多样性,计算平台,软件的复杂性和安全性,以及软件生产率等几个方面来讨论新时代软件设计语言与支撑环境方面的挑战,列出重要的研究内容,并阐述展示程序设计语言及支撑环境方面的研究趋势。
|
||||
|
||||
\section{重大挑战问题}
|
||||
程序设计语言的挑战问题集中于如何建立、描述和实现抽象。具体来说,其挑战表现在两个方面。首先,在抽象建立和描述方面,主要表现在如何通过对领域和应用问题的抽象,开发有效的领域特定语言\index{领域特定语言}(§\ref{2_3_1_1})、支持多范式程序设计\index{多范式程序设计}(§\ref{2_3_1_2}),特别是加强大数据时代语言对数据处理的支持(§\ref{2_3_1_3})。其次,在抽象的实现方面,主要表现在如何开发人机物融合的泛在混合系统的编译技术(§\ref{2_3_1_4})和构建程序语言的安全性保障机制(§\ref{2_3_1_5})。
|
||||
程序设计语言的挑战问题集中于如何建立、描述和实现抽象。具体来说,其挑战表现在两个方面。首先,在抽象建立和描述方面,主要表现在如何通过对领域和应用问题的抽象,开发有效的领域特定语言\index{领域特定语言}(§\ref{2_3_1_1})、支持多范式程序设计\index{多范式程序设计}(§\ref{2_3_1_2}),特别是加强大数据时代语言对数据处理的支持(§\ref{2_3_1_3})。其次,在抽象的实现方面,主要表现在如何开发人机物融合的泛在范型的编译技术(§\ref{2_3_1_4})和构建程序语言的安全性保障机制(§\ref{2_3_1_5})。
|
||||
|
||||
\subsection{面向泛在计算的语言的定制}\label{2_3_1_1}
|
||||
随着泛在计算的普及,一方面,专用化的计算设备和运行平台需要软件具备面向不同专用硬件和平台的高效定制能力;另一方面,泛在服务软件需要提供各种特定的编程抽象,支持面向人机物融合的最终用户编程。在泛在计算的环境下,程序员的概念也不断泛化——未来越来越多的人,甚至那些缺乏足够计算机专业知识的领域专家,需要对专用化的设备或特定领域的问题进行程序设计。这就需要我们开发各式各样的领域特定语言。泛在计算对领域特定语言的定义和实现带来了新的挑战。
|
||||
|
@ -29,17 +30,26 @@
|
|||
\item 对于通用语言,我们已经开发了不少很有用的程序分析、优化、调试、测试方法。对于特定领域语言,我们需要利用这些方法。尽管我们可以用通用语言来实现某种特定领域语言,但是如何能够将这些一般性的方法系统化地映射到特定语言的实现上是一个挑战。比如,假设我们在通用语言上实现了一个测试方法,但是通用语言上的测试结果对于特定领域语言的用户而言是不能理解的。我们需要将通用语言上的测试例子和结果映射到特定语言程序上,特定领域语言的用户才能理解。
|
||||
\item 在设计特定领域语言时存在的一个选择是应该设计一个小而精的语言,还是设计一个大而全面的语言?Schema语言的设计者之一的Guy Steele认为,既不应该建立一种小语言,也不应该建立一种大语言,而需要设计一种可以成长的语言。语言设计应该是增长式的——语言必须从小开始,能够随着用户集的增长而增长。例如,我们可以比较APL语言和Lisp语言:APL不允许用户以“流畅”的方式向该语言添加新的原语(Premitive),这使得用户难以扩展该语言;在Lisp中,用户可以定义与语言基元保持一致的单词,它使语言用户可以轻松扩展语言并共享代码。为此,在设计语言时,我们面临的挑战是,如何保证其具有一定的韧性,支持新的语言构造和特性可以被无缝接入其中,同时,在语言演化过程中,也能保证遗留系统被无障碍地执行。
|
||||
\end{itemize}
|
||||
|
||||
\subsection{多范式程序设计的语言支持}\label{2_3_1_2}
|
||||
主流程序设计语言支持不同的程序设计范式\cite{ DBLP:journals/software/WamplerC10}。从程序设计语言的角度出发,一方面,需要设计与程序设计语言相适应的程序设计范式或者程序设计模型,以获取程序可读性、模块性、抽象性和性能上的平衡。另一方面,需要提供技术手段,根据程序员能力或者开发任务自动选择或者推荐程序设计范式,提升程序员程序设计效率。然而随着解决的问题越来越复杂,我们需要研究支持多范式的程序设计语言,以及对多范式语言的高效实现机制。特别是,我们面对下面一些挑战。
|
||||
主流程序设计语言支持不同的程序设计范式\cite{ DBLP:journals/software/WamplerC10}。从程序设计语言的角度出发,一方面,需要设计与程序设计语言相适应的程序设
|
||||
计范型或者程序设计模型,以获取程序可读性、模块性、抽象性和性能上的平衡。另一方面,需要提供技术手段,根据程序员能力或者开发任务自动选择或者推荐程序设计范型,
|
||||
提升程序员程序设计效率。然而随着解决的问题越来越复杂,我们需要研究支持多范型的程序设计语言,以及对多范型语言的高效实现机制。特别是,我们面对下面一些挑战。
|
||||
|
||||
|
||||
首先,如何将描述函数计算最直接的函数式程序设计\index{函数式程序设计}融合到其它语言中是多范式语言设计的一个挑战。函数式程序设计\cite{kar50323}用函数来抽象计算,它的高阶函数和计算的透明性的两个重要特征,一方面使函数式语言适用于大数据处理、人工智能等领域,但是另一方面也使它不容易与其它语言共用。尽管已有不少关于研究和系统讨论如何融合逻辑语言与函数式语言\cite{DBLP:series/lncs/Torra16},融合面向目标式语言和函数式语言,不少通用程序设计语言(C++和Java、Kotlin等)也开始支持函数式程序设计,但是,现在还没有一个公认的计算模型来系统地支持这种融合的设计和实现。如何将函数式语言的高阶函数和计算透明性有效而便捷地扩展至通用程序设计语言及支撑环境,以支持函数式程序设计或混合程序设计,成为一个值得关注的挑战问题。
|
||||
首先,如何将描述函数计算最直接的函数式程序设计\index{函数式程序设计}融合到其它语言中是多范型语言设计的一个挑战。函数式程序设计\cite{kar50323}用函数来抽象
|
||||
计算,它的高阶函数和计算的透明性的两个重要特征,一方面使函数式语言适用于大数据处理、人工智能等领域,但是另一方面也使它不容易与其它语言共用。尽管已有不少关于研究和系统讨论如何融合逻辑语言与函数式语言\cite{DBLP:series/lncs/Torra16},融合面向目标式语言和函数式语言,不少通用程序设计语言(C++和Java、Kotlin等)也
|
||||
开始支持函数式程序设计,但是,现在还没有一个公认的计算模型来系统地支持这种融合的设计和实现。如何将函数式语言的高阶函数和计算透明性有效而便捷地扩展至通用程序设计语言及支撑环境,以支持函数式程序设计或混成程序设计,成为一个值得关注的挑战问题。
|
||||
|
||||
|
||||
其次,无缝融合并发程序设计是多范式语言设计和实现的另一个挑战。目前已经存在很多并发程序设计模型,它们指定了系统中的线程/进程如何通过协作来完成分配给它们的作业——不同的并发模型采用不同的方式拆分任务,线程/进程间的协作和交互方式也不相同。为此,需要建立与特定程序设计语言相适应的一组并发模型,更好支持程序员设计与实现并发任务。此外,传统的并发思维,是在单个处理器上,使用分时方式或是时间片模型来执行多个任务。如今的并发场景则正好相反,是将一个逻辑上的任务放在多个处理器或者多核上执行。因此,程序设计语言需要提供足够的机制来分解任务。然而,基于目前并发API,比如线程、线程池、监视等,编写并发程序依然很困难,还需要更多关于程序设计语言及实现方面的努力。例如,可以由编译器甚至执行引擎识别出程序中可并发的任务,以便多核计算机可以将其安全地并发执行。
|
||||
其次,无缝融合并发程序设计是多范型语言设计和实现的另一个挑战。目前已经存在很多并发程序设计模型,它们指定了系统中的线程/
|
||||
进程如何通过协作来完成分配给它们的作业——不同的并发模型采用不同的方式拆分任务,线程/进程间的协作和交互方式也不相同。为此,需要建立与特定程序设计语言相适应的
|
||||
一组并发模型,更好支持程序员设计与实现并发任务。此外,传统的并发思维,是在单个处理器上,使用分时方式或是时间片模型来执行多个任务。如今的并发场景则正好相反,
|
||||
是将一个逻辑上的任务放在多个处理器或者多核上执行。因此,程序设计语言需要提供足够的机制来分解任务。然而,基于目前并发API,比如线程、线程池、监视等,编写并发程
|
||||
序依然很困难,还需要更多关于程序设计语言及实现方面的努力。例如,可以由编译器甚至执行引擎识别出程序中可并发的任务,以便多核计算机可以将其安全地并发执行。
|
||||
|
||||
\subsection{大数据处理的程序语言支持}\label{2_3_1_3}
|
||||
当今时代是大数据的时代。全球的数据在不断地增多,依赖这些数据对各行各业进行优化是当今社会的发展趋势。大数据呈现出体量巨大,数据类型多样,数据增长速度快和数据价值密度低的4V特征,这就意味着要利用好数据中的价值,我们必须依赖于程序以自动化地管理和分析数据,从而给程序设计语言带来了一系列全新挑战。
|
||||
当今时代是大数据的时代。全球的数据在不断地增多,依赖这些数据对各行各业进行优化是当今社会的发展趋势。大数据呈现出体量巨大、数据类型多样、数据增长速度快和数据价值密度低的4V特征,这就意味着要利用好数据中的价值,我们必须依赖于程序以自动化地管理和分析数据,从而给程序设计语言带来了一系列全新挑战。
|
||||
|
||||
|
||||
首先,大数据\index{大数据}的一个特点是数据类型多样,但不同的人和不同的场合需要的数据是不一样的,这就意味着我们常常需要对数据按不同方式进行组织。数据自主性和数据互操作性给程序语言的设计带来挑战。一方面,当我们按照某一种特定格式获取到数据的时候,需要把数据转换成其他格式保存和展示。另一方面,当我们修改了其中一份数据的时候,需要保证其它保存的数据和展示的视图都能对应修改。如果用传统程序设计语言编写这样的数据同步程序有两方面的问题:(1) 重复的编码工作量大:对于两种数据的同步一般需要编写两份转换程序,但这两份转换程序很多部分是重复的。(2) 很容易出现错误:两份转换程序容易写得不一致。因此,需要新的程序设计语言来处理此类数据管理需求。
|
||||
|
@ -50,13 +60,13 @@
|
|||
|
||||
最后,大数据具有价值密度低的特点,这就意味着如果要发挥大数据的作用,需要采用合适的方式对数据进行统计。有效的统计方法往往需要我们针对数据的特点构建统计模型,然后根据统计模型对数据进行统计。比如,现在流行的神经网络需要用户首先给出网络结构,然后根据数据确定网络中参数数值。而基于统计学的概率图方法需要先确定随机变量的分布和随机变量之间的依赖关系,然后基于数据确定随机变量的后验分布。这些统计模型的编写较为复杂,同时给定模型之后的统计算法也比较复杂,因此,需要有新的程序设计语言来支持这类模型的描述(如概率编程等)、验证和测试。
|
||||
|
||||
\subsection{面向人机物融合的混合编译}\label{2_3_1_4}
|
||||
编译器\index{编译器}是程序设计语言的重要支撑环境,其负责将一种语言(通常为高级语言)所书写的程序变换成另一种语言(通常为低级语言)程序。编译器的另一个主要功能是对程序进行优化,提升软件的性能。现代软件系统呈现人机物融合的泛在混合特性,对编译技术也带来新的挑战。
|
||||
\subsection{面向人机物融合的编译}\label{2_3_1_4}
|
||||
编译器\index{编译器}是程序设计语言的重要支撑环境,其负责将一种语言(通常为高级语言)所书写的程序变换成另一种语言(通常为低级语言)程序。编译器的另一个主要功能是对程序进行优化,提升软件的性能。现代软件系统呈现人机物融合的泛在混成特性,对编译技术也带来新的挑战。
|
||||
|
||||
首先,编译器需要能够快速应对不断出现的专用处理器。摩尔定律的逐渐失效以及大数据处理深度学习等新应用需求的出现,正助推计算机行业从通用计算机系统,转向一个青睐专用微处理器和专用存储系统等专用硬件的时代。这种转变需要我们研究新的更有效的编译技术。当一个新的硬件出现之后,首先,应该对专用硬件进行抽象,定义一个底层使用该硬件的领域特定语言(DSL)\cite{ DBLP:books/daglib/0030751}\cite{Thereska:2013:ISS:2517349.2522723};然后,扩充现有的语言,为之提供一个高层次的界面,以便用户描述专用硬件上的计算;最后,定义如何将高层次的程序翻译到底层的DSL。为了支持这个过程,我们需要研究自动编译技术——我们预测未来的编译器能够在SMT等求解器的帮助下自动生成能在专用处理器上运行的的目标程序,通过重写策略对目标程序自动优化,且保证编译过程的正确性和代码质量\cite{Rompf:2012:LMS:2184319.2184345}\cite{ Chen:2018:TAE:3291168.3291211}\cite{Monsanto:2012:CRS:2103656.2103685}。
|
||||
|
||||
|
||||
其次,编译器需要能够高效地处理混合系统。现在的软件系统越来越复杂,形成了一个混合的系统,需要既能处理离散的又能处理连续的计算,既能处理确定性(逻辑式)的又能处理概率性的计算,既针对命令式的又针对函数式的程序设计语言,既可静态类型检查又可以动态确认程序满足的性质。为了开发这样的复杂的软件系统,混合语言以及相应编译技术变得非常重要。此外,复杂软件系统可能由不同程序设计语言书写的程序组成。对不同程序设计语言所书写的程序进行高效混合编译,也是一个值得关注的研究问题。
|
||||
其次,编译器需要能够高效地处理混成系统\index{混成系统}。现在的软件系统越来越复杂,形成了一个混成的系统,需要既能处理离散的又能处理连续的计算,既能处理确定性(逻辑式)的又能处理概率性的计算,既针对命令式的又针对函数式的程序设计语言,既可静态类型检查又可以动态确认程序满足的性质。为了开发这样的复杂的软件系统,混成语言以及相应编译技术变得非常重要。此外,复杂软件系统可能由不同程序设计语言书写的程序组成。对不同程序设计语言所书写的程序进行高效混成编译,也是一个值得关注的研究问题。
|
||||
\subsection{程序设计语言的安全性保障}\label{2_3_1_5}
|
||||
程序设计语言的安全性,体现在两个方面:程序设计语言自身的安全性设计与其支撑环境(如库、编译器、解释器、运行时等)的安全性保障。程序设计语言的设计者和实现者都在不遗余力的提升程序设计语言的安全性。当前,程序设计语言的安全性方面,还存在以下的重大挑战问题。
|
||||
|
||||
|
@ -104,8 +114,8 @@
|
|||
child {node {\bf 支持最终用户编程的程序设计语言}}
|
||||
}
|
||||
child [missing] {}
|
||||
child {node {多范式程序设计}
|
||||
child {node {\bf 多范式和领域特定的程序设计语言}}
|
||||
child {node {多范型程序设计}
|
||||
child {node {\bf 多范型和领域特定的程序设计语言}}
|
||||
}
|
||||
child [missing] {}
|
||||
}
|
||||
|
@ -153,13 +163,13 @@
|
|||
|
||||
|
||||
\section{主要研究内容}
|
||||
程序设计语言的主要研究内容请参见图\ref{fig:ProgrammingLanguages}。为了应对上述重大挑战,需要在多方面开展研究。首先,为了支持泛在计算(§\ref{2_3_2_1})、大数据处理(§\ref{2_3_2_3})、和人机物融合(§\ref{2_3_2_4})等多种新型应用场景,需要研究面向不同领域的编程语言,包括面向数据管理统计的程序设计语言(§\ref{2_3_2_2})、面向软件定义网络的程序设计语言(§\ref{2_3_2_3})、支持最终用户编程的程序设计语言(§\ref{2_3_2_6})。其次,为了设计面向泛在计算的语言(§\ref{2_3_2_1})和实现多范式程序设计支持(§\ref{2_3_2_2}),需要研究多范式和领域特定的程序设计语言(§\ref{2_3_2_1})、离散和连续混成系统的语言和工具(§\ref{2_3_2_4})以及支持共享内存模型的并发程序设计(§\ref{2_3_2_5})。最后,为了支持新语言所带来的开发环境和生态的变化,我们需要研究程序设计框架和程序设计开发环境(§\ref{2_3_2_7})、特定领域语言的元编程和开发环境(§\ref{2_3_2_8})、程序设计语言的生态及其演化规律(§\ref{2_3_2_9})。在图中,我们用粗体表示本章讨论的研究内容。
|
||||
程序设计语言的主要研究内容请参见图\ref{fig:ProgrammingLanguages}。为了应对上述重大挑战,需要在多方面开展研究。首先,为了支持泛在计算(§\ref{2_3_2_1})、大数据处理(§\ref{2_3_2_3})、和人机物融合(§\ref{2_3_2_4})等多种新型应用场景,需要研究面向不同领域的编程语言,包括面向数据管理统计的程序设计语言(§\ref{2_3_2_2})、面向软件定义网络的程序设计语言(§\ref{2_3_2_3})、支持最终用户编程的程序设计语言(§\ref{2_3_2_6})。其次,为了设计面向泛在计算的语言(§\ref{2_3_2_1})和实现多范型程序设计支持(§\ref{2_3_2_2}),需要研究多范型和领域特定的程序设计语言(§\ref{2_3_2_1})、离散和连续混成系统的语言和工具(§\ref{2_3_2_4})以及支持共享内存模型的并发程序设计(§\ref{2_3_2_5})。最后,为了支持新语言所带来的开发环境和生态的变化,我们需要研究程序设计框架和程序设计开发环境(§\ref{2_3_2_7})、特定领域语言的元编程和开发环境(§\ref{2_3_2_8})、程序设计语言的生态及其演化规律(§\ref{2_3_2_9})。在图中,我们用粗体表示本章讨论的研究内容。
|
||||
|
||||
\subsection{多范式和领域特定的程序设计语言}\label{2_3_2_1}
|
||||
主流程序设计语言都支持多种程序设计范式。一方面需要研究如何设计程序设计语言所支持的范式乃至于库、编程框架等,以助于程序员更便捷地编写大型应用。另一方面,需要研究如何根据程序员能力或者开发任务自动选择或者推荐程序设计范式,以提升程序员程序设计效率。此外,也需要对多范式程序设计语言的支撑环境(含编译、编译时和运行时优化、内存管理、多线程处理、垃圾回收等)及其程序分析、验证技术进行研究——在一门程序设计语言中引入新的程序设计范式,往往需要很多工业界和学术界的努力,避免支撑环境的复杂性、分析及验证技术难度的急剧上升。
|
||||
\subsection{多范型和领域特定的程序设计语言}\label{2_3_2_1}
|
||||
主流程序设计语言都支持多种程序设计范型。一方面需要研究如何设计程序设计语言所支持的范型乃至于库、编程框架等,以助于程序员更便捷地编写大型应用。另一方面,需要研究如何根据程序员能力或者开发任务自动选择或者推荐程序设计范型,以提升程序员程序设计效率。此外,也需要对多范型程序设计语言的支撑环境(含编译、编译时和运行时优化、内存管理、多线程处理、垃圾回收等)及其程序分析、验证技术进行研究——在一门程序设计语言中引入新的程序设计范型,往往需要很多工业界和学术界的努力,避免支撑环境的复杂性、分析及验证技术难度的急剧上升。
|
||||
|
||||
|
||||
随着专用处理器等硬件的不断出现以及各种特定应用领域软件开发的需求,领域特定语言的开发变得非常重要。领域特定语言既向下提供特定平台的编程模型,也向上提供具体应用场景的需求描述方法。尽管我们可以使用一般的程序语言的设计方法和编译技术,但是这样开发效率低。我们应该开发在通用语言的基础上实现领域特定语言的技术。主要研究内容包括:(1)如何在用户的DSL上来表示运行时和编译时的错误;(2)如何自动生成测试用例直接测试DSL程序;和(3)如何将深度嵌入和浅度嵌入的领域特定语言的定义方法结合起来。
|
||||
随着专用处理器(如GPU、TPU)等硬件的不断出现以及各种特定应用领域软件开发的需求,领域特定语言的开发变得非常重要。领域特定语言既向下提供特定平台的编程模型,也向上提供具体应用场景的需求描述方法。尽管我们可以使用一般的程序语言的设计方法和编译技术,但是这样开发效率低。我们应该开发在通用语言的基础上实现领域特定语言的技术。主要研究内容包括:(1)运行时和编译时的错误的直观表示;(2)DSL程序测试用例的自动生成;和(3)深度嵌入和浅度嵌入的领域特定语言的定义方法的有机结合。
|
||||
|
||||
\subsection{面向数据管理统计的程序设计语言}\label{2_3_2_2}
|
||||
数据在我们的生活中无处不在。在一个医疗保健系统中,医院、药房、患者都有各自的数据,为了保护隐私,这些数据没有被集中统一管理,而是以一种非中心的方式分散在不同的系统中。如何安全地共享和交换信息从而实现非中心数据的互操作成为现代社会亟需解决的一个重要问题。为了解决这个问题,需要将非中心数据的互操作问题分解为(1)局部的隐私控制问题、(2)全局的数据同步问题、(3)联系局部和全局的软件体系结构问题。每个问题的解决都需要我们设计好的程序设计语言,从而实现一个高可信且可扩展的非中心数据的互操作系统。目前,研究人员提出的双向变换语言\cite{Foster:2007:CBT:1232420.1232424} 能够保证两种数据的一致性,为部分解决数据的互操作提供一个好的解决方案,值得进一步深入研究。
|
||||
|
@ -172,23 +182,25 @@
|
|||
传统网络设施的网络协议都固定在芯片中,一旦制造出来就不可能支持新的网络协议。为了解决这个问题,软件定义的网络设备把控制器制作成可以程序设计的开关电路,允许通过软件控制开关来实现不同的协议。最基础的软件定义网络程序设计语言是Openflow,该语言用于直接控制网络硬件中的开关。由于直接程序设计控制开关较为困难,研究人员又进一步提出了高层的程序设计语言,其代表语言为NetKat语言\cite{Anderson:2014:NSF:2535838.2535862}和P4语言\cite{ Bosshart:2014:PPP:2656877.2656890}:NetKat语言主要从控制角度看待网络协议,允许程序员采用类似普通函数语言的方式来声明函数和函数的组合,然后该语言的编译器负责将这种高层声明转换成Openflow上的开关控制;P4语言主要从数据角度看待网络协议,通过数据格式和对应数据项上的操作来描述网络协议。然而,程序设计人员在编写应用的时候仍需要使用一组与新型硬件相关的库函数,这极大程度地影响了既有系统在新型硬件上的运行或者迁移。这里,值得关注的研究内容包括:(1)定义高层次的、具有更强表达能力的网络定义语言;(2)通过修改底层支撑环境(包含操作系统、编译器、执行引擎、库等),支持既有系统在编译或者执行过程中,主动支持新型硬件的使用。
|
||||
|
||||
\subsection{离散和连续混成系统的语言和工具}\label{2_3_2_4}
|
||||
混成系统是由离散和连续的多个子系统组合而成的混合模型。尽管近年来已有很多处理混成系统的语言和系统工具,每个语言和工具对环境做出不同的假设,导致混成系统难以在不同的语言和工具之间共享信息。因此,需要解决混合系统中各个子系统的一致性问题,从而最大限度地利用现有的语言和工具。主要研究内容包括:(1)审阅和比较现有混成系统语言和工具的语义、表达能力和数学机制,发掘它们的差异;(2)设计一种语义感知的交换格式,便于描述不同语言间的语义变换(交叉语义);(3)设计一个描述混成系统的统一的描述语言并开发相应的实现和验证技术。
|
||||
混成系统是由离散和连续的多个子系统组合而成的混成模型。尽管近年来已有很多处理混成系统的语言和系统工具,每个语言和工具对环境做出不同的假设,导致混成系统难以在不同的语言和工具之间共享信息。因此,需要解决混成系统中各个子系统的一致性问题,从而最大限度地利用现有的语言和工具。主要研究内容包括:(1)审阅和比较现有混成系统语言和工具的语义、表达能力和数学机制,发掘它们的差异;(2)设计一种语义感知的交换格式,便于描述不同语言间的语义变换(交叉语义);(3)设计一个描述混成系统的统一的描述语言并开发相应的实现和验证技术。
|
||||
|
||||
\subsection{支持共享内存模型的并发程序设计}\label{2_3_2_5}
|
||||
由于处理器和编译器对程序的优化,大多数处理器和程序设计语言(如C++或Java)无法提供理想化的顺序一致性(Sequential Consistency)内存模型\index{内存模型}。近年,来对内存一致性模型的形式化定义成为研究的热点,包括对处理器(如x86、Arm、Power等)和并发程序设计语言(如C++和Java等)的内存模型的设计与实现等。然而,现有程序设计语言的内存模型仍然存在较多问题。Java和C++的内存模型仍然过于复杂,且允许程序产生违背直观的行为,特别是跟程序逻辑完全无关的行为(即所谓的out-of-thin-air行为,简写为OOTA)。因此这些内存模型还有待改进。另一方面,经典的并发验证逻辑和既有分析、测试、验证工具无法直接应用于弱内存模型程序,我们需要新的理论和工具支持。针对以上不足,我们需要解决以下问题:(1)改良现有的程序设计语言中的内存模型,避免内存模型中的OOTA行为;(2)基于改良后的内存模型,给出新型的并发程序验证、分析、测试的技术,保证弱内存模型下的并发程序编译及执行的正确性。
|
||||
|
||||
|
||||
\subsection{智能合约的设计语言和开发环境}
|
||||
|
||||
智能合约是一种以信息化方式传播、验证或执行合同的计算机协议,允许在没有第三方的情况下进行可信合约的签订。智能合约实质上是一种代码合约和算法合同,将成为未来数字社会的基础技术。它的主要研究内容包括:(1) 设计易于开发智能合约的设计语言;(2)研究规模化智能合约的自动生成技术;(3)研究适合于智能合约生命周期的形式化验证框架和验证方法;(4)实现智能合约的开发环境。
|
||||
|
||||
|
||||
\subsection{支持最终用户编程的程序设计语言}\label{2_3_2_6}
|
||||
最终用户程序设计主要涉及两条研究路线。一条路线是从教育的角度出发,把现有程序设计语言中的概念用更简单直观的图形化方式表达出来,使得没有学过程序设计的人也能很快熟悉和掌握。这其中的代表语言就是Scratch\cite{Resnick:2009:SP:1592761.1592779}。Scratch采用类似程序流程图的方式表达顺序、选择、循环等概念,使得没有接受过计算机教育的儿童和老人也可以通过简单拖动鼠标就能完成想要的程序。目前Scratch已经广泛用于儿童教育中,用于培养儿童的计算思维。此外,一些智能家居和智能机器人设备也引入了类似的语言来进行简单的程序设计。为此,在设计此类语言的时候,需要设计一组被最终用户所能接受和使用的语言构造,并由相关支撑环境实现将用户设计的程序“编译”为可以被具体执行的程序。另一方面,这类面向最终用户的程序设计语言一般都比较简单。且最终用户在程序设计时经常出错。如何能提升此类程序设计语言的表达及容错能力,将成为一个值得研究的问题。
|
||||
|
||||
|
||||
最终用户程序设计\index{最终用户程序设计}的另一条路线是针对特定领域让用户用最自然的方式表达需求,同时用程序综合的方式来完成程序的构造\cite{ DBLP:journals/ftpl/GulwaniPS17}。这方面的一个典型例子是Excel。Excel从2017起引入了基于样例的程序合成方法,该方法允许用户对于一列或一行单元格中的几个数据提供计算结果的样例,然后Excel自动根据样例推测出用户想要撰写的程序,并自动填充其它单元格数据。然而,上述基于样例的程序合成方法并不适合很多应用场景。我们需要研究更多适用于不同应用场景和不同用户级别的需求表达方式,以及将这些需求转换成程序的方法。
|
||||
|
||||
最终用户程序设计主要涉及两条研究路线。一条路线是从教育的角度出发,把现有程序设计语言中的概念用更简单直观的图形化方式表达出来,使得没有学过程序设计的人也能很快熟悉和掌握。研究内容包括:(1)设计一组被最终用户所能接受和使用的语言构造,并通过相关支撑环境实现将用户设计的程序“编译”为可以被具体执行的程序; (2)研究提升此类程序设计语言的表达及容错能力的方法。\index{最终用户程序设计}的另一条路线是针对特定领域让用户用最自然的方式表达需求,同时用程序综合的方式来完成程序的构造\cite{ DBLP:journals/ftpl/GulwaniPS17}。主要研究内容包括:(1)研究适用于不同应用场景和不同用户级别的需求表达方式;(2)研究将这些需求自动转换成程序的方法。
|
||||
|
||||
最终用户程序设计的一个重要应用领域是应对面向人机物融合的大趋势,为最终用户提供控制网络上设备的编程方式。目前,在这个方向上已经有一些典型的应用,包括为智能家居的物联网设备编程。比如,物联网编程语言IFTTT采用了IF语句作为基础编程单元,主要表达不同条件满足的时候设备应该采用的动作。很多主流的智能家居企业比如小米、华为都采用了这种编程模型。但目前编程模型的能力还有较大局限性,一些需求无法完全表达;同时在程序变得比较复杂的时候,基于IFTTT的编程方式也容易带来预期之外的交互,引起较难调试的问题。
|
||||
|
||||
|
||||
\subsection{程序设计框架和程序设计开发环境}\label{2_3_2_7}
|
||||
程序设计语言与编程环境、程序设计框架、程序设计工具需要协同发展。近几十年来程序设计的努力主要体现在框架及工具等方面。例如.NET Framework里有超过一万个类及十万个方法,现有的编译器和解释器之间的界限越来越模糊。类似的,现在的IDE包含了无数强大的功能,例如语法提示,重构,调试器等。上述程序设计框架、工具等支撑着高层语言的普及和使用。因此,需要设计与开发与程序设计语言相匹配的程序设计框架和程序设计环境,支撑多范式程序设计,并集成程序搜索、推荐、自动修复等功能,以支持程序员轻易地开发出更强大的应用\cite{ DBLP:journals/ftpl/VechevY16}。
|
||||
程序设计语言与编程环境、程序设计框架、程序设计工具需要协同发展。近几十年来程序设计的努力主要体现在框架及工具等方面。例如.NET Framework里有超过一万个类及十万个方法,现有的编译器和解释器之间的界限越来越模糊。类似的,现在的IDE包含了无数强大的功能,例如语法提示,重构,调试器等。上述程序设计框架、工具等支撑着高层语言的普及和使用。因此,需要设计与开发与程序设计语言相匹配的程序设计框架和程序设计环境,支撑多范型程序设计,并集成程序搜索、推荐、自动修复等功能,以支持程序员轻易地开发出更强大的应用\cite{ DBLP:journals/ftpl/VechevY16}。
|
||||
|
||||
\subsection{特定领域语言的元编程和开发环境}\label{2_3_2_8}
|
||||
程序设计语言方面另一个研究内容是构建支持特定领域语言的定义和实现的开发环境。这个环境需支持高效而正确地设计和实现众多的领域特定语言,抓住不同领域的计算特征,便于领域专家使用。同时,为了高效组合不同领域的计算特征,需要构建“面向语言”的程序设计环境。面向语言的程序设计明确鼓励开发人员构建自己的领域特定语言,或者将具有特定领域概念的现有语言作为方法的一部分进行扩展。利用这个环境,程序员在软件开发时不是只使用一种语言,而是使用最适合每项任务的语言,然后把它们有机组合在一起。例如,MPS (Meta Programming System) 等语言工作台是面向语言方法的重要组成部分。使用MPS,可以为任何新语言定义编辑器,使得领域特定语言的使用更简便。即使是不熟悉传统程序设计的领域专家,也可以在MPS中使用领域特定语言。
|
||||
|
@ -201,5 +213,4 @@
|
|||
|
||||
|
||||
\section{本章小结}
|
||||
如果说软件是社会的基础,那么程序设计语言就是软件的核心。泛在计算促使我们设计各式各样的满足某种性质的领域特定程序设计语言,研究语言随着时间和环境的改变而变化的演化和生长机制,并开发一个全新的“基于语言”的软件设计方法和支撑环境。在这一章里,我们指出了新时代程序设计语言的几个挑战性问题,有些问题并不是新的,但是它们被赋予新的内涵。作为参考,我们也列出了一些重要的研究内容,希望能够通过这些具体研究来迎接这些挑战。
|
||||
|
||||
如果说软件是社会的基础,那么程序设计语言就是软件的基础。泛在计算促使我们,设计各式各样的适合某种框架或具有某种特性的领域特定程序设计语言,使得人人能编程;研究语言随着时间和环境的改变而变化的演化和生长机制;并开发一个全新的“基于语言”的软件设计方法和支撑环境。在这一章里,我们指出了新时代程序设计语言的几个挑战性问题,有些问题并不是新的,但是它们被赋予新的内涵。作为参考,本章也列出了一些重要的研究内容,希望能够通过这些具体研究来迎接这些挑战。
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
% !TEX root = main.tex
|
||||
|
||||
\section{引言}
|
||||
“人-机-物”三元融合的新型应用模式, 通过综合应用物联网、移动互联网、通信、大数据计算、人工智能等技术,使人类社会(人)、信息空间(机)、物理世界(物)之间实现互联,形成以人为中心的新社会形态\cite{赵兰香等主编2013科技发展新态势与面向}。其中,软件是关键要素;而围绕软件的各类元素之间也存在着复杂的依赖关系,并最终形成了软件生态。软件生态\index{软件生态}是指各类软件制品(包括开发态和运行态)、软件涉众(包括开发者、使用者和维护者等)和软件设施(包括承载软件制品开发与运行的物理设施及其作用的物理设施),围绕软件相关的各种活动(包括开发、使用、服务、维护、演化等),形成的相互依赖和相互作用的网络系统,如图\ref{fig:fig1}所示。随着互联网的发展和软件技术的发展,这些依赖关系使得软件制品越来越依赖于其所存在的软件生态,逐渐推动软件生态化,成为软件产业的未来发展趋势。
|
||||
|
||||
|
|
2
main.tex
2
main.tex
|
@ -82,7 +82,7 @@
|
|||
\chapter{操作系统与运行平台}
|
||||
\input{Ch2-5-OperatingSystem}
|
||||
|
||||
\chapter{数据管理}
|
||||
\chapter{数据管理与数据工程}
|
||||
\input{Ch2-6-DataManagement}
|
||||
|
||||
\chapter{面向领域的应用软件系统}
|
||||
|
|
665
references.bib
665
references.bib
|
@ -1,3 +1,668 @@
|
|||
@ARTICLE{Schmidt:2006:MDE,
|
||||
author={D. C. {Schmidt}},
|
||||
journal={Computer},
|
||||
title={Guest Editor's Introduction: Model-Driven Engineering},
|
||||
year={2006},
|
||||
volume={39},
|
||||
number={2},
|
||||
pages={25-31},
|
||||
keywords={Model-driven engineering;Programming languages;MDE tools;Software development;Enterprise DRE systems;System design;Model driven engineering;Computer aided software engineering;Application software;Software tools;Space technology;Telecommunications;Biology computing;Debugging;Writing;Quality of service;Model-driven engineering;Programming languages;MDE tools;Software development;Enterprise DRE systems;System design},
|
||||
doi={10.1109/MC.2006.58},
|
||||
ISSN={1558-0814},
|
||||
month={Feb},}
|
||||
|
||||
|
||||
@book{Booch:1999:UML:291167,
|
||||
author = {Booch, Grady and Rumbaugh, James and Jacobson, Ivar},
|
||||
title = {The Unified Modeling Language User Guide},
|
||||
year = {1999},
|
||||
isbn = {0-201-57168-4},
|
||||
publisher = {Addison Wesley Longman Publishing Co., Inc.},
|
||||
address = {Redwood City, CA, USA},
|
||||
}
|
||||
|
||||
|
||||
@article{Dean:2008:MSD:1327452.1327492,
|
||||
author = {Dean, Jeffrey and Ghemawat, Sanjay},
|
||||
title = {MapReduce: Simplified Data Processing on Large Clusters},
|
||||
journal = {Commun. ACM},
|
||||
issue_date = {January 2008},
|
||||
volume = {51},
|
||||
number = {1},
|
||||
month = jan,
|
||||
year = {2008},
|
||||
issn = {0001-0782},
|
||||
pages = {107--113},
|
||||
numpages = {7},
|
||||
url = {http://doi.acm.org/10.1145/1327452.1327492},
|
||||
doi = {10.1145/1327452.1327492},
|
||||
acmid = {1327492},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
@inproceedings{Hudak:2007:HHL:1238844.1238856,
|
||||
author = {Hudak, Paul and Hughes, John and Peyton Jones, Simon and Wadler, Philip},
|
||||
title = {A History of Haskell: Being Lazy with Class},
|
||||
booktitle = {Proceedings of the Third ACM SIGPLAN Conference on History of Programming Languages},
|
||||
series = {HOPL III},
|
||||
year = {2007},
|
||||
isbn = {978-1-59593-766-7},
|
||||
location = {San Diego, California},
|
||||
pages = {12-1--12-55},
|
||||
url = {http://doi.acm.org/10.1145/1238844.1238856},
|
||||
doi = {10.1145/1238844.1238856},
|
||||
acmid = {1238856},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
@inproceedings{Gordon:1978:MIP:512760.512773,
|
||||
author = {Gordon, M. and Milner, R. and Morris, L. and Newey, M. and Wadsworth, C.},
|
||||
title = {A Metalanguage for Interactive Proof in LCF},
|
||||
booktitle = {Proceedings of the 5th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages},
|
||||
series = {POPL '78},
|
||||
year = {1978},
|
||||
location = {Tucson, Arizona},
|
||||
pages = {119--130},
|
||||
numpages = {12},
|
||||
url = {http://doi.acm.org/10.1145/512760.512773},
|
||||
doi = {10.1145/512760.512773},
|
||||
acmid = {512773},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
@article{Backus:1978:PLV:359576.359579,
|
||||
author = {Backus, John},
|
||||
title = {Can Programming Be Liberated from the Von Neumann Style?: A Functional Style and Its Algebra of Programs},
|
||||
journal = {Commun. ACM},
|
||||
issue_date = {Aug. 1978},
|
||||
volume = {21},
|
||||
number = {8},
|
||||
month = aug,
|
||||
year = {1978},
|
||||
issn = {0001-0782},
|
||||
pages = {613--641},
|
||||
numpages = {29},
|
||||
url = {http://doi.acm.org/10.1145/359576.359579},
|
||||
doi = {10.1145/359576.359579},
|
||||
acmid = {359579},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
keywords = {algebra of programs, applicative computing systems, applicative state transition systems, combining forms, functional forms, functional programming, metacomposition, models of computing systems, program correctness, program termination, program transformation, programming languages, von Neumann computers, von Neumann languages},
|
||||
}
|
||||
|
||||
|
||||
@article{Floyd:1979:PP:359138.359140,
|
||||
author = {Floyd, Robert W.},
|
||||
title = {The Paradigms of Programming},
|
||||
journal = {Commun. ACM},
|
||||
issue_date = {Aug. 1979},
|
||||
volume = {22},
|
||||
number = {8},
|
||||
month = aug,
|
||||
year = {1979},
|
||||
issn = {0001-0782},
|
||||
pages = {455--460},
|
||||
numpages = {6},
|
||||
url = {http://doi.acm.org/10.1145/359138.359140},
|
||||
doi = {10.1145/359138.359140},
|
||||
acmid = {359140},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
@inproceedings{Liskov:1974:PAD:800233.807045,
|
||||
author = {Liskov, Barbara and Zilles, Stephen},
|
||||
title = {Programming with Abstract Data Types},
|
||||
booktitle = {Proceedings of the ACM SIGPLAN Symposium on Very High Level Languages},
|
||||
year = {1974},
|
||||
location = {Santa Monica, California, USA},
|
||||
pages = {50--59},
|
||||
numpages = {10},
|
||||
url = {http://doi.acm.org/10.1145/800233.807045},
|
||||
doi = {10.1145/800233.807045},
|
||||
acmid = {807045},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
@inproceedings{Ritchie:1993:DCL:154766.155580,
|
||||
author = {Ritchie, Dennis M.},
|
||||
title = {The Development of the C Language},
|
||||
booktitle = {The Second ACM SIGPLAN Conference on History of Programming Languages},
|
||||
series = {HOPL-II},
|
||||
year = {1993},
|
||||
isbn = {0-89791-570-4},
|
||||
location = {Cambridge, Massachusetts, USA},
|
||||
pages = {201--208},
|
||||
numpages = {8},
|
||||
url = {http://doi.acm.org/10.1145/154766.155580},
|
||||
doi = {10.1145/154766.155580},
|
||||
acmid = {155580},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
|
||||
@article{Chamberlin:2012:EHS:2420618.2420665,
|
||||
author = {Chamberlin, Don},
|
||||
title = {Early History of SQL},
|
||||
journal = {IEEE Ann. Hist. Comput.},
|
||||
issue_date = {October 2012},
|
||||
volume = {34},
|
||||
number = {4},
|
||||
month = oct,
|
||||
year = {2012},
|
||||
issn = {1058-6180},
|
||||
pages = {78--82},
|
||||
numpages = {5},
|
||||
url = {https://doi.org/10.1109/MAHC.2012.61},
|
||||
doi = {10.1109/MAHC.2012.61},
|
||||
acmid = {2420665},
|
||||
publisher = {IEEE Educational Activities Department},
|
||||
address = {Piscataway, NJ, USA},
|
||||
keywords = {IBM, Ray Boyce, SQL, SQL standard, Sequel, Ted Codd, history of computing, relational data model},
|
||||
}
|
||||
|
||||
@incollection{Naur:1978:ESL:800025.1198353,
|
||||
author = {Naur, Peter},
|
||||
chapter = {The European Side of the Last Phase of the Development of ALGOL 60},
|
||||
title = {History of Programming Languages},
|
||||
editor = {Wexelblat, Richard L.},
|
||||
year = {1981},
|
||||
isbn = {0-12-745040-8},
|
||||
pages = {92--139},
|
||||
numpages = {48},
|
||||
url = {http://doi.acm.org/10.1145/800025.1198353},
|
||||
doi = {10.1145/800025.1198353},
|
||||
acmid = {1198353},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
@incollection{Perlis:1978:ASD:800025.1198352,
|
||||
author = {Perlis, Alan J.},
|
||||
chapter = {The American Side of the Development of ALGOL},
|
||||
title = {History of Programming Languages},
|
||||
editor = {Wexelblat, Richard L.},
|
||||
year = {1981},
|
||||
isbn = {0-12-745040-8},
|
||||
pages = {75--91},
|
||||
numpages = {17},
|
||||
url = {http://doi.acm.org/10.1145/800025.1198352},
|
||||
doi = {10.1145/800025.1198352},
|
||||
acmid = {1198352},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
@inproceedings{Wirth:1993:RDP:154766.155378,
|
||||
author = {Wirth, N.},
|
||||
title = {Recollections About the Development of Pascal},
|
||||
booktitle = {The Second ACM SIGPLAN Conference on History of Programming Languages},
|
||||
series = {HOPL-II},
|
||||
year = {1993},
|
||||
isbn = {0-89791-570-4},
|
||||
location = {Cambridge, Massachusetts, USA},
|
||||
pages = {333--342},
|
||||
numpages = {10},
|
||||
url = {http://doi.acm.org/10.1145/154766.155378},
|
||||
doi = {10.1145/154766.155378},
|
||||
acmid = {155378},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
|
||||
@inproceedings{Colmerauer:1993:BP:154766.155362,
|
||||
author = {Colmerauer, Alain and Roussel, Philippe},
|
||||
title = {The Birth of Prolog},
|
||||
booktitle = {The Second ACM SIGPLAN Conference on History of Programming Languages},
|
||||
series = {HOPL-II},
|
||||
year = {1993},
|
||||
isbn = {0-89791-570-4},
|
||||
location = {Cambridge, Massachusetts, USA},
|
||||
pages = {37--52},
|
||||
numpages = {16},
|
||||
url = {http://doi.acm.org/10.1145/154766.155362},
|
||||
doi = {10.1145/154766.155362},
|
||||
acmid = {155362},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
@incollection{McCarthy:1978:HL:800025.1198360,
|
||||
author = {McCarthy, John},
|
||||
chapter = {History of LISP},
|
||||
title = {History of Programming Languages},
|
||||
editor = {Wexelblat, Richard L.},
|
||||
year = {1981},
|
||||
isbn = {0-12-745040-8},
|
||||
pages = {173--185},
|
||||
numpages = {13},
|
||||
url = {http://doi.acm.org/10.1145/800025.1198360},
|
||||
doi = {10.1145/800025.1198360},
|
||||
acmid = {1198360},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
@inproceedings{Stroustrup:1993:HC:154766.155375,
|
||||
author = {Stroustrup, Bjarne},
|
||||
title = {A History of C++: 1979\&Ndash;1991},
|
||||
booktitle = {The Second ACM SIGPLAN Conference on History of Programming Languages},
|
||||
series = {HOPL-II},
|
||||
year = {1993},
|
||||
isbn = {0-89791-570-4},
|
||||
location = {Cambridge, Massachusetts, USA},
|
||||
pages = {271--297},
|
||||
numpages = {27},
|
||||
url = {http://doi.acm.org/10.1145/154766.155375},
|
||||
doi = {10.1145/154766.155375},
|
||||
acmid = {155375},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
|
||||
@inproceedings{Kay:1993:EHS:154766.155364,
|
||||
author = {Kay, Alan C.},
|
||||
title = {The Early History of Smalltalk},
|
||||
booktitle = {The Second ACM SIGPLAN Conference on History of Programming Languages},
|
||||
series = {HOPL-II},
|
||||
year = {1993},
|
||||
isbn = {0-89791-570-4},
|
||||
location = {Cambridge, Massachusetts, USA},
|
||||
pages = {69--95},
|
||||
numpages = {27},
|
||||
url = {http://doi.acm.org/10.1145/154766.155364},
|
||||
doi = {10.1145/154766.155364},
|
||||
acmid = {155364},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
|
||||
@incollection{Nygaard:1978:DSL:800025.1198392,
|
||||
author = {Nygaard, Kristen and Dahl, Ole-Johan},
|
||||
chapter = {The Development of the SIMULA Languages},
|
||||
title = {History of Programming Languages},
|
||||
editor = {Wexelblat, Richard L.},
|
||||
year = {1981},
|
||||
isbn = {0-12-745040-8},
|
||||
pages = {439--480},
|
||||
numpages = {42},
|
||||
url = {http://doi.acm.org/10.1145/800025.1198392},
|
||||
doi = {10.1145/800025.1198392},
|
||||
acmid = {1198392},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
|
||||
@incollection{Sammet:1978:EHC:800025.1198367,
|
||||
author = {Sammet, Jean E.},
|
||||
chapter = {The Early History of COBOL},
|
||||
title = {History of Programming Languages},
|
||||
editor = {Wexelblat, Richard L.},
|
||||
year = {1981},
|
||||
isbn = {0-12-745040-8},
|
||||
pages = {199--243},
|
||||
numpages = {45},
|
||||
url = {http://doi.acm.org/10.1145/800025.1198367},
|
||||
doi = {10.1145/800025.1198367},
|
||||
acmid = {1198367},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
|
||||
@article{Backus:1978:HFI:960118.808380,
|
||||
author = {Backus, John},
|
||||
title = {The History of FORTRAN I, II, and III},
|
||||
journal = {SIGPLAN Not.},
|
||||
issue_date = {August 1978},
|
||||
volume = {13},
|
||||
number = {8},
|
||||
month = aug,
|
||||
year = {1978},
|
||||
issn = {0362-1340},
|
||||
pages = {165--180},
|
||||
numpages = {16},
|
||||
url = {http://doi.acm.org/10.1145/960118.808380},
|
||||
doi = {10.1145/960118.808380},
|
||||
acmid = {808380},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
|
||||
@article{Lucy:1997:LinguisticRelativity,
|
||||
author = {Lucy, John A.},
|
||||
title = {Linguistic Relativity},
|
||||
journal = {Annual Review of Anthropology},
|
||||
volume = {26},
|
||||
number = {1},
|
||||
pages = {291-312},
|
||||
year = {1997},
|
||||
doi = {10.1146/annurev.anthro.26.1.291},
|
||||
URL = {
|
||||
https://doi.org/10.1146/annurev.anthro.26.1.291
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@book{Clarke:2000:MC:332656,
|
||||
author = {Clarke,Jr., Edmund M. and Grumberg, Orna and Peled, Doron A.},
|
||||
title = {Model Checking},
|
||||
year = {1999},
|
||||
isbn = {0-262-03270-8},
|
||||
publisher = {MIT Press},
|
||||
address = {Cambridge, MA, USA},
|
||||
}
|
||||
|
||||
@book{陆汝钤:2017:计算系统的形式语义,
|
||||
author={陆汝钤},
|
||||
title={计算系统的形式语义},
|
||||
isbn={9787302414940},
|
||||
year={2017},
|
||||
publisher={清华大学出版社}
|
||||
}
|
||||
|
||||
@article{floyd:1967:assigning,
|
||||
title={ASSIGNING MEANINGS TO PROGRAMS},
|
||||
author={Floyd, Robert W},
|
||||
journal={Mathematical Aspects of Computer Science},
|
||||
volume={19},
|
||||
pages={19},
|
||||
year={1967},
|
||||
publisher={American Mathematical Soc.}
|
||||
}
|
||||
|
||||
@article{Kramer:2007:AKC:1232743.1232745,
|
||||
author = {Kramer, Jeff},
|
||||
title = {Is Abstraction the Key to Computing?},
|
||||
journal = {Commun. ACM},
|
||||
issue_date = {April 2007},
|
||||
volume = {50},
|
||||
number = {4},
|
||||
month = apr,
|
||||
year = {2007},
|
||||
issn = {0001-0782},
|
||||
pages = {36--42},
|
||||
numpages = {7},
|
||||
url = {http://doi.acm.org/10.1145/1232743.1232745},
|
||||
doi = {10.1145/1232743.1232745},
|
||||
acmid = {1232745},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
|
||||
@book{Booch:2007:ooadwa,
|
||||
title={Object-Oriented Analysis and Design with Applications},
|
||||
author={Booch, Grady and Maksimchuk, Robert and Engle, Michael and Conallen, Jim and Houston, Kelli and Young, Bobbi},
|
||||
year={2007},
|
||||
publisher={Pearson Education}
|
||||
}
|
||||
|
||||
@article{Booch:1986:OD:9794.9797,
|
||||
author = {Booch, G},
|
||||
title = {Object-oriented Development},
|
||||
journal = {IEEE Trans. Softw. Eng.},
|
||||
issue_date = {Feb. 1986},
|
||||
volume = {12},
|
||||
number = {2},
|
||||
month = feb,
|
||||
year = {1986},
|
||||
issn = {0098-5589},
|
||||
pages = {211--221},
|
||||
numpages = {11},
|
||||
url = {http://dl.acm.org/citation.cfm?id=9794.9797},
|
||||
acmid = {9797},
|
||||
publisher = {IEEE Press},
|
||||
address = {Piscataway, NJ, USA},
|
||||
}
|
||||
|
||||
@article{Tukey:1958:Software,
|
||||
ISSN = {00029890, 19300972},
|
||||
URL = {http://www.jstor.org/stable/2310294},
|
||||
author = {John W. Tukey},
|
||||
journal = {The American Mathematical Monthly},
|
||||
number = {1},
|
||||
pages = {1--9},
|
||||
publisher = {Mathematical Association of America},
|
||||
title = {The Teaching of Concrete Mathematics},
|
||||
volume = {65},
|
||||
year = {1958}
|
||||
}
|
||||
|
||||
@inproceedings{Ridgway:1952:CR:800259.808980,
|
||||
author = {Ridgway, Richard K.},
|
||||
title = {Compiling Routines},
|
||||
booktitle = {Proceedings of the 1952 ACM National Meeting (Toronto)},
|
||||
series = {ACM '52},
|
||||
year = {1952},
|
||||
location = {Toronto, Ontario, Canada},
|
||||
pages = {1--5},
|
||||
numpages = {5},
|
||||
url = {http://doi.acm.org/10.1145/800259.808980},
|
||||
doi = {10.1145/800259.808980},
|
||||
acmid = {808980},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
}
|
||||
|
||||
@article{Aspray:1986:IDC:1435661.1436778,
|
||||
author = {Aspray, William},
|
||||
title = {International Diffusion of Computer Technology, 1945-1955},
|
||||
journal = {IEEE Ann. Hist. Comput.},
|
||||
issue_date = {October 1986},
|
||||
volume = {8},
|
||||
number = {4},
|
||||
month = oct,
|
||||
year = {1986},
|
||||
issn = {1058-6180},
|
||||
pages = {351--360},
|
||||
numpages = {10},
|
||||
url = {https://doi.org/10.1109/MAHC.1986.10063},
|
||||
doi = {10.1109/MAHC.1986.10063},
|
||||
acmid = {1436778},
|
||||
publisher = {IEEE Educational Activities Department},
|
||||
address = {Piscataway, NJ, USA},
|
||||
}
|
||||
|
||||
@article{Mei:2012:ISP:2311627.2311662,
|
||||
author = {Mei, Hong and Huang, Gang and Xie, Tao},
|
||||
title = {Internetware: A Software Paradigm for Internet Computing},
|
||||
journal = {Computer},
|
||||
issue_date = {June 2012},
|
||||
volume = {45},
|
||||
number = {6},
|
||||
month = jun,
|
||||
year = {2012},
|
||||
issn = {0018-9162},
|
||||
pages = {26--31},
|
||||
numpages = {6},
|
||||
url = {https://doi.org/10.1109/MC.2012.189},
|
||||
doi = {10.1109/MC.2012.189},
|
||||
acmid = {2311662},
|
||||
publisher = {IEEE Computer Society Press},
|
||||
address = {Los Alamitos, CA, USA},
|
||||
keywords = {Chinese software community, Internet computing, Internetware, computing in Asia, software paradigms},
|
||||
}
|
||||
|
||||
@book{Kuhn:1970:StructureSciRev,
|
||||
address = {Chicago},
|
||||
author = {Kuhn, Thomas S.},
|
||||
booktitle = {The Structure of Scientific Revolutions},
|
||||
keywords = {science},
|
||||
pages = {xii, 210},
|
||||
publisher = {University of Chicago Press},
|
||||
timestamp = {2010-03-07T03:02:09.000+0100},
|
||||
title = {The structure of scientific revolutions},
|
||||
year = 1970
|
||||
}
|
||||
|
||||
@inproceedings{Lu:2009:ISS:1640206.1640213,
|
||||
author = {L\"{u}, Jian and Ma, Xiaoxing and Huang, Yu and Cao, Chun and Xu, Feng},
|
||||
title = {Internetware: A Shift of Software Paradigm},
|
||||
booktitle = {Proceedings of the First Asia-Pacific Symposium on Internetware},
|
||||
series = {Internetware '09},
|
||||
year = {2009},
|
||||
isbn = {978-1-60558-872-8},
|
||||
location = {Beijing, China},
|
||||
pages = {7:1--7:9},
|
||||
articleno = {7},
|
||||
numpages = {9},
|
||||
url = {http://doi.acm.org/10.1145/1640206.1640213},
|
||||
doi = {10.1145/1640206.1640213},
|
||||
acmid = {1640213},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
keywords = {Internetware, open environment, software engineering, software methodology, software paradigm},
|
||||
}
|
||||
|
||||
@article{Huhns:2005:SCK:1053547.1053596,
|
||||
author = {Huhns, Michael N. and Singh, Munindar P.},
|
||||
title = {Service-Oriented Computing: Key Concepts and Principles},
|
||||
journal = {IEEE Internet Computing},
|
||||
issue_date = {January 2005},
|
||||
volume = {9},
|
||||
number = {1},
|
||||
month = jan,
|
||||
year = {2005},
|
||||
issn = {1089-7801},
|
||||
pages = {75--81},
|
||||
numpages = {7},
|
||||
url = {https://doi.org/10.1109/MIC.2005.21},
|
||||
doi = {10.1109/MIC.2005.21},
|
||||
acmid = {1053596},
|
||||
publisher = {IEEE Educational Activities Department},
|
||||
address = {Piscataway, NJ, USA},
|
||||
keywords = {SOA, SOC, Web services, service-oriented architectures, service-oriented computing},
|
||||
}
|
||||
|
||||
@book{Heineman:2001:CSE:379381,
|
||||
editor = {Heineman, George T. and Councill, William T.},
|
||||
title = {Component-based Software Engineering: Putting the Pieces Together},
|
||||
year = {2001},
|
||||
isbn = {0-201-70485-4},
|
||||
publisher = {Addison-Wesley Longman Publishing Co., Inc.},
|
||||
address = {Boston, MA, USA},
|
||||
}
|
||||
|
||||
@book{Meyer:1997:OSC:261119,
|
||||
author = {Meyer, Bertrand},
|
||||
title = {Object-oriented Software Construction (2Nd Ed.)},
|
||||
year = {1997},
|
||||
isbn = {0-13-629155-4},
|
||||
publisher = {Prentice-Hall, Inc.},
|
||||
address = {Upper Saddle River, NJ, USA},
|
||||
}
|
||||
|
||||
@article{Naur:1960:ALG:1061146.1061147,
|
||||
author = {Naur, Peter},
|
||||
title = {ALGOL 60},
|
||||
journal = {ALGOL Bull.},
|
||||
issue_date = {Mar. 1960},
|
||||
number = {9},
|
||||
month = mar,
|
||||
year = {1960},
|
||||
issn = {0084-6198},
|
||||
pages = {1--1},
|
||||
numpages = {1},
|
||||
url = {http://dl.acm.org/citation.cfm?id=1061146.1061147},
|
||||
acmid = {1061147},
|
||||
publisher = {Computer History Museum},
|
||||
address = {Mountain View, CA, United States},
|
||||
}
|
||||
|
||||
@book{Dahl:1972:SP:1243380,
|
||||
editor = {Dahl, O. J. and Dijkstra, E. W. and Hoare, C. A. R.},
|
||||
title = {Structured Programming},
|
||||
year = {1972},
|
||||
isbn = {0-12-200550-3},
|
||||
source = {Library of Congress Catalog Card Number: 72-84452},
|
||||
publisher = {Academic Press Ltd.},
|
||||
address = {London, UK, UK},
|
||||
}
|
||||
|
||||
|
||||
|
||||
@book{Mei:2016:INS:3086926,
|
||||
author = {Mei, Hong and Jian, L.},
|
||||
title = {Internetware: A New Software Paradigm for Internet Computing},
|
||||
year = {2016},
|
||||
isbn = {9789811025457, 9811025452},
|
||||
edition = {1st},
|
||||
publisher = {Springer Publishing Company, Incorporated},
|
||||
}
|
||||
|
||||
|
||||
@article{Cameron:2018:ComputingEdge,
|
||||
author = {Lori Cameron},
|
||||
title = {What to Know About the Scientist Who Invented the Term "Software Engineering"},
|
||||
journal = {IEEE ComputingEdge},
|
||||
pages = {230-265},
|
||||
month = November,
|
||||
year = {2018},
|
||||
}
|
||||
|
||||
|
||||
|
||||
@book{Naur:1969:SER:1102020,
|
||||
editor = {Naur, Peter and Randell, Brian},
|
||||
title = {Software Engineering: Report of a Conference Sponsored by the NATO Science Committee, Garmisch, Germany, 7-11 Oct. 1968, Brussels, Scientific Affairs Division, NATO},
|
||||
year = {1969},
|
||||
}
|
||||
|
||||
@book{Cooper:2002:CT:961908,
|
||||
author = {Cooper, Barry S.},
|
||||
title = {Computability Theory},
|
||||
year = {2002},
|
||||
isbn = {1584882379},
|
||||
publisher = {CRC Press, Inc.},
|
||||
address = {Boca Raton, FL, USA},
|
||||
}
|
||||
|
||||
|
||||
@article{Cook:1983:OCC:358141.358144,
|
||||
author = {Cook, Stephen A.},
|
||||
title = {An Overview of Computational Complexity},
|
||||
journal = {Commun. ACM},
|
||||
issue_date = {June 1983},
|
||||
volume = {26},
|
||||
number = {6},
|
||||
month = jun,
|
||||
year = {1983},
|
||||
issn = {0001-0782},
|
||||
pages = {400--408},
|
||||
numpages = {9},
|
||||
url = {http://doi.acm.org/10.1145/358141.358144},
|
||||
doi = {10.1145/358141.358144},
|
||||
acmid = {358144},
|
||||
publisher = {ACM},
|
||||
address = {New York, NY, USA},
|
||||
keywords = {computational complexity},
|
||||
}
|
||||
|
||||
|
||||
@article{Turing:1937:ComputableNumbers,
|
||||
author = {Turing, A. M.},
|
||||
title = {On Computable Numbers, with an Application to the Entscheidungsproblem},
|
||||
journal = {Proceedings of the London Mathematical Society},
|
||||
volume = {s2-42},
|
||||
number = {1},
|
||||
pages = {230-265},
|
||||
doi = {10.1112/plms/s2-42.1.230},
|
||||
url = {https://londmathsoc.onlinelibrary.wiley.com/doi/abs/10.1112/plms/s2-42.1.230},
|
||||
eprint = {https://londmathsoc.onlinelibrary.wiley.com/doi/pdf/10.1112/plms/s2-42.1.230},
|
||||
year = {1937}
|
||||
}
|
||||
|
||||
@article{Denning:1989:CD:63238.63239,
|
||||
author = {Comer, D. E. and Gries, David and Mulder, Michael C. and Tucker, Allen and Turner, A. Joe and Young, Paul R.},
|
||||
editor = {Denning, Peter J.},
|
||||
|
|
Loading…
Reference in New Issue