<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.formulasearchengine.com/w/index.php?action=history&amp;feed=atom&amp;title=Material_failure_theory</id>
	<title>Material failure theory - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.formulasearchengine.com/w/index.php?action=history&amp;feed=atom&amp;title=Material_failure_theory"/>
	<link rel="alternate" type="text/html" href="https://en.formulasearchengine.com/w/index.php?title=Material_failure_theory&amp;action=history"/>
	<updated>2026-07-22T11:50:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.47.0-wmf.7</generator>
	<entry>
		<id>https://en.formulasearchengine.com/w/index.php?title=Material_failure_theory&amp;diff=22257&amp;oldid=prev</id>
		<title>en&gt;Bbanerje: /* See also */</title>
		<link rel="alternate" type="text/html" href="https://en.formulasearchengine.com/w/index.php?title=Material_failure_theory&amp;diff=22257&amp;oldid=prev"/>
		<updated>2013-05-23T02:12:54Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;See also&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Programming paradigms}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feature Oriented Programming&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;FOP&amp;#039;&amp;#039;&amp;#039;) or &amp;#039;&amp;#039;&amp;#039;Feature Oriented Software Development&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;FOSD&amp;#039;&amp;#039;&amp;#039;) is a general paradigm for program synthesis in [[software product lines]].&lt;br /&gt;
&lt;br /&gt;
[[Image:StackingLayers.jpg|thumb|Connection Between Layer Stacks and Transformation Compositions]]&lt;br /&gt;
&lt;br /&gt;
FOSD arose out of layer-based designs and levels of abstraction in network protocols and extensible database systems in the late-1980s.&amp;lt;ref name=&amp;quot;genvoca&amp;quot;&amp;gt;{{cite web | title=Design and Implementation of Hierarchical Software Systems with Reusable Components  | url=ftp://ftp.cs.utexas.edu/pub/predator/tosem-92.pdf}}&amp;lt;/ref&amp;gt;  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&amp;#039;s design was modeled by an expression, i.e., a composition of transformations (layers).  The figure below 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 express these designs.&lt;br /&gt;
&lt;br /&gt;
Over time, the idea of layers was generalized to features, where a &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;feature&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; 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.&amp;lt;ref name=&amp;quot;selinger&amp;quot;&amp;gt;{{cite web | title=Access Path Selection In Relational Databases | url=http://portal.acm.org/citation.cfm?id=582099}}&amp;lt;/ref&amp;gt; A &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;[[Software product lines|software product line]] (SPL)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; 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.&lt;br /&gt;
&lt;br /&gt;
Further advances in FOSD arose from recognizing the following facts: Every program has multiple representations (e.g., source, makefiles,&lt;br /&gt;
documentation, etc.) and adding a feature to a program should 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|GenVoca]],&amp;lt;ref name=&amp;quot;genvoca&amp;quot;/&amp;gt; [[#AHEAD|AHEAD]],&amp;lt;ref name=&amp;quot;ahead&amp;quot;&amp;gt;{{cite web | title=Scaling Step-Wise Refinement | url=ftp://ftp.cs.utexas.edu/pub/predator/TSE-AHEAD.pdf}}&amp;lt;/ref&amp;gt; and [[#FOMDD|FOMDD]]&amp;lt;ref name=&amp;quot;fomdd&amp;quot;/&amp;gt;&amp;lt;ref name=&amp;quot;genmeta&amp;quot;/&amp;gt; are &lt;br /&gt;
described, and links to product lines that have been developed using FOSD tools are provided.&lt;br /&gt;
Also, four additional results that apply to all generations of FOSD are presented elsewhere: [[FOSD metamodels|MetaModels]], [[FOSD Program Cubes|Program Cubes]], [[FOSD Feature Algebras|Feature Algebras]], and [[FOSD Feature Interactions|Feature Interactions]].&lt;br /&gt;
&lt;br /&gt;
== GenVoca ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;GenVoca&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (a meld of the names Genesis and Avoca)&amp;lt;ref name=&amp;quot;genvoca&amp;quot;/&amp;gt; is a compositional paradigm for defining programs of a product lines. Base programs are 0-ary functions or transformations called &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;values&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
   f      -- base program with feature f&lt;br /&gt;
   h      -- base program with feature h&lt;br /&gt;
&lt;br /&gt;
and features are unary functions/transformations that elaborate (modify, extend, refine) a program: &lt;br /&gt;
&lt;br /&gt;
   i • x  -- adds feature i to program x&lt;br /&gt;
   j • x  -- adds feature j to program x&lt;br /&gt;
&lt;br /&gt;
where • denotes function composition. The &amp;#039;&amp;#039;design&amp;#039;&amp;#039; of a program is a named expression, e.g.:&lt;br /&gt;
&lt;br /&gt;
   p&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; = j • f       -- program p&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; has features j and f&lt;br /&gt;
   p&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = j • h       -- program p&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; has features j and h&lt;br /&gt;
   p&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; = i • j • h   -- program p&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; has features i, j, and h&lt;br /&gt;
&lt;br /&gt;
A &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;GenVoca model&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; of a domain or software product line is a collection of base programs and features (see [[FOSD metamodels|MetaModels]] and [[FOSD Program Cubes|Program Cubes]]).&lt;br /&gt;
The programs (expressions) that can be created defines a product line. Expression optimization is &amp;#039;&amp;#039;program design optimization&amp;#039;&amp;#039;, and expression evaluation is &amp;#039;&amp;#039;program synthesis&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
: Note: GenVoca is based on the stepwise development of programs: a process that emphasizes design simplicity and understandability, which are key to  program comprehension and automated program construction. Consider program p&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; above: it begins with base program h, then feature j is added (read: the functionality of feature j is added to the codebase of h), and finally feature i is added (read: the functionality of feature i is added to the codebase of j•h).&lt;br /&gt;
&lt;br /&gt;
: Note: not all combinations of features are meaningful.  [[Feature Model|Feature models]] (which can be translated into propositional formulas) are graphical representations that define legal combinations of features.&amp;lt;ref name=&amp;quot;splc&amp;quot;&amp;gt;{{cite web | title=Feature Models, Grammars, and Propositional Formulas | url=ftp://ftp.cs.utexas.edu/pub/predator/splc05.pdf}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Note: A more recent formulation of GenVoca is &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;symmetric&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;: there is only one base program, 0 (the empty program), and all features are unary functions.  This suggests the interpretation that GenVoca composes program structures by &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;superposition&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;, the idea that complex structures are composed by superimposing simpler structures.&amp;lt;ref name=&amp;quot;amast08&amp;quot;&amp;gt;{{cite web | title=An Algebra for Features and Feature Composition | url=http://www.infosun.fim.uni-passau.de/cl/publications/docs/AMAST2008.pdf}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;symmetric&amp;quot;&amp;gt;{{cite web | title=Superimposition: A Language-Independent Approach to Software Composition | url=http://www.infosun.fim.uni-passau.de/cl/publications/docs/SC2008.pdf}}&amp;lt;/ref&amp;gt;  Yet another reformulation of GenVoca is as a [[monoid]]: a GenVoca model is a set of features with a composition operation (•); composition is associative and there is an identity element (namely 1, the identity function).  Although all compositions are possible, not all are meaningful as mentioned above.&lt;br /&gt;
&lt;br /&gt;
GenVoca features were originally implemented using C preprocessor (&amp;lt;code&amp;gt;#ifdef feature ... #endif&amp;lt;/code&amp;gt;) techniques.  A more advanced technique, called [[FOSD Mixin Layers|mixin layers]], showed the connection of features to object-oriented collaboration-based designs.&lt;br /&gt;
&lt;br /&gt;
== AHEAD ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Algebraic Hierarchical Equations for Application Design (AHEAD)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; &amp;lt;ref name=&amp;quot;ahead&amp;quot;/&amp;gt; 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 g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;, Java source s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;, and documentation d&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;. Program f is modeled by the tuple f=[g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;, d&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;]. 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.&lt;br /&gt;
&lt;br /&gt;
:: [[Image:Hierarchy.JPG|thumb|Hierarchical Relationships among Program Artifacts]] Example. Suppose terminal representations are files. In AHEAD, grammar g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; corresponds to a single BNF file, source s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; corresponds to a tuple of Java files [c&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;…c&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;], and documentation d&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; is a tuple of HTML files [h&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;…h&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;]. A GenVoca value (nested tuples) can be depicted as a directed graph: the graph for program f is shown in the figure to the right. Arrows denote projections, i.e., mappings from a tuple to one of its components. AHEAD implements tuples as file directories, so f is a directory containing file g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; and subdirectories s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; and d&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;. Similarly, directory s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; contains files c&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;…c&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;, and directory df contains files h&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;…h&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:: Note: Files can be hierarchically decomposed further. Each Java class can be decomposed into a tuple of members and other class declarations (e.g., initialization blocks, etc.).&lt;br /&gt;
&lt;br /&gt;
Second, AHEAD expresses features as nested tuples of unary functions called &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;deltas&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Deltas can be &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;program refinements&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (semantics-preserving transformations), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;extensions&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (semantics-extending transformations), &lt;br /&gt;
or &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;interactions&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (semantics-altering transformations). We use the neutral term “delta” to represent all of these possibilities, as each occurs in FOSD.&lt;br /&gt;
&lt;br /&gt;
To illustrate, suppose feature j extends a grammar by &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;g&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt; (new rules and tokens are added), extends source code by &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;s&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt; (new classes and members are added and existing methods are modified), and extends documentation by &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;d&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;. The tuple of deltas for feature j is modeled by j=[&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;g&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;s&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;d&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;], which we call a &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;delta tuple&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Elements of delta tuples can themselves be delta tuples. As an example, &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;s&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt; represents the changes that are made to each class in s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; by feature j, i.e., &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;s&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;=[&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;c&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;…&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;c&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;].&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
   p&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; = j • f                            -- GenVoca expression&lt;br /&gt;
      = [&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;g&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;, &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;s&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;, &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;d&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;] • [g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;, d&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;]   -- substitution&lt;br /&gt;
      = [&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;g&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;•g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;, &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;s&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;•s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;, &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;d&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;•d&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;]         -- compose tuples element-wise&lt;br /&gt;
&lt;br /&gt;
That is, the grammar of p is the base grammar composed with its extension (&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;g&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;•g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;), the source of p is the base source composed with its extension (&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;s&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;•s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;), and so on. As elements of delta tuples can themselves be delta tuples, composition recurses, e.g., &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;s&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;•s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;= &lt;br /&gt;
[&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;c&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;…&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;c&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;]•[c&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;…c&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;]=[&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;c&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;•c&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;…&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;c&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;•c&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;].&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
The ideas presented above concretely expose two FOSD principles.  The &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Principle of Uniformity&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; states that all program artifacts are treated and refined in the same way. (This is evidenced by deltas for different artifact types above). The &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Principle of Scalability&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; states all levels of abstractions are treated uniformly.  (This gives rise to the hierarchical nesting of tuples above).&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&amp;lt;ref name=&amp;quot;CIDE&amp;quot;&amp;gt;{{cite web| title=Guaranteeing Syntactic Correctness for all Product Line Variants: A Language-Independent Approach | url=ftp://ftp.cs.utexas.edu/pub/predator/Tools2009.pdf}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
and FeatureHouse.&amp;lt;ref name=&amp;quot;FH&amp;quot;&amp;gt;{{cite web| title=FeatureHouse: Language-Independent, Automated Software Composition | url=http://www.infosun.fim.uni-passau.de/cl/publications/docs/ICSE2009fh.pdf}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FOMDD ==&lt;br /&gt;
[[Image:CommutingDiagram.JPG|thumb|Derivational and Refinement Relationships among Program Artifacts]] &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Feature Oriented Model Driven Design (FOMDD)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; &amp;lt;ref name=&amp;quot;fomdd&amp;quot;&amp;gt;{{cite web| title=Feature Oriented Model Driven Development: A Case Study for Portlets | url=ftp://ftp.cs.utexas.edu/pub/predator/ICSE07.pdf}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;genmeta&amp;quot;&amp;gt;{{cite web| title=Generative Metaprogramming | url=http://portal.acm.org/citation.cfm?id=1289971.1289990}}&amp;lt;/ref&amp;gt; combines the ideas of AHEAD with &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Model Driven Design (MDD)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (a.k.a. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;[[Model-Driven Architecture]] (MDA)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;). 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 g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; and its parser source s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; is defined by a compiler-compiler tool, e.g., javacc. Similarly, the relationship between Java source s&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; and its bytecode b&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; 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 p&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; = i•j•h = [g&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;,s&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;,b&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
A fundamental property of a [[Commutative diagram|commuting diagram]] is that all paths between two objects are equivalent. For example, one way to derive the bytecode b&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; of parser p&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; (lower right object in the above figure) from &lt;br /&gt;
grammar g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; of parser f (upper left object) is to derive the bytecode b&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; and refine to b&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;, while another way refines g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; to g&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;, and then derive b&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;b&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; • &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;b&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt; • javac • javacc = javac • javacc • &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;g&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; • &amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;g&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are &amp;lt;math&amp;gt;\tbinom{4}{2}&amp;lt;/math&amp;gt; possible paths to derive the bytecode b&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; of parser p&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; from the grammar g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt; of parser f. Each path represents a [[Meta-programs|metaprogram]] whose execution synthesizes the target object (b&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;) from the starting object (g&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;). &lt;br /&gt;
There is a potential optimization: traversing each arrow of a [[commuting diagram]] has a cost. The cheapest (i.e., shortest) path between two objects in a [[commuting diagram]] is a &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;geodesic&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;, which represents the most efficient metaprogram that produces the target object from a given object.&lt;br /&gt;
&lt;br /&gt;
: Note: A “cost metric” need not be a monetary value; cost may be measured in production time, peak or total memory requirements, some informal metric like “ease of explanation”, or a combination of the above (e.g., [[Multiobjective optimization|multi-objective optimization]]). The idea of a geodesic is quite general, and should be understood and appreciated from this more general context.&lt;br /&gt;
&lt;br /&gt;
: Note: It is possible for there to be m starting objects and n ending objects in a geodesic; when m=1 and n&amp;gt;1, this is the [[Steiner tree|Directed Steiner Tree Problem]], which is NP-hard.&lt;br /&gt;
&lt;br /&gt;
[[Commuting diagram]]s 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.&amp;lt;ref name=&amp;quot;fomdd&amp;quot;/&amp;gt;&amp;lt;ref name=&amp;quot;testing&amp;quot;&amp;gt;{{cite web | title=Testing Software Product Lines Using Incremental Test Generation | url=ftp://ftp.cs.utexas.edu/pub/predator/ISSRE08.pdf }}&amp;lt;/ref&amp;gt; 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). &lt;br /&gt;
&lt;br /&gt;
: Note: the above ideas were inspired by [[category theory]].&amp;lt;ref name=&amp;quot;fomdd&amp;quot;/&amp;gt;&amp;lt;ref name=&amp;quot;genmeta&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Applications ==&lt;br /&gt;
&lt;br /&gt;
* [ftp://ftp.cs.utexas.edu/pub/predator/tosem-92.pdf Network Protocols]&lt;br /&gt;
* [ftp://ftp.cs.utexas.edu/pub/predator/tosem-92.pdf Extensible Database Systems]&lt;br /&gt;
* [ftp://ftp.cs.utexas.edu/pub/predator/sigsoft-93.pdf Data Structures]&lt;br /&gt;
* [ftp://ftp.cs.utexas.edu/pub/predator/fsatsRevised.pdf Distributed Army Fire Support Simulator]&lt;br /&gt;
* [ftp://ftp.cs.utexas.edu/pub/predator/sigsoft-94.pdf Production System Compiler]&lt;br /&gt;
* [ftp://ftp.cs.utexas.edu/pub/predator/GPL.pdf Graph Product Line]&lt;br /&gt;
* [ftp://ftp.cs.utexas.edu/pub/predator/ahead.pdf Extensible Java Preprocessors]&lt;br /&gt;
* [ftp://ftp.cs.utexas.edu/pub/predator/ICSE07.pdf Web Portlets]&lt;br /&gt;
* [ftp://ftp.cs.utexas.edu/pub/predator/icmt08.pdf SVG Applications]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
*[[FOSD metamodels|FOSD MetaModels]]—product lines of product lines&lt;br /&gt;
*[[FOSD Program Cubes]]—multi-dimensional product lines&lt;br /&gt;
*[[FOSD Feature Algebras]]—basic operations from which FOSD features (0-ary and 1-ary) functions are defined&lt;br /&gt;
*[[FOSD Feature Interactions]]—general concepts for feature interactions&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Feature-Oriented Programming}}&lt;br /&gt;
[[Category:Programming paradigms]]&lt;/div&gt;</summary>
		<author><name>en&gt;Bbanerje</name></author>
	</entry>
</feed>