面向功能的编程
在计算机编程中,面向功能的编程( FOP )或面向功能的软件开发( FOSD )是用于软件产品线(SPLS)程序生成的编程范式以及程序的增量开发。
历史
FOSD在1980年代后期由基于层的设计和网络协议和可扩展数据库系统的抽像水平引起。程序是一堆层。每一层都将功能添加到先前组成的层和层的不同组成中产生了不同的程序。毫不奇怪,需要一种紧凑的语言来表达这种设计。基本代数符合帐单:每一层都是一个函数(程序转换),该函数将新代码添加到现有程序中以生成新程序,并且程序的设计是由表达式(即转换的组成)(层)建模的。左侧的图说明了I,J和H层的堆叠(H在底部,我在顶部)。代数符号I(J(H)),I•J•H和I+J+H表示这些设计。
随着时间的流逝,图层等同于功能,其中功能是程序功能的增加。程序设计和生成的范式被认为是关系查询优化的产物,其中查询评估程序被定义为关系代数表达式,并且查询优化是表达优化的。软件产品线是一个程序系列,每个程序都由功能的独特组成来定义。此后,FOSD已演变为对功能模块化,工具,分析和设计技术的研究,以支持基于功能的程序生成。
第二代FOSD研究是关于特征相互作用的,该研究起源于电信。后来,创造了以功能为导向的编程;这项工作暴露了层之间的相互作用。与其他功能组成时,互动需要调整功能。
第三代研究的重点是每个程序都有多个表示形式(例如,源,makefiles,文档等)并在程序中添加功能,应详细介绍其每个表示形式,以使所有人都保持一致。此外,可以从其他表示(或派生)产生某些表示形式。在下面的部分中,描述了FOSD的三个世代的数学,即Genvoca ,前方和FOMDD ,并提供了使用FOSD工具开发的产品线的链接。此外,适用于所有世代FOSD的其他四个结果是: FOSD元模型, FOSD程序立方体和FOSD特征交互。
Genvoca
Genvoca (名称Genesis和Avoca的Portmanteau )是用于定义产品线程序的组成范式。基本程序是0个ARY函数或称为值的转换:
f -- base program with feature f h -- base program with feature h
功能是详细(修改,扩展,完善)程序的一般函数/转换:
i + x -- adds feature i to program x j + x -- adds feature j to program x
其中 +表示功能组成。程序的设计是指定的表达式,例如:
p1 = j + f -- program p1 has features j and f p2 = j + h -- program p2 has features j and h p3 = i + j + h -- program p3 has features i, j, and h
域或软件产品线的Genvoca模型是基本程序和功能的集合(请参阅元模型和程序立方体)。可以创建的程序(表达式)定义产品线。表达优化是程序设计优化,表达评估是程序生成。
- 注意:GenVoca基于程序的逐步开发:强调设计简单性和可理解性的过程,这是程序理解和自动化程序构建的关键。考虑上面的程序p 3 :它以基本程序h开头,然后添加功能j(请阅读:功能j的功能j的功能添加到h的代码库中),最后添加了功能i(读:功能i的功能i是添加到J•H)的代码库中。
- 注意:并非所有功能的组合都是有意义的。特征模型(可以翻译成命题公式)是定义特征法律组合的图形表示。
- 注意:GenVoca的最新公式是对称的:只有一个基本程序,0(空程序),所有功能都是一单功能。这表明了Genvoca通过叠加组成程序结构的解释,即复杂结构是通过叠加简单结构组成的想法。 Genvoca的另一个重新印像是单型:Genvoca模型是一组具有组成操作(•)的特征。组成是关联的,并且有一个身份元素(即1个身份函数)。尽管所有构图都是可能的,但并非全部都是有意义的。这就是特征模型的原因。
最初使用C预处理器( #ifdef feature ... #endif
)技术实现了GenVoca功能。一种更先进的技术称为混合蛋白层,显示了功能与基于对象的协作设计的连接。
先
用于应用程序设计的代数层次方程(前方)的概括分别是两种方式。首先,它揭示了Genvoca值的内部结构作为元素。每个程序都有多个表示,例如源,文档,字节码和makefiles。 Genvoca值是程序表示的元组。例如,在解析器的产品线中,基本解析器f由其语法G F ,Java源S F和文档D f定义。解析器F由元组f = [g f ,s f ,d f ]建模。每个程序表示可能具有子代表,并且它们也可能具有子代表。通常,Genvoca值是嵌套元组的元组,它定义了特定程序的表示层次结构。
例子。假设终端表示为文件。在提前,语法g f对应于一个BNF文件,源S F对应于Java文件的元组[C 1 …C N ],并且文档D F是HTML文件的元组[H 1 …H K ]。 Genvoca值(嵌套的元组)可以描述为有向图:解析器F的图显示在右侧的图中。箭头表示预测,即从元组到其一个组件之一的映射。前面将元组实现为文件目录,因此F是一个包含文件g f和子目录的目录S F和D f 。同样,目录s f包含文件c 1 …c n ,并且目录df包含文件h 1 …h k 。
- 注意:文件可以在层次上进一步分解。每个Java类可以分解为成员元组和其他类声明(例如,初始化块等)。这里重要的想法是,前方的数学是递归的。
其次,前方表示的特征是称为deltas的一单位函数的嵌套单元。 Deltas可以是程序的改进(语义传播转换),扩展(语义扩展转换)或交互(语义 - 改变的转换)。我们使用中性术语“ delta”来表示所有这些可能性,因为每种可能性都在FOSD中。
为了说明,假设特征j扩展了Δgj的语法(添加了新规则和代币),将源代码扩展到δsj (添加了新类和成员并修改现有方法),并将文档扩展到ΔDJ 。特征J的元组由J = [ ΔGJ , δsJ , ΔDJ ]建模,我们称之为Delta Tuple 。三角洲元素的元素本身可以是三角洲的。示例: δsj表示由特征J,IE, ΔSj = [ ΔC1 … ΔCN ]对S F中每个类别进行的变化。程序的表示形式是通过嵌套向量添加递归计算的。解析器p 2的表示形式(其GenVoca表达为J+F)为:
p2 = j + f -- GenVoca expression = [Δgj, Δsj, Δdj] + [gf, sf, df] -- substitution = [Δgj+gf, Δsj+sf, Δdj+df] -- compose tuples element-wise
也就是说,P 2的语法是与其延伸( ΔGJ +G F )组成的基本语法,P 2的来源是与其延伸( ΔSJ +S F )组成的碱基源,等等。由于Delta元素的元素本身可以是Delta元素,例如,组成递归,例如, δsj +s f = [ ΔC1 … ΔCN ] +[C 1 …C N ] = [ ΔC1 +C 1 …ΔCN + C N ]。总结,Genvoca值是程序伪影的嵌套元组,特征是嵌套的三角洲元组,其中 +递归通过矢量添加它们来构成它们。这是前方的本质。
上面提出的想法具体揭示了两个FOSD原则。统一的原则指出,所有程序伪像以相同的方式对待和修改。 (上述不同的人工类型的三角洲证明了这一点)。可伸缩性的原理指示所有抽象的级别都均匀处理。 (这引起了上面元素的层次嵌套)。
前方的原始实现是前面的工具套件和JAK语言,它既表现出均匀性和可扩展性的原则。下一代工具包括CIDE和功能室。
fomdd
面向功能的模型驱动设计( FOMDD )将前方的想法与模型驱动设计( MDD )(又称模型驱动的体系结构( MDA ))结合在一起。当将功能添加到程序中时,FARE功能捕获了程序伪像的锁定更新。但是,在表达派生的程序伪像之间还有其他功能关系。例如,语法g f及其解析器源S f之间的关系由编译器 - 编译器工具(例如Javacc)定义。同样,Java源S F及其字节码B F之间的关系由Javac编译器定义。通勤图表达了这些关系。对像是程序表示,向下箭头是派生,水平箭头是deltas。右侧的图显示了程序p 3 = i+j+h = [g 3 ,s 3 ,b 3 ]的通勤图。
通勤图的一个基本属性是两个对象之间的所有路径都是等效的。例如,从Parser H的语法G H (左上对象)得出Parser p 3的字节码B 3 (右下方的右下对象)的一种方法是推导字节b h并完善到b 3 ,而另一种方式将G H分为G 3 ,然后得出B 3 ,其中 +代表Delta组成,()是函数或工具应用:
有从解析器h的语法g h得出解析器p 3的字节码B 3的可能路径。每个路径代表一个元图,其执行会从启动对象(g f )生成目标对象(b 3 )。有潜在的优化:穿越通勤图的每个箭头都有成本。通勤图中两个对象之间的最便宜(即,最短)路径是一个测量线,它代表了从给定对象产生目标对象的最有效的元图。
- 注意:“成本度量”不必是货币价值;成本可以在生产时间,峰值或总记忆需求,功耗或某些非正式指标中衡量,例如“易于解释”或上述组合(例如,多目标优化)。大地测量的概念是一般的,应该从这种更一般的背景下理解和欣赏。
- 注意:有可能在测量中有m启动对象和n结束对象;当M = 1和N> 1时,这是定向的Steiner树问题,它是NP-HARD。
通勤图至少有两个原因很重要:(1)有可能优化伪像的生成(例如,地球学),(2)他们指定了从起始对象构建目标对象的不同方法。通过图的路径对应于工具链:为了使FOMDD模型保持一致,应证明(或通过测试证明)所有将一个对象映射到另一个对象的工具链实际上会产生同等结果。如果不是这种情况,那么一个或多个工具中有一个错误,或者FOMDD模型是错误的。
- 注意:以上想法是受类别理论的启发。