From 611a58525b90d23548426e85516cb82b771e4fbd Mon Sep 17 00:00:00 2001 From: Zhenjiang Date: Mon, 14 Oct 2019 17:17:03 +0800 Subject: [PATCH] added index to some keywords. --- Ch2-3-SoftwareLanguage.tex | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Ch2-3-SoftwareLanguage.tex b/Ch2-3-SoftwareLanguage.tex index 6956b0f..7f89a3c 100644 --- a/Ch2-3-SoftwareLanguage.tex +++ b/Ch2-3-SoftwareLanguage.tex @@ -1,7 +1,7 @@ -世界离不开计算,描述计算离不开程序设计语言。不同的程序设计语言描述不同的计算模式,比如,命令式语言描述以状态的变换作为计算的模式,函数式语言描述以函数作为计算的模式,逻辑语言描述以证明作为计算的模式,而量子语言则描述量子计算的模式。在第\ref{book1-PL}章,我们对众多的程序设计语言进行了比较并回顾了程序设计语言的发展历史,从中我们可以看到,新的程序设计语言的出现通常是为了应对新的计算模式、新兴应用、或者新兴硬件和计算平台的需要。 +世界离不开计算,描述计算离不开\index{程序设计语言}。不同的程序设计语言描述不同的\index{计算模式},比如,命令式语言描述以状态的变换作为计算的模式,函数式语言描述以函数作为计算的模式,逻辑语言描述以证明作为计算的模式,而量子语言则描述量子计算的模式。在第\ref{book1-PL}章,我们对众多的程序设计语言进行了比较并回顾了程序设计语言的发展历史,从中我们可以看到,新的程序设计语言的出现通常是为了应对新的计算模式、新兴应用、或者新兴硬件和计算平台的需要。 -“软件定义一切”本质上是可编程思想扩张到整个社会和物理世界,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。随着人机物融合的发展,计算的泛在化成为必然,程序设计语言向下需要对物理世界进行抽象并提供处理物理世界的接口,向上需要能够处理不同场景的多范式的应用编程。泛在计算中不断涌现出的新的计算模式、新的计算平台和新的应用问题给程序设计语言的定义和实现带来了新的机遇和挑战。 +“软件定义一切”本质上是可编程思想扩张到整个社会和物理世界,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。随着人机物融合的发展,计算的泛在化成为必然,程序设计语言向下需要对物理世界进行抽象并提供处理物理世界的接口,向上需要能够处理不同场景的多范式的应用编程。\index{泛在计算}中不断涌现出的新的计算模式、新的计算平台和新的应用问题给程序设计语言的定义和实现带来了新的机遇和挑战。 首先,新的计算模式需要新的程序设计语言。随着不断涌现的新的计算模式,如适合于抽象描述机器学习的概率计算、神经网络计算、大数据计算、保护隐私的计算等,我们需要新的语言定义和实现技术,快速开发各种各样新的程序设计语言,支持各类新型计算模式。 @@ -19,7 +19,7 @@ 在这一章里,我们将从计算的泛在和多样性,计算平台,软件的复杂性和安全性,以及软件的生产效率等几个方面来讨论新时代软件设计语言与支撑环境方面的挑战,列出重要的研究内容,并阐述展示程序设计语言及支撑环境方面的研究趋势。 \section{重大挑战问题} -程序设计语言的挑战问题集中于如何建立、描述和实现抽象。具体来说,其挑战表现在两个方面。首先,在抽象建立和描述方面,主要表现在如何通过对领域和应用问题的抽象,开发有效的领域特定语言(§1.1)、支持多范式程序设计(§1.2),特别是加强大数据时代语言对数据处理的支持(§1.3)。其次,在抽象的实现方面,主要表现在如何开发人机物融合的泛在混合系统的编译技术(§1.4)和构建程序语言的安全性保障机制(§1.5)。 +程序设计语言的挑战问题集中于如何建立、描述和实现抽象。具体来说,其挑战表现在两个方面。首先,在抽象建立和描述方面,主要表现在如何通过对领域和应用问题的抽象,开发有效的\index{领域特定语言}(§1.1)、支持\index{多范式}程序设计(§1.2),特别是加强大数据时代语言对数据处理的支持(§1.3)。其次,在抽象的实现方面,主要表现在如何开发人机物融合的泛在混合系统的编译技术(§1.4)和构建程序语言的安全性保障机制(§1.5)。 \subsection{面向泛在计算的语言的定制} 随着泛在计算的普及,一方面,专用化的计算设备和运行平台需要软件具备面向不同专用硬件和平台的高效定制能力;另一方面,泛在服务软件需要提供各种特定的编程抽象,支持面向人机物融合的最终用户编程。在泛在计算的环境下,程序员的概念也不断泛化——未来越来越多的人,甚至那些缺乏足够计算机专业知识的领域专家,需要对专用化的设备或特定领域的问题进行程序设计。这就需要我们开发各式各样的领域特定语言。面向泛在的计算为领域特定语言的定义和实现带来了新的挑战。 @@ -33,16 +33,16 @@ 主流程序设计语言支持不同的程序设计范式。从程序设计语言的角度出发,一方面,需要设计与程序设计语言相适应的程序设计范式或者程序设计模型,以获取程序可读性、模块性、抽象性和性能上的平衡。另一方面,需要提供技术手段,根据程序员能力或者开发任务自动选择或者推荐程序设计范式,提升程序员程序设计效率。然而随着解决的问题越来越复杂,我们需要研究支持多范式的程序设计语言,以及对多范式语言的高效实现机制。特别是,我们面对下面一些挑战。 -首先,如何将描述函数计算最直接的函数式程序设计融合到其它语言中是多范式语言设计的一个挑战。函数式程序设计 (Hu, 2015)用函数来抽象计算,它的高阶函数和计算的透明性的两个重要特征,一方面使函数式语言适用于大数据处理、人工智能等领域,但是另一方面也使它不容易与其它语言共用。尽管已有不少关于研究和系统讨论如何融合逻辑语言与函数式语言,融合面向目标式语言和函数式语言,不少通用程序设计语言(C++和Java、Kotlin等)也开始支持函数式程序设计,但是,现在还没有一个公认的计算模型来系统地支持这种融合的设计和实现。如何将函数式语言的高阶函数和计算透明性有效而便捷地扩展至通用程序设计语言及支撑环境,以支持函数式程序设计或混合程序设计,成为一个值得关注的挑战问题。 +首先,如何将描述函数计算最直接的\index{函数式程序设计}融合到其它语言中是多范式语言设计的一个挑战。函数式程序设计 (Hu, 2015)用函数来抽象计算,它的高阶函数和计算的透明性的两个重要特征,一方面使函数式语言适用于大数据处理、人工智能等领域,但是另一方面也使它不容易与其它语言共用。尽管已有不少关于研究和系统讨论如何融合逻辑语言与函数式语言,融合面向目标式语言和函数式语言,不少通用程序设计语言(C++和Java、Kotlin等)也开始支持函数式程序设计,但是,现在还没有一个公认的计算模型来系统地支持这种融合的设计和实现。如何将函数式语言的高阶函数和计算透明性有效而便捷地扩展至通用程序设计语言及支撑环境,以支持函数式程序设计或混合程序设计,成为一个值得关注的挑战问题。 -其次,无缝融合并发程序设计是多范式语言设计和实现的另一个挑战。目前已经存在很多并发程序设计模型,它们指定了系统中的线程/进程如何通过协作来完成分配给它们的作业——不同的并发模型采用不同的方式拆分任务,线程/进程间的协作和交互方式也不相同。为此,需要建立与特定程序设计语言相适应的一组并发模型,更好支持程序员设计与实现并发任务。此外,传统的并发思维,是在单个处理器上,使用分时方式或是时间片模型来执行多个任务。如今的并发场景则正好相反,是将一个逻辑上的任务放在多个处理器或者多核上执行。因此,程序设计语言需要提供足够的机制来分解任务。然而,基于目前并发API,比如线程、线程池、监视等,编写并发程序依然很困难,还需要更多关于程序设计语言及实现方面的努力。例如,可以由编译器甚至执行引擎识别出程序中可并发的任务,以便多核计算机可以将其安全地并发执行。 +其次,无缝融\index{合并发程序设计}是多范式语言设计和实现的另一个挑战。目前已经存在很多并发程序设计模型,它们指定了系统中的线程/进程如何通过协作来完成分配给它们的作业——不同的并发模型采用不同的方式拆分任务,线程/进程间的协作和交互方式也不相同。为此,需要建立与特定程序设计语言相适应的一组并发模型,更好支持程序员设计与实现并发任务。此外,传统的并发思维,是在单个处理器上,使用分时方式或是时间片模型来执行多个任务。如今的并发场景则正好相反,是将一个逻辑上的任务放在多个处理器或者多核上执行。因此,程序设计语言需要提供足够的机制来分解任务。然而,基于目前并发API,比如线程、线程池、监视等,编写并发程序依然很困难,还需要更多关于程序设计语言及实现方面的努力。例如,可以由编译器甚至执行引擎识别出程序中可并发的任务,以便多核计算机可以将其安全地并发执行。 \subsection{大数据处理的程序语言支持} 当今时代是大数据的时代。全球的数据在不断地增多,依赖这些数据对各行各业进行优化是当今社会的发展趋势。大数据呈现出体量巨大,数据类型多样,数据增长速度快和数据价值密度低的4V特征,这就意味着要利用好数据中的价值,我们必须依赖于程序以自动化地管理和分析数据,从而给程序设计语言带来了一系列全新挑战。 -首先,大数据的一个特点是数据类型多样,但不同的人和不同的场合需要的数据是不一样的,这就意味着我们常常需要对数据按不同方式进行组织。数据自主性和数据互操作性给程序语言的设计带来挑战。一方面,当我们按照某一种特定格式获取到数据的时候,需要把数据转换成其他格式保存和展示。另一方面,当我们修改了其中一份数据的时候,需要保证其它保存的数据和展示的视图都能对应修改。如果用传统程序设计语言编写这样的数据同步程序有两方面的问题:(1) 重复的编码工作量大:对于两种数据的同步一般需要编写两份转换程序,但这两份转换程序很多部分是重复的。(2) 很容易出现错误:两份转换程序容易写得不一致。因此,需要新的程序设计语言来处理此类数据管理需求。 +首先,\index{大数据}的一个特点是数据类型多样,但不同的人和不同的场合需要的数据是不一样的,这就意味着我们常常需要对数据按不同方式进行组织。数据自主性和数据互操作性给程序语言的设计带来挑战。一方面,当我们按照某一种特定格式获取到数据的时候,需要把数据转换成其他格式保存和展示。另一方面,当我们修改了其中一份数据的时候,需要保证其它保存的数据和展示的视图都能对应修改。如果用传统程序设计语言编写这样的数据同步程序有两方面的问题:(1) 重复的编码工作量大:对于两种数据的同步一般需要编写两份转换程序,但这两份转换程序很多部分是重复的。(2) 很容易出现错误:两份转换程序容易写得不一致。因此,需要新的程序设计语言来处理此类数据管理需求。 其次,大数据具有体量巨大、数据增长快的特点。这就意味着,要对海量的大数据进行分析,不但人工无法完成,小型计算机系统通常也无法完成。要完成海量的数据分析,往往需要包含多个CPU的大型机系统,或者由多个中小型计算机联网形成的集群系统。但是,用普通程序设计语言编写这类集群系统上的大数据处理程序非常复杂,因为程序员必须处理并行任务分解、多CPU/计算机调度、进程/线程同步等一系列问题。需要新的程序设计语言来降低大数据处理程序的编写难度。尽管MapReduce, Pregel等面向大数据处理的并行计算模型已经提出,但是基于这些模型的程序语言要么接近于模型、用户难以使用,要么用户容易写,但是缺少优化方法、运行效率低。需要新的程序设计语言来解决此类数据计算需求。 @@ -51,12 +51,12 @@ 最后,大数据具有价值密度低的特点,这就意味着如果要发挥大数据的作用,需要采用合适的方式对数据进行统计。有效的统计方法往往需要我们针对数据的特点构建统计模型,然后根据统计模型对数据进行统计。比如,现在流行的神经网络需要用户首先给出网络结构,然后根据数据确定网络中参数数值。而基于统计学的概率图方法需要先确定随机变量的分布和随机变量之间的依赖关系,然后基于数据确定随机变量的后验分布。这些统计模型的编写较为复杂,同时给定模型之后的统计算法也比较复杂,因此,需要有新的程序设计语言来支持这类模型的描述(如概率编程等)、验证和测试。 \subsection{面向人机物融合的混合编译} -编译器是程序设计语言的重要支撑环境,其负责将一种语言(通常为高级语言)所书写的程序变换成另一种语言(通常为低级语言)程序。编译器的另一个主要功能是对程序进行优化,提升软件的性能。现代软件系统呈现人机物融合的泛在混合特性,对编译技术也带来新的挑战。 +\index{编译器}是程序设计语言的重要支撑环境,其负责将一种语言(通常为高级语言)所书写的程序变换成另一种语言(通常为低级语言)程序。编译器的另一个主要功能是对程序进行优化,提升软件的性能。现代软件系统呈现人机物融合的泛在混合特性,对编译技术也带来新的挑战。 首先,编译器需要能够快速对应不断出现的专用处理器。摩尔定律的逐渐失效以及大数据处理深度学习等新应用需求的出现,正助推计算机行业从通用计算机系统,转向一个青睐专用微处理器和专用存储系统等专用硬件的时代。这种转变需要我们研究新的更有效的编译技术。当一个新的硬件出现之后,首先,应该对专用硬件进行抽象,定义一个底层使用该硬件的领域特定语言(DSL);然后,扩充现有的语言,为之提供一个高层次的界面,以便用户描述专用硬件上的计算;最后,定义如何将高层次的程序翻译到底层的DSL。为了支持这个过程,我们需要研究自动编译技术——我们预测未来的编译器能够在SMT等求解器的帮助下自动生成能在专用处理器上运行的的目标程序,通过重写策略对目标程序自动优化,且保证编译过程的正确性和代码质量。 -其次,编译器需要能够高效地处理混合系统。现在的软件系统越来越复杂,形成了一个混合的系统,需要既能处理离散的又能处理连续的计算,既能处理决定性(逻辑式)的又能处理概率性的计算,既针对命令式的又针对函数式的程序设计语言,既可静态类型检查又可以动态确认程序满足的性质。为了开发这样的复杂的软件系统,混合语言以及相应编译技术变得非常重要。此外,复杂软件系统可能由不同程序设计语言书写的程序组成。对不同程序设计语言所书写的程序进行高效混合编译,也是一个值得关注的研究问题。 +其次,编译器需要能够高效地处理\index{混合系统}。现在的软件系统越来越复杂,形成了一个混合的系统,需要既能处理离散的又能处理连续的计算,既能处理决定性(逻辑式)的又能处理概率性的计算,既针对命令式的又针对函数式的程序设计语言,既可静态类型检查又可以动态确认程序满足的性质。为了开发这样的复杂的软件系统,混合语言以及相应编译技术变得非常重要。此外,复杂软件系统可能由不同程序设计语言书写的程序组成。对不同程序设计语言所书写的程序进行高效混合编译,也是一个值得关注的研究问题。 \subsection{程序设计语言的安全性保障} 程序设计语言的安全性,体现在两个方面:程序设计语言自身的安全性设计与其支撑环境(如库、编译器、解释器、运行时等)的安全性保障。程序设计语言的设计者和实现者都在不遗余力的提升程序设计语言的安全性。当前,程序设计语言的安全性方面,还存在以下的重大挑战问题。 @@ -76,7 +76,7 @@ edge from parent path={(\tikzparentnode.south) |- (\tikzchildnode.west)}] \node{程序设计语言主要研究内容} child {node{语言设计} - child {node {传统语言设计} + child {node {传统语言设计} child {node {类型系统}} child {node {语言定义}} child {node {内存模型}} @@ -84,7 +84,7 @@ child [missing] {} child [missing] {} child [missing] {} - child {node {新型语言设计} + child {node {新型语言设计} child {node {泛在计算} child {node {\it 软件定义网络的程序设计语言}} child {node {软件定义内存的程序设计语言}} @@ -125,7 +125,7 @@ child [missing] {} child [missing] {} child [missing] {} - child {node {语言实现和支撑环境} + child {node {语言实现和支撑环境} child {node {编译器设计与实现}} child {node {程序分析与验证}} child {node {程序综合与精化}} @@ -137,7 +137,7 @@ child [missing] {} child [missing] {} child [missing] {} - child {node {语言生态} + child {node {语言生态} child {node {\it 程序设计框架和库}} child {node {\it 特定领域语言的元编程和开发环境}} child {node {\it 程序设计语言的生态及其演化规律}} @@ -164,7 +164,7 @@ 数据在我们的生活中无处不在。在一个医疗保健系统中,医院、药房、患者都有各自的数据,为了保护隐私,这些数据没有被集中统一管理,而是以一种非中心的方式分散在不同的系统中。如何安全地共享和交换信息从而实现非中心数据的互操作成为现代社会亟需解决的一个重要问题。为了解决这个问题,需要将非中心数据的互操作问题分解为(1)局部的隐私控制问题、(2)全局的数据同步问题、(3)联系局部和全局的软件体系结构问题。每个问题的解决都需要我们设计好的程序设计语言,从而实现一个高可信且可扩展的非中心数据的互操作系统。目前,研究人员提出的双向变换语言(Czarnecki,2009)能够保证两种数据的一致性,为部分解决数据的互操作提供一个好的解决方案,值得进一步深入研究。 -解决数据统计问题的途径是设计程序设计语言来编写统计模型。目前的统计模型语言主要包括两类。一类是支持神经网络编写的语言,代表语言包括TensorFlow(Abadi, 2016)、PyTorch(Paszke, 2017)等。神经网络要求构造出一个网络结构,同时网络上的所有运算都要是能求导的。神经网络的程序设计语言通过限定程序中的运算必须是由可求导的操作构成来保证网络是可以求导的,并利用微积分中的求导算法自动求导来完成网络的训练。此外,神经网络语言通常包括大数据分析语言的功能,可以将运算分配到多个CPU或者多台计算机上,应对大数据程序的运算量要求。另一类是概率程序设计语言,代表语言包括Stan (Carpenter, 2017)、PyMC (Patil, 2010)等。概率程序设计语言主要用于编写一个概率模型,包括随机变量、随机变量的分布和相互关系等,允许程序员指定一些模型上的观察值,通过贝叶斯统计来对模型其他部分的随机变量计算后验分布。概率程序设计语言通常提供一系列分析算法和采样算法用于求解和近似求解模型,同时部分语言也提供并行计算能力,以支持用于在大型机/集群系统上快速求解。 +解决数据统计问题的途径是设计程序设计语言来编写统计模型。目前的统计模型语言主要包括两类。一类是支持\index{神经网络}编写的语言,代表语言包括TensorFlow(Abadi, 2016)、PyTorch(Paszke, 2017)等。神经网络要求构造出一个网络结构,同时网络上的所有运算都要是能求导的。神经网络的程序设计语言通过限定程序中的运算必须是由可求导的操作构成来保证网络是可以求导的,并利用微积分中的求导算法自动求导来完成网络的训练。此外,神经网络语言通常包括大数据分析语言的功能,可以将运算分配到多个CPU或者多台计算机上,应对大数据程序的运算量要求。另一类是概率程序设计语言,代表语言包括Stan (Carpenter, 2017)、PyMC (Patil, 2010)等。\index{概率程序设计}语言主要用于编写一个概率模型,包括随机变量、随机变量的分布和相互关系等,允许程序员指定一些模型上的观察值,通过贝叶斯统计来对模型其他部分的随机变量计算后验分布。概率程序设计语言通常提供一系列分析算法和采样算法用于求解和近似求解模型,同时部分语言也提供并行计算能力,以支持用于在大型机/集群系统上快速求解。 \subsection{面向软件定义网络的程序设计语言} @@ -174,13 +174,13 @@ 混成系统是由离散和连续的多个子系统组合而成的混合模型。尽管近年来已有很多处理混成系统的语言和系统工具,每个语言和工具对环境做出不同的假设,导致混成系统难以在不同的语言和工具之间共享信息。因此,需要解决混合系统中各个子系统的一致性问题,从而最大限度地利用现有的语言和工具。主要研究内容包括:(1)审阅和比较现有混成系统语言和工具的语义、表达能力和数学机制,发掘它们的差异;(2)设计一种语义感知的交换格式,便于描述不同语言间的语义变换(交叉语义);(3)设计一个描述混成系统的统一的描述语言并开发相应的实现和验证技术。 \subsection{支持共享内存模型的并发程序设计} -由于处理器和编译器对程序的优化,大多数处理器和程序设计语言(如C++或Java)无法提供理想化的顺序一致性(sequential consistency)内存模型。近年,来对内存一致性模型的形式化定义成为研究的热点,包括对处理器(如x86、Arm、Power等)和并发程序设计语言(如C++和Java等)的内存模型的设计与实现等。然而,现有程序设计语言的内存模型仍然存在较多问题。Java和C++的内存模型仍然过于复杂,且允许程序产生违背直观的行为,特别是跟程序逻辑完全无关的行为(即所谓的out-of-thin-air行为,简写为OOTA)。因此这些内存模型还有待改进。另一方面,经典的并发验证逻辑和既有分析、测试、验证工具无法直接应用于弱内存模型程序,我们需要新的理论和工具支持。针对以上不足,我们需要解决以下问题:(1)改良现有的程序设计语言中的内存模型,避免内存模型中的OOTA行为;(2)基于改良后的内存模型,给出新型的并发程序验证、分析、测试的技术,保证弱内存模型下的并发程序编译及执行的正确性。 +由于处理器和编译器对程序的优化,大多数处理器和程序设计语言(如C++或Java)无法提供理想化的顺序一致性(sequential consistency)\index{内存模型}。近年,来对内存一致性模型的形式化定义成为研究的热点,包括对处理器(如x86、Arm、Power等)和并发程序设计语言(如C++和Java等)的内存模型的设计与实现等。然而,现有程序设计语言的内存模型仍然存在较多问题。Java和C++的内存模型仍然过于复杂,且允许程序产生违背直观的行为,特别是跟程序逻辑完全无关的行为(即所谓的out-of-thin-air行为,简写为OOTA)。因此这些内存模型还有待改进。另一方面,经典的并发验证逻辑和既有分析、测试、验证工具无法直接应用于弱内存模型程序,我们需要新的理论和工具支持。针对以上不足,我们需要解决以下问题:(1)改良现有的程序设计语言中的内存模型,避免内存模型中的OOTA行为;(2)基于改良后的内存模型,给出新型的并发程序验证、分析、测试的技术,保证弱内存模型下的并发程序编译及执行的正确性。 \subsection{支持最终用户编程的程序设计语言} 最终用户程序设计主要涉及两条研究路线。一条路线是从教育的角度出发,把现有程序设计语言中的概念用更简单直观的图形化方式表达出来,使得没有学过程序设计的人也能很快熟悉和掌握。这其中的代表语言就是Scratch(Resnick, 2009)。Scratch采用类似程序流程图的方式表达顺序、选择、循环等概念,使得没有接受过计算机教育的儿童和老人也可以通过简单拖动鼠标就能完成想要的程序。目前Scratch已经广泛用于儿童教育中,用于培养儿童的计算思维。此外,一些智能家居和智能机器人设备也引入了类似的语言来进行简单的程序设计。为此,在设计此类语言的时候,需要设计一组被最终用户所能接受和使用的语言构造,并由相关支撑环境实现将用户设计的程序“编译”为可以被具体执行的程序。另一方面,这类面向最终用户的程序设计语言一般都比较简单。且最终用户在程序设计时经常出错。如何能提升此类程序设计语言的表达及容错能力,将成为一个值得研究的问题。 -最终用户程序设计的另一条路线是针对特定领域让用户用最自然的方式表达需求,同时用程序综合的方式来完成程序的构造。这方面的一个典型例子是Excel。Excel从2017起引入了基于样例的程序合成方法(Polozov, 2015),该方法允许用户对于一列或一行单元格中的几个数据提供计算结果的样例,然后Excel自动根据样例推测出用户想要撰写的程序,并自动填充其它单元格数据。然而,上述基于样例的程序合成方法并不适合很多应用场景。我们需要研究更多适用于不同应用场景和不同用户级别的需求表达方式,以及将这些需求转换成程序的方法。 +\index{最终用户程序设计}的另一条路线是针对特定领域让用户用最自然的方式表达需求,同时用程序综合的方式来完成程序的构造。这方面的一个典型例子是Excel。Excel从2017起引入了基于样例的程序合成方法(Polozov, 2015),该方法允许用户对于一列或一行单元格中的几个数据提供计算结果的样例,然后Excel自动根据样例推测出用户想要撰写的程序,并自动填充其它单元格数据。然而,上述基于样例的程序合成方法并不适合很多应用场景。我们需要研究更多适用于不同应用场景和不同用户级别的需求表达方式,以及将这些需求转换成程序的方法。 最终用户程序设计的一个重要应用领域是应对面向人机物融合的大趋势,为最终用户提供控制网络上设备的编程方式。目前,在这个方向上已经有一些典型的应用,包括为智能家居的物联网设备编程。比如,IFTTT采用了IF语句作为基础编程单元,主要表达不同条件满足的时候设备应该采用的动作。很多主流的智能家居企业比如小米、华为都采用了这种编程模型。但目前编程模型的能力还有较大局限性,一些需求无法完全表达;同时在程序变得比较复杂的时候,基于IFTTT的编程方式也容易带来预期之外的交互,引起较难调试的问题。