<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Using Algebra-Algorithmic and Term Rewriting Tools for Developing Efficient Parallel Programs</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Anatoliy Doroshenko</string-name>
          <email>doroshenkoanatoliy2@gmail.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Kostiantyn Zhereb</string-name>
          <email>zhereb@gmail.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Olena Yatsenko</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Institute of Software Systems of National Academy of Sciences of Ukraine</institution>
          ,
          <addr-line>Glushkov prosp. 40, 03187 Kyiv</addr-line>
          ,
          <country country="UA">Ukraine</country>
        </aff>
      </contrib-group>
      <fpage>38</fpage>
      <lpage>46</lpage>
      <abstract>
        <p>An approach to program design and synthesis using algebraalgorithmic specifications and rewriting rules techniques is proposed. An algebra-algorithmic toolkit based on the approach allows building syntactically correct and easy-to-understand algorithm specifications. The term rewriting system supplements the algebra-algorithmic toolkit with facilities for transformation of the sequential and parallel algorithms, enabling their improvement.</p>
      </abstract>
      <kwd-group>
        <kwd />
        <kwd>Algebra of algorithms</kwd>
        <kwd>code generation</kwd>
        <kwd>formalized design of programs</kwd>
        <kwd>parallel computation</kwd>
        <kwd>term rewriting</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        Nowadays uniprocessor systems are almost fully forced out by multiprocessor ones,
as the latter allow getting the considerable increase of productivity of programs. Thus,
the need of program parallelization arises [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. There are libraries, such as pthreads,
OpenMP, TBB and others [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], allowing developers to write parallel programs. Using
these libraries a programmer manually divides code into independent sections,
describes data exchange and synchronization between them. However, such method has
substantial defects, in particular, related to committing of errors into program code
and a time required for parallelization and debugging. Therefore, the parallelization
process has to be automatized as much as possible, and in an ideal, should be carried
out fully automatically, without participation of a programmer.
      </p>
      <p>
        This paper continues our research on automation of process of designing and
development of efficient parallel programs, started in [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Our approach
is based on usage of Integrated toolkit for Designing and Synthesis of programs (IDS)
[
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. The process of algorithm designing in IDS consists in the composition of
reusable algorithmic components (language operations, basic operators and
predicates), represented in Systems of Algorithmic Algebras (SAA) [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. We used
IDS for generation of sequential and parallel programs in Java and C++ on the basis
of high-level algorithm specifications (schemes). To automate the transformations of
algorithms and programs we use term rewriting system Termware [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. The
novelty of this paper is 1) adjusting IDS to generate parallel code in Cilk++ language,
which is an extension to the C and C++ programming languages, designed for
multithreaded parallel computing [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] and 2) closer integration between IDS and Termware
systems. The approach is illustrated on a recursive sorting algorithm (quick sort).
      </p>
      <p>
        The problem of automated synthesis of program code from specifications has been
studied extensively and many approaches have been proposed [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. Important
aspects of program synthesis include 1) format of inputs (specifications), 2) methods
for supporting concrete subject domains and 3) techniques for implementing
transformation from specifications to output program code (these aspects roughly
correspond to 3 dimensions of program synthesis discussed in [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]). For input
specification, a popular option is using domain-specific languages (DSLs) [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ] that allow
capturing requirements of subject domain. Other options include graphical modeling
languages [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], formal specification languages [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ], ontologies [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] and algebraic
specifications [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Using such formalisms enables analysis and verification of
specifications and generated code. There are also approaches that provide specification not
of program or algorithm, but of problem to be solved, in form of functional and
nonfunctional constraints [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ], examples of input/output pairs [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ], or natural language
descriptions [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ].
      </p>
      <p>
        Another crucial aspect of program synthesis is specialization for subject domain.
Some approaches are restricted to a single domain, such as statistical data analysis
[
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] or mobile application development [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]; others provide facilities for changing
domain-specific parts, by using ontological descriptions [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], grammars [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ], or by
providing generic framework that is complemented by domain-specific tools [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ].
      </p>
      <p>
        Finally, an important aspect is transformation from input specification into source
code in a target language. A transformation algorithm can be hand-coded [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], but it
reduces flexibility of system. Therefore, transformation is often described in a
declarative form, such as rewriting rules [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ], visualized graph transformations [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ],
code templates [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. More complex approaches require searching the space of possible
programs [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ], possibly using genetic programming or machine learning approaches
[
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. In [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], partial synthesis is proposed: generic parts of application are generated,
and then completed with specific details manually.
      </p>
      <p>
        In comparison, our approach uses algebraic specifications, based on Glushkov
algebra of algorithms [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], but they can be represented in three equivalent forms:
algebraic (formal language), natural-linguistic and graphical, therefore simplifying
understanding of specifications and facilitating achievement of demanded program quality.
Another advantage of IDS is a method of interactive design of syntactically correct
algorithm specifications [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], which eliminates syntax errors during construction
of algorithm schemes. Specialization for subject domain is done by describing basic
operators and predicates from this domain. Our approach uses code templates to
specify implementations for operators and predicates; program transformations, such as
from sequential to parallel algorithm, are implemented as rewriting rules. Such
separation simplifies changing subject domain or transformations.
      </p>
    </sec>
    <sec id="sec-2">
      <title>Formalized Design of Programs in IDS and Termware</title>
      <p>
        The developed IDS toolkit is based on System of Algorithmic Algebras (SAA), which
are used for formalized representation of algorithmic knowledge in a selected subject
domain [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. SAA is the two-based algebra SAA = &lt;{U, B}; &gt;, where U is a
set of logical conditions (predicates) and B is a set of operators, defined on an
informational set;  = 1  2 is the signature of operations consisting of the systems 1
and 2 of logical operations and operators respectively (these will be considered
below). Operator representations of algorithms in SAA are called regular schemes. The
algorithmic language SAA/1 [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] is based on mentioned algebra and is used to describe
algorithms in a natural language form. The algorithms, represented in SAA/1, are
called SAA schemes.
      </p>
      <p>Operators and predicates can be basic or compound. The basic operator (predicate)
is an operator (predicate), which is considered in SAA schemes as primary atomic
abstraction. Compound operators are built from elementary ones by means of
operations of sequential and parallel execution operators, branching and loops, and
synchronizer WAIT ‘condition’ that delays the computation until the value of the
condition is true (see also Table 1 in next section).</p>
      <p>The advantage of using SAA schemes is the ability to describe algorithms in an
easy-to-understand form facilitating achievement of demanded quality of programs.
The IDS is intended for the interactive designing of schemes of algorithms in SAA
and generating programs in target programming languages (Java, С++, Cilk++). In
IDS algorithms are designed as syntactically correct programs ensuring the syntactical
regularity of schemes. IDS integrates three forms of design-time representation of
algorithms: regular schemes, SAA schemes (textual representation of SAA formulae)
and flow graphs. For integration with Termware, in this paper IDS was also adjusted
on generation of programs in Termware language.</p>
      <p>
        The IDS toolkit consists of the following components (Fig. 1): constructor,
intended for dialogue designing of syntactically correct sequential and concurrent
algorithm schemes and generation of programs; flow graph editor; generator of SAA
schemes on the basis of higher level schemes, called hyper-schemes [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]; and
data
      </p>
      <p>UsingAlgebra-AlgorithmicandTermRewritingTools… 41
base, containing the description of SAA operations, basic operators and predicates in
three mentioned forms, and also their program implementations.</p>
      <p>
        The constructor is intended to unfold designing of algorithm schemes by
superposition of SAA language constructs, which a user chooses from a list of reusable
components for construction of algorithms. The design process is represented by a tree of
an algorithm [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. On each step of the design process the constructor allows the
user to select only those operations, the insertion of which into the algorithm tree does
not break the syntactical correctness of the scheme. The tree of algorithm constructing
is then used for automatic generation of the text of SAA scheme, flow graph and the
program code in a target programming language.
      </p>
      <p>Example 1. We illustrate the use of SAA on Quicksort algorithm, which is given
below in the form of SAA scheme. The identifiers of basic operators in the SAA
scheme are written with double quotes and basic predicates are written with single
quotes. Notice that identifiers can contain any text explaining the meaning of operator
or predicate. It is not interpreted: it has to match exactly the specification in the
database (however, since constructs are not entered manually, but selected from a list, the
misspellings are prevented). The comments and implementations of compound
operators and predicates in SAA schemes begin with a string of “=” characters.
SCHEME QUICKSORT_SEQUENTIAL ====
"main(n)"
==== Locals (
"Declare an array (a) of type (int) and size (n)";
"Declare a variable (i) of type (int)";
"Declare a variable (end) of type (int)");
"Fill the array (a) of size (n) with random</p>
      <p>values";
"end := a + n";
"qsort(a, end)";
"qsort(begin, end)"
==== IF NOT('begin = end')
"Reduce (end) by (1)";
"Reorder array (a) with range (begin) and (end)
so that elements less than pivot (end) come
before it and greater ones come after it; save
pivot position to variable (middle)";
"qsort(begin, middle)";
"Increase (middle) by (1)";
"Increase (end) by (1)";
"qsort(middle, end)"</p>
      <p>END IF</p>
      <p>
        To automate the transformation (e.g. parallelization) of programs we augment
capabilities of IDS with rewriting rules technique [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. At the first step we construct
high-level algebraic models of algorithms based on SAA in IDS (see also [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ],
[
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]). After high-level program model is created, we use parallelizing transformations
to implement a parallel version of the program on a given platform (multicore in this
paper). Transformations are represented as rewriting rules and therefore can be
applied in automated manner. The declarative nature of rewriting technique simplifies
adding new transformations. Also transformations are separated from language
definitions (unlike approach used in [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ]), therefore simplifying addition of new
transformations or new languages.
      </p>
      <p>
        We use the rewriting rules system Termware [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Termware is used to
describe transformations of terms, i.e. expressions in a form f t1,, tn  .
Transformations are described as Termware rules, i.e. expressions of form source
[condition]-&gt; destination [action]. Here source is a source term (a pattern
for match), condition is a condition of rule application, destination is a
transformed term, action is additional action that is performed when rule fires. Each of
4 components can contain variables (denoted as $var), so that rules are more
generally applicable. Components condition and action are optional. They can
execute any procedural code, in particular use the additional data on the program.
3
      </p>
      <p>
        Generation of Terms and Programs and Experimental Results
IDS system performs generation of programming code on the basis of an algorithm
tree, received as a result of designing an algorithm in the IDS Constructor (see
Section 2), and also code templates – implementations of basic operators and predicates
in a target language (Java, C++, Cilk++), that are stored in IDS database. In the
process of generation, IDS translates SAA operations into corresponding operators of
programming language. Compound operators can be represented as subroutines
(methods). IDS database contains various code patterns for generation of parallel
programs, namely using WinAPI threads, Message Passing Interface (MPI), and
Cilk++ operations [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. For implementation of parallel version of our illustrative
example (Quicksort algorithm), we used Cilk++ as it facilitates programming of
recursive parallel programs [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. Cilk++ is a general-purpose programming language, based
on C/C++ and designed for multithreaded parallel computing.
      </p>
      <p>Table 1 gives a list of main SAA operations and templates of their implementation
in Termware and Cilk++, which are stored in the IDS database. The implementations
contain placeholders like ^condition1^, ^operator1^ etc., which are replaced
with program code during the program generation.</p>
      <p>For the purpose of transformation of some algorithm, IDS performs the generation
of a corresponding term and developer specifies a set of rules for transformation.
Then Termware carries out the actual transformation, the result of which can further
be used for code generation in a programming language.</p>
      <p>Example 2. We will parallelize the sequential Quicksort algorithm (see
Example 1), using IDS and Termware. For the parallelization, function qsort has to be
transformed, so we generated the term for this function:
qsort(Params(begin, end),</p>
      <p>IF (NOT(Equal(begin, end)),
then (Dec(end, 1),
then (Partition(a, begin, end, end),
then (CALL(qsort(begin, middle)),
then (Inc(middle, 1),
then (Inc(end, 1),</p>
      <p>CALL (qsort(middle, end)))))))))</p>
      <p>Then the operation of parallel execution of operations has to be added to this term.
This is done by applying the following two Termware rules:
1. then(CALL($x), then ($y, $z)) -&gt;</p>
      <p>Parallel (CALL($x), then($y, $z))
2. then($x1, Parallel($x2, $x3)) -&gt;
then($x1, then(Parallel($x2, $x3),</p>
      <p>WAIT(AllThreadsCompleted(n))))</p>
      <p>The first rule replaces the operation of sequential execution of operators with
parallel execution. The second rule adds a synchronizer WAIT(AllThreads
Completed(n), which delays the computation until all threads complete their work.
The result of the transformation is given below.
qsort(Params(begin, end),
IF(NOT(Equal(begin, end)),
then (Dec(end, 1),
then (Partition(a, begin, end, end),
then (Parallel(</p>
      <p>CALL (qsort(begin, middle)),
then (Inc(middle, 1),
then (Inc(end, 1),</p>
      <p>CALL (qsort(middle, end))))),</p>
      <p>WAIT(AllThreadsCompleted(n)))))))</p>
      <p>Thus, as a result of parallelization, the first operator (thread) of Parallel
operation executes the operator qsort(begin, middle), and the second one calls
two Inc operators and qsort(middle, end). Operation
WAIT(AllThreadsCompleted(n)) performs the synchronization of
threads. The threads are created recursively; their quantity is specified as an input
parameter of function main. Notice that these transformations are only valid if two
qsort calls are independent. The system doesn’t check this property: it has to be
asserted by a developer.</p>
      <p>The resulting parallel algorithm scheme Quicksort was used for generation of code
in Cilk++ using IDS system. The parallel program was executed on Intel Core 2 Quad
CPU, 2.51 GHz, Windows XP machine. Fig. 2 shows the program execution time in
seconds. The speedup at execution of program with usage of 2, 3 and 4 processors
was 2; 2.9 and 3.8 accordingly, which shows that the program has a good degree of
parallelism and is scalable.</p>
    </sec>
    <sec id="sec-3">
      <title>Conclusion</title>
      <p>We have described our approach of constructing efficient parallel programs using
high-level algebra-algorithmic specifications and rewriting rules technique.
Algebraalgorithmic toolkit IDS and rewriting rules engine Termware are combined to enable
formal, yet easy-to-understand algorithm specifications and automate program
synthesis and parallelization process. The combined development toolkit can be
retargeted to various subject domains and implementation languages, as exemplified by
Cilk++. The developed system could be further extended with automated code
analysis facilities based on rewriting technique.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Akhter</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Roberts</surname>
          </string-name>
          , J.:
          <string-name>
            <surname>Multi-Core Programming</surname>
          </string-name>
          . Intel Press, Hillsboro (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Andon</surname>
            ,
            <given-names>F. I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Doroshenko</surname>
            ,
            <given-names>A. Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tseytlin</surname>
            ,
            <given-names>G. O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yatsenko</surname>
            ,
            <given-names>O. A.</given-names>
          </string-name>
          :
          <article-title>Algebra-Algorithmic Models and Methods of Parallel Programming</article-title>
          . Akademperiodika,
          <string-name>
            <surname>Kyiv</surname>
          </string-name>
          (
          <year>2007</year>
          )
          <article-title>(in Russian)</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Apel</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          et al.:
          <article-title>An Algebraic Foundation for Automatic Feature-Based Program Synthesis</article-title>
          .
          <source>Science of Computer Programming</source>
          .
          <volume>75</volume>
          (
          <issue>11</issue>
          ),
          <fpage>1022</fpage>
          -
          <lpage>1047</lpage>
          (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Bagheri</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sullivan</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          :
          <article-title>Pol: Specification-Driven Synthesis of Architectural Code Frameworks for Platform-Based Applications</article-title>
          .
          <source>In: Proc. 11th Int. Conf on Generative Programming and Component Engineering</source>
          , pp.
          <fpage>93</fpage>
          -
          <lpage>102</lpage>
          , ACM, New York (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Batory</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          : Program Refactoring,
          <article-title>Program Synthesis, and Model-Driven Development</article-title>
          .
          <source>In: Proc. 16th Int. Conf. on Compiler Construction. LNCS 4420</source>
          , pp.
          <fpage>156</fpage>
          -
          <lpage>171</lpage>
          SpringerVerlag, Berlin Heidelberg (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Bures</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          et al.:
          <article-title>The Role of Ontologies in Schema-Based Program Synthesis</article-title>
          .
          <source>In: Proc. Workshop on Ontologies as Software Engineering Artifacts</source>
          , Vancouver (
          <year>2004</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>7. Cilk Home Page, http://cilkplus.org/</mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Doroshenko</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shevchenko</surname>
            <given-names>R.:</given-names>
          </string-name>
          <article-title>A Rewriting Framework for Rule-Based Programming Dynamic Applications</article-title>
          , Fundamenta Informaticae,
          <volume>72</volume>
          (
          <issue>1-3</issue>
          ),
          <fpage>95</fpage>
          -
          <lpage>108</lpage>
          (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Doroshenko</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tseytlin</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yatsenko</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zachariya</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          :
          <article-title>A Theory of Clones and Formalized Design of Programs</article-title>
          .
          <source>In: Proc. Int</source>
          . Workshop on Concurrency,
          <article-title>Specification and Programming (CS&amp;P'</article-title>
          <year>2006</year>
          ), pp.
          <fpage>328</fpage>
          -
          <lpage>339</lpage>
          , Wandlitz, Germany (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Doroshenko</surname>
            ,
            <given-names>A. Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zhereb</surname>
            ,
            <given-names>K. A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yatsenko</surname>
          </string-name>
          , Ye. A.:
          <article-title>On Complexity and Coordination of Computation in Multithreaded Programs</article-title>
          . Problems in Programming,
          <volume>2</volume>
          ,
          <fpage>41</fpage>
          -
          <lpage>55</lpage>
          (
          <year>2007</year>
          )
          <article-title>(in Russian)</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Doroshenko</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zhereb</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          :
          <article-title>Parallelizing Legacy Fortran Programs Using Rewriting Rules Technique and Algebraic Program Models</article-title>
          . In: Ermolayev,
          <string-name>
            <surname>V.</surname>
          </string-name>
          et al. (eds.) ICT in Education, Research, and
          <string-name>
            <given-names>Industrial</given-names>
            <surname>Applications</surname>
          </string-name>
          .
          <source>CCIS 347</source>
          , pp.
          <fpage>39</fpage>
          -
          <lpage>59</lpage>
          . Springer Verlag, Berlin Heidelberg (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Fischer</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Schumann</surname>
            ,
            <given-names>J.:</given-names>
          </string-name>
          <article-title>AutoBayes: a System for Generating Data Analysis Programs from Statistical Models</article-title>
          .
          <source>J. Funct. Program</source>
          .
          <volume>13</volume>
          (
          <issue>3</issue>
          ),
          <fpage>483</fpage>
          -
          <lpage>508</lpage>
          (
          <year>2003</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Flener</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Achievements and Prospects of Program Synthesis</article-title>
          . In: Kakas,
          <string-name>
            <given-names>A. C.</given-names>
            ,
            <surname>Sadri</surname>
          </string-name>
          ,
          <string-name>
            <surname>F</surname>
          </string-name>
          . (eds.)
          <article-title>Computational Logic: Logic Programming and Beyond</article-title>
          .
          <source>LNCS 2407</source>
          , pp.
          <fpage>310</fpage>
          -
          <lpage>346</lpage>
          , Springer Verlag, London (
          <year>2002</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Gulwani</surname>
            ,
            <given-names>S.:</given-names>
          </string-name>
          <article-title>Dimensions in Program Synthesis</article-title>
          .
          <source>In: 12th Int. ACM SIGPLAN Symposium on Principles and Practice of Declarative Programming</source>
          , pp.
          <fpage>13</fpage>
          -
          <lpage>24</lpage>
          . ACM, New York (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Kitzelmann</surname>
          </string-name>
          , E.:
          <article-title>Inductive Programming: a Survey of Program Synthesis Techniques</article-title>
          .
          <source>Approaches and Applications of Inductive Programming, LNCS 5812</source>
          , pp.
          <fpage>50</fpage>
          -
          <lpage>73</lpage>
          . Springer Verlag, Berlin Heidelberg (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Leonard</surname>
            ,
            <given-names>E. I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Heitmeyer</surname>
            ,
            <given-names>C. L.</given-names>
          </string-name>
          :
          <article-title>Automatic Program Generation from Formal Specifications using APTS</article-title>
          .
          <source>In: Automatic Program Development. A Tribute</source>
          to Robert Paige, pp.
          <fpage>93</fpage>
          -
          <lpage>113</lpage>
          . Springer Science, Dordrecht (
          <year>2008</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Mannadiar</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vangheluwe</surname>
          </string-name>
          , H.:
          <article-title>Modular Synthesis of Mobile Device Applications from Domain-Specific Models</article-title>
          .
          <source>In: Proc. 7th Int. Workshop on Model-Based Methodologies for Pervasive and Embedded Software</source>
          , pp.
          <fpage>21</fpage>
          -
          <lpage>28</lpage>
          . ACM, New York (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Srivastava</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gulwani</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Foster</surname>
            ,
            <given-names>J. S.:</given-names>
          </string-name>
          <article-title>From Program Verification to Program Synthesis</article-title>
          .
          <source>In: Proc. 37th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</source>
          , pp.
          <fpage>313</fpage>
          -
          <lpage>326</lpage>
          . ACM, New York (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>Yatsenko</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          :
          <article-title>On Parameter-Driven Generation of Algorithm Schemes</article-title>
          .
          <source>In: Proc. Int</source>
          . Workshop on Concurrency:
          <article-title>Specification and Programming (CS&amp;P'</article-title>
          <year>2012</year>
          ), pp.
          <fpage>428</fpage>
          -
          <lpage>438</lpage>
          , Berlin, Germany (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>