| advertise add site services publishers database health videos | ![]() | about toolbar stats live show health store more stuff JOIN/LOGIN |
OBJECT-ORIENTED PROGRAMMING AND APL benbest.com | Wellness Coaching Programs: Results-Oriented... myhealthcoach.com | Magee Rehabilitation - Magee's Horticultural Therapy Program and... mageerehab.org | Recognizing the Signs of Stroke is Feature of Stroke Awareness Program... hanoverhospital.org |
Feature Oriented Programming (FOP) or Feature Oriented Software Development (FOSD) is a general paradigm for program synthesis in software product lines.
FOSD arose out of layer-based designs and levels of abstraction in network protocols and extensible database systems in the late-1980s [1]. A program was a stack of layers. Each layer added functionality to previously composed layers and different compositions of layers produced different programs. Not surprisingly, there was a need for a compact language to express such designs. Elementary algebra fit the bill: each layer was function (program transformation) that added new code to an existing program to produce a new program, and a program's design was modeled by an expression, i.e., a composition of transformations (layers). The figure to the right illustrates the stacking of layers h, j, and i (where h is on the bottom and i is on the top). The algebraic notations i(j(h))and i•j•h expressed these designs. Over time, the idea of layers was generalized to features, where a feature is an increment in program development or functionality. The paradigm for program design and synthesis was recognized to be a generalization of relational query optimization, where query evaluation programs were defined as relational algebra expressions, and query optimization was expression evaluation [2].A software product line (SPL) is a family of programs where each program is defined by a unique composition of features, and no two programs have the same combination. FOSD has since evolved into the study of feature modularity, tools, analyses, and design techniques to support feature-based program synthesis. Further advances in FOSD arose from recognizing the following facts: Every program has multiple representations (e.g., source, makefiles, documentation, etc.) and adding a feature to a program could elaborate each of its representations so that all representations are consistent. Additionally, some of these representations could be generated (or derived) from other representations. In this article, the mathematics of the three most recent generations of FOSD, namely GenVoca[1], AHEAD[3], and FOMDD[4][5], are described, and links to product lines that have been developed using FOSD tools are provided. Also, four additional results that apply to all generations of FOSD are presented elsewhere: MetaModels, Program Cubes, Feature Algebras, and Feature Interactions.
[edit] GenVocaGenVoca (a meld of the names Genesis and Avoca)[1] is a compositional paradigm for defining programs of a product lines. Base programs are 0-ary functions or transformations called values: f -- base program with feature f h -- base program with feature h and features are unary functions/transformations that elaborate (modify, extend, refine) a program: i • x -- adds feature i to program x j • x -- adds feature j to program x where • denotes function composition. The design of a program is a named expression, e.g.: 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 A GenVoca model of a domain or software product line is a collection of base programs and features (see MetaModels and Program Cubes). The programs (expressions) that can be created defines a product line. Expression optimization is program design optimization, and expression evaluation is program synthesis.
GenVoca features were originally implemented using C preprocessor ( [edit] AHEADAlgebraic Hierarchical Equations for Application Design (AHEAD) [3] generalized GenVoca in two ways. First it revealed the internal structure of GenVoca values as tuples. Every program has multiple representations, such as source, documentation, bytecode, and makefiles. A GenVoca value is a tuple of program representations. In a product line of parsers, for example, a base parser f is defined by its grammar gf, Java source sf, and documentation df. Program f is modeled by the tuple f=[gf, sf, df]. Each program representation may have subrepresentations, and they too may have subrepresentations, recursively. In general, a GenVoca value is a tuple of nested tuples that define a hierarchy of representations for a particular program.
Second, AHEAD expresses features as nested tuples of unary functions called deltas. Deltas can be program refinements (semantics-preserving transformations), extensions (semantics-extending transformations), or interactions (semantics-altering transformations). We use the neutral term “delta” to represent all of these possibilities, as each occurs in FOSD. To illustrate, suppose feature j extends a grammar by Δgj (new rules and tokens are added), extends source code by Δsj (new classes and members are added and existing methods are modified), and extends documentation by Δdj. The tuple of deltas for feature j is modeled by j=[Δgj,Δsj,Δdj], which we call a delta tuple. Elements of delta tuples can themselves be delta tuples. As an example, Δsj represents the changes that are made to each class in sf by feature j, i.e., Δsj=[Δc1…Δcn]. The representations of a program are computed recursively by composing tuples element-wise. The representations for parser p (whose GenVoca expression is j•f) are: p2 = j • f -- GenVoca expression = [ Δgj, Δsj, Δdj] • [gf, sf, df] -- substitution = [Δgj•gf, Δsj•sf, Δdj•df] -- compose tuples element-wise That is, the grammar of p is the base grammar composed with its extension (Δgj•gf), the source of p is the base source composed with its extension (Δsj•sf), and so on. As elements of delta tuples can themselves be delta tuples, composition recurses, e.g., Δsj•sf= [Δc1…Δcn]•[c1…cn]=[Δc1•c1…Δcn•cn]. Summarizing, GenVoca values are nested tuples of program artifacts, and features are nested delta tuples, where • recursively composes them. This is the essence of AHEAD. The ideas presented above concretely expose two FOSD principles. The Principle of Uniformity states that all program artifacts are treated and refined in the same way. (This is evidenced by deltas for different artifact types above). The Principle of Scalability states all levels of abstractions are treated uniformly. (This gives rise to the hierarchical nesting of tuples above). The original implementation of AHEAD is the AHEAD Tool Suite and Jak language, which exhibits both the Principles of Uniformity and Scalability. Next-generation tools include CIDE [9] and FeatureHouse[10]. [edit] FOMDDFeature Oriented Model Driven Design (FOMDD) [4][5] combines the ideas of AHEAD with Model Driven Design (MDD) (a.k.a. Model-Driven Architecture (MDA)). AHEAD functions capture the lockstep update of program artifacts when a feature is added to a program. But there are other functional relationships among program artifacts that express derivations. For example, the relationship between a grammar gf and its parser source sf is defined by a compiler-compiler tool, e.g., javacc. Similarly, the relationship between Java source sf and its bytecode bf is defined by the javac compiler. A commuting diagram expresses these relationships. Objects are program representations, downward arrows are derivations, and horizontal arrows are deltas. The figure to the right shows the commuting diagram for program p3 = i•j•h = [g3,s3,b3]. A fundamental property of a commuting diagram is that all paths between two objects are equivalent. For example, one way to derive the bytecode b3 of parser p3 (lower right object in the above figure) from grammar gf of parser f (upper left object) is to derive the bytecode bf and refine to b3, while another way refines gf to g3, and then derive b3: Δbi • Δbj • javac • javacc = javac • javacc • Δgi • Δgj There are
Commuting diagrams are important for at least two reasons: (1) there is the possibility of optimizing the synthesis of artifacts (e.g., geodesics) and (2) they specify different ways of constructing a target object from a starting object.[4][11] A path through a diagram corresponds to a tool chain: for an FOMDD model to be consistent, it should be proven (or demonstrated through testing) that all tool chains that map one object to another in fact yield equivalent results. (If different paths/tool chains yield different results, then either there is a bug in one or more of the tools or the FOMDD model is wrong).
[edit] Applications
[edit] See also
[edit] References
|
| ↑ top of page ↑ | about thumbshots |