<!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>
      <journal-title-group>
        <journal-title>CEUR Workshop Proceedings</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <article-id pub-id-type="doi">10.18287/1613-0073-2016-1638-460-468</article-id>
      <title-group>
        <article-title>TEMPLET: A MARKUP LANGUAGE FOR CONCURRENT ACTOR-ORIENTED PROGRAMMING</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>S.V. Vostokin</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Samara National Research University</institution>
          ,
          <addr-line>Samara</addr-line>
          ,
          <country country="RU">Russia</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2016</year>
      </pub-date>
      <volume>1638</volume>
      <fpage>460</fpage>
      <lpage>468</lpage>
      <abstract>
        <p>The article presents a markup domain-specific language (DSL) for concurrent programming. Runtime libraries and language extensions are the usual ways to implement parallel execution. However, their using often requires a special programming skill. The modern languages with build-in parallel constructs are more convenient for programming, but they are poorly integrated with existing high performance computing infrastructure. We propose a compromise solution which uses DSL together with C++ programming language. The article discusses syntax, programming model, and some practical applications of the language.</p>
      </abstract>
      <kwd-group>
        <kwd>domain-specific language</kwd>
        <kwd>parallel programming</kwd>
        <kwd>actor model</kwd>
        <kwd>language-oriented programming</kwd>
        <kwd>skeleton programming</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>
        The Templet language is a domain-specific language (DSL). It is designed to be used
together with a sequential procedural or an object-oriented programming language.
The new property of the language is an implicit specification of the actor's
computation semantics with a marked serial code. The language detailed description first
appeared as arXiv preprint [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ].
      </p>
      <p>
        The article focuses on a design of the markup language. The design of the language
basically follows the concept of the language-oriented programming [
        <xref ref-type="bibr" rid="ref2 ref3">2,3</xref>
        ]. The
algebraic-like notation similar to the CSP formalism was applied to describe parallel
processes and interactions [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. The idea of a minimalistic design with emphasis on the
basic abstractions is taken from the programming language Oberon [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
The language design is based on the three concepts. The first one is so called active
markup. Usually a markup is read form the source file and produces some effects in
the target file (e.g. adding synchronization and/or communication commands). In our
approach source and target is the same file. The language preprocessor overwrites
files content. The markup inside the files directs the conversion to keep a desired code
structure.
      </p>
      <p>
        The second one is a programming model. We introduce a diffusive (with no locking)
programming model that describes concurrent activity as a message exchange
between parallel processes. They are activated by incoming messages. The channels
define message exchange protocols. The model avoids concurrent data access, hence
it is easier to use when multithreading. The model is a specialization of the actor
formalism [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>The third concept is based on description of concurrent activity with sequential code.
This method is derived from formal theories that consider parallel process as set of
behaviors (sequences of system states and/or atomic actions). We simulate the
sequences with random number generator.</p>
      <p>The following paragraphs illustrate these concepts with syntax and code examples.
The article ends with an overview of related works. The experimental preprocessor
for the Templet language and code samples in marked C++ are available at
http://github.com/templet-language.
1</p>
    </sec>
    <sec id="sec-2">
      <title>Active markup</title>
      <p>To describe the syntax, an extended Backus-Naur Formalism called EBNF is used.
The following EBNF rules describe the block structure of a module. The module here
is a unit of code that can include one or several files.
module = {base-language|user-block} module-scheme
{base-language|user-block}.
user-block = user-prefix base-language</p>
      <p>user-postfix.
module-scheme = scheme-prefix</p>
      <p>{ channel | process } scheme-postfix.</p>
      <p>The code of a module consists of the single module scheme section and multiple code
sections in C++ language with highlighted user blocks. These sections are
distinguished from the rest of the code by means of C++ comments. For example, the
marked C++ code may look as follows. The blocks’ names according to the markup
language syntax are shown on the right side.
#include &lt;runtime.h&gt;
/*templet$$include*/</p>
      <p>#include &lt;iostream&gt;
/*end*/
/*templet*</p>
      <p>*hello&lt;function&gt;.
*end*/
&lt;-- base-language
&lt;-- user-prefix
&lt;-- base-language
&lt;-- user-postfix
&lt;-- scheme-prefix
&lt;-- module-scheme
&lt;-- scheme-postfix
&lt;-- base-language
&lt;-- user-prefix
&lt;-- base-language
&lt;-- user-postfix
&lt;-- base-language
Lexical analyzer defines the boundaries of the blocks by signatures, recognizing
specific sub-strings in a character stream. For example, the module scheme may be
preceded by a combination of characters /*templet*, and finish by *end*/. User block
prefixes include identifiers for binding the blocks with module scheme:
/*templet$hello$*/ bound with *hello&lt;function&gt;. The module scheme defines a
structure of the program skeleton and user blocks are extension points of the skeleton.
The markup language implies a mapping algorithm. The mapping is a module
transformation carried out by rewriting the module code. The mapping is applied only to a
module with syntactically correct scheme. As a result of this transformation the code
and the scheme becomes isomorphic meaning that the code can be reproduced from
the scheme and vice versa. New user blocks may appear. Existing user blocks may
move to new positions or turn into comments.
2</p>
    </sec>
    <sec id="sec-3">
      <title>Programming model</title>
      <p>The module scheme includes definitions of the two DSL classes: channel and process.
The channel describes communication, while the process describes data processing.
Any DSL class inherits its behavior from BaseChannel or BaseProcess runtime
classes. The classes should be implemented in a way that the following behavior is
possible.
class Channel: public BaseChannel{
public:
// test whether the channel it accessible
bool access_client(){...} // at client side
bool access_server(){...} // at server side
// client sends entire channel to server
void send_client(){...}
// server sends entire channel to client
void send_server(){...}
...
};
class Process: public BaseProcess{
public:
// receive data on the channel
virtual void recv(BaseChannel*);
// bind a channel to the process as client
bool bind_client(BaseChannel*){...}
// .. or server
bool bind_server(BaseChannel*){...}
...
}
The BaseChannel has the following behavior. The access to the channel alternately
belongs to pair of processes called client and server. The client process has access
right to the channel in the beginning of computations. The methods access_client()
and access_server() allow client or server to check for access. The methods
send_client() and send_server() can be used to grant access from client to server or
from server to client respectively.</p>
      <p>The BaseProcess has the following behavior. The methods bind_client() and
bind_server() establish connection between a process (as a client or as a server) and a
channel. The method recv() is called at the moment getting access to the channel. The
channel is passed as recv() argument.</p>
      <p>The implementation also carries out the rules below. If the process gets access to
multiple channels, it takes several consecutive calls to recv() in random order. If some
process sends the channel access to another process, the other process will sooner or
later get the access.
3</p>
    </sec>
    <sec id="sec-4">
      <title>Concurrent execution semantics</title>
      <p>The program implementation in C++ language should provide the opportunity for a
non-deterministic performance. The non-determinism of program execution is
simulated by means of pseudo-random numbers.
void TempletProgram::run()
{
size_t rsize;
// while message queue is not empty
while(rsize=ready.size()){
//select random channel which
//is currently sending message
//then exclude this channel
//from the message queue
//and move it to not sending state
int n=rand()%rsize;
auto it=ready.begin()+n;
BaseChannel*c=*it;ready.erase(it);
c-&gt;sending=false;
//extract the process to which the message
//was sent from the channel
//run message handling method recv()
//for the channel and
//pass the channel as
//the argument to this method
c-&gt;p-&gt;recv(c);
}</p>
      <p>}
Appropriate runtime libraries are provided for truly parallel execution of a code.
Some modifications to mapping algorithm may also be required.
4</p>
    </sec>
    <sec id="sec-5">
      <title>Module scheme syntax</title>
      <p>This is a complete EBNF description of module scheme in the Templet language.
channel = '~' ident [params]</p>
      <p>['=' state {';' state}] '.'.
state = ['+'] ident [ ('?'|'!') [rules] ].
rules = rule { '|' rule }.
rule = ident { ',' ident } '-&gt;' ident.
process = '*' ident [params]
['=' ((ports [';' actions])</p>
      <p>| actions) ] '.'.
ports = port {';' port}.
port = ident ':' ident
('?'|'!')[(rules ['|' '-&gt;' ident])
|( '-&gt;' ident)].
actions = action {';' action}.
action = ['+'] [ident ':'] disjunction ['-&gt;'</p>
      <p>([ident] '|' ident) | ident].
disjunction = conjunction { '|' conjunction}.
conjunction = call {'&amp;' call}.
call = ident '(' [args] ')'.
args = ident ('?'|'!') ident</p>
      <p>{',' ident ('?'|'!') ident }.
params = '&lt;' ident {',' ident} '&gt;'.</p>
      <p>For example, there is a program that checks the trigonometric identity sin2x+cos2x=1
in parallel. The process of Master class sends x values to working processes of
Worker class via channels of Link class. The Master gets the squares of trigonometric
functions and calculates their sum in return. The protocol Link to verify the trigonometric
identity may be coded in Templet DSL like shown below.
~Link = +BEGIN ? ArgCos -&gt; CALCCOS |</p>
      <p>ArgSin -&gt; CALCSIN;
CALCCOS ! Cos2 -&gt; END;</p>
      <p>CALCSIN ! Sin2 -&gt; END.</p>
      <p>The Master and Worker processes for checking the trigonometric identity can be
defined as follows.
*Master =
p1:Link ! Sin2 -&gt; join;
p2:Link ! Cos2 -&gt; join;
+fork(p1!ArgSin,p2!ArgCos);</p>
      <p>join(p1?Sin2,p2?Cos2).
*Worker =
p : Link ? ArgSin -&gt; sin2 | ArgCos -&gt; cos2;
sin2(p?ArgSin,p!Sin2);
cos2(p?ArgCos,p!Cos2).</p>
      <p>Any Templet program is a network of objects. Objects are instances of C++ classes
generated from the DSL. These C++ classes are in turn derived from BaseChannel
class or BaseProcess class. The network of objects is coded manually in C++.
5</p>
    </sec>
    <sec id="sec-6">
      <title>Applications overview</title>
      <p>The current implementation includes another three samples to illustrate the practical
use of the Templet language for various applications.</p>
      <p>The Gauss-Seidel method for solving the Laplace equation is the first one. This
example illustrates the use of the language in the field of high performance scientific
computing. It also shows how the Templet simulation runtime can help to predict
program performance without an explicit mathematical model or parallel execution.
An example from the field of linear algebra is the second one. This is an illustration of
distributed matrix multiplication algorithm. It shows that the Templet implementation
of the actor model is well suited both for shared and distributed parallel architectures.
The business process model example is the third one. The Templet DSL can be used
to model and analyze concurrency in non-technical systems, for example, in the area
of business process modeling. We studied a business scenario written in a human
language and composed a formal specification for the scenario in the Templet
language. The static type analysis, debugging, and testing of the program were used to
verify the correctness of the specification. In particular, we compared
programmatically generated event sequences with expected sequences for the studied business
process. This example illustrates that in our approach much of model verification is
done by C++ compiler and the Templet runtime.</p>
    </sec>
    <sec id="sec-7">
      <title>Related works</title>
      <p>The experimental implementation of the domain-specific language toolkit showed the
following benefits of our approach.</p>
      <p>
        Additional language constructions are not required to explain the meaning of an
algorithm with concurrent control. This is similar to approach based on object-oriented
libraries STL [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], TBB [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], CCR [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], Boost [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], and others. However, the markup
and preprocessing technique reduces the amount of manual coding.
      </p>
      <p>
        More reliable protection against programming errors is provided. This feature is
compatible with modern concurrent programming languages Go [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ], Occam [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], Limbo
[
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], Erlang [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ], and some others. Static type checking in the C++ language helps to
prevent incorrect connection of message source and message recipient. Semantic
checking can also be implemented at the preprocessor level. For example, the
Templet preprocessor can check the attainability of a state in the communication protocol
for channels and the possibility to call a method for processes. The check can also be
carried out during the program execution: if pair of processes does not perform a
prescribed messaging protocol, calculations will stop.
      </p>
      <p>Behavior of the Templet program can be investigated in more detail by means of
problem-oriented debugger. The mapping algorithm can add code to provide
information to the debugger. The performance prediction of a parallel program is also
possible. Discrete event simulation library can easily replace standard execution
mechanism for the performance analysis.</p>
      <p>
        The markup language is a mean of skeleton programming and code reuse [
        <xref ref-type="bibr" rid="ref15 ref16">15, 16</xref>
        ].
One can design a universal skeleton for programs with similar control flow and adapt
it to specific applications. The adaptation is made by changing C++ code of message
variables and handlers. This technique is useful for programming multi-core and
many-core systems [
        <xref ref-type="bibr" rid="ref17 ref18">17, 18</xref>
        ].
      </p>
      <p>
        The markup language defines concurrent execution with sequential code. A number
of well-known [
        <xref ref-type="bibr" rid="ref19 ref20">19,2 0</xref>
        ] and experimental [
        <xref ref-type="bibr" rid="ref21 ref22">21, 22</xref>
        ] tools for defining iterative or
recursive parallelism are based on markup. We adopted the same method for an actor
model of parallel execution.
      </p>
      <p>
        The DSL language can be applied to different general-purpose programming
languages. It is compatible with a number of modern industrial process control software
development technologies [
        <xref ref-type="bibr" rid="ref23 ref24">23, 24</xref>
        ].
7
      </p>
    </sec>
    <sec id="sec-8">
      <title>Conclusion</title>
      <p>Our research shows a practical interest of the DSL-based approach for parallel
actororiented programming. We got a fully working but relatively compact implementation
of the actor language. This implementation had been deployed online as a part of the
web service TempletWeb (http://template.ssau.ru/templet).</p>
    </sec>
    <sec id="sec-9">
      <title>Acknowledgements</title>
      <p>The research was supported by the Ministry of Education and Science of the Russian
Federation within the framework of the Program designed to increase the
competitiveness of Samara National Research University among the world's leading scientific
and educational centers over the period from 2013 till 2020. This work was partially
supported by the RFBR grant 15-08-05934 A.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Vostokin</surname>
            <given-names>S.</given-names>
          </string-name>
          <article-title>Templet: a markup language for concurrent programming</article-title>
          .
          <source>arXiv preprint</source>
          <year>2014</year>
          ; arXiv:
          <fpage>1412</fpage>
          .
          <fpage>0981</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Ward</surname>
            <given-names>MP</given-names>
          </string-name>
          .
          <article-title>Language-oriented programming</article-title>
          .
          <source>Software-Concepts and Tools</source>
          ,
          <year>1994</year>
          ;
          <volume>15</volume>
          (
          <issue>4</issue>
          ):
          <fpage>147</fpage>
          -
          <lpage>161</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Dmitriev</surname>
            <given-names>S.</given-names>
          </string-name>
          <article-title>Language oriented programming: The next programming paradigm</article-title>
          .
          <source>JetBrains onBoard</source>
          ,
          <year>2004</year>
          ;
          <volume>1</volume>
          (
          <issue>2</issue>
          ):
          <fpage>1</fpage>
          -
          <lpage>13</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Hoare</surname>
            <given-names>C</given-names>
          </string-name>
          .
          <article-title>Communicating sequential processes. Chapter in book: The origin of concurrent programming</article-title>
          . Springer,
          <year>2002</year>
          ;
          <fpage>413</fpage>
          -
          <lpage>443</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Wirth</surname>
            <given-names>N.</given-names>
          </string-name>
          <article-title>The programming language Oberon</article-title>
          .
          <source>Software: Practice and Experience</source>
          ,
          <year>1988</year>
          ;
          <volume>18</volume>
          (
          <issue>7</issue>
          ):
          <fpage>671</fpage>
          -
          <lpage>690</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Hewitt</surname>
            <given-names>C</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bishop</surname>
            <given-names>P</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Steiger</surname>
            <given-names>R.</given-names>
          </string-name>
          <article-title>A universal modular actor formalism for artificial intelligence</article-title>
          .
          <source>in Proc. of the 3rd international joint conference on Artificial intelligence</source>
          ,
          <year>1973</year>
          ;
          <fpage>235</fpage>
          -
          <lpage>245</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Stroustrup B. The</surname>
            <given-names>C</given-names>
          </string-name>
          +
          <article-title>+ programming language</article-title>
          .
          <source>Pearson Education</source>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Reinders</surname>
            <given-names>J</given-names>
          </string-name>
          .
          <article-title>Intel threading building blocks: outfitting C++ for multi-core processor parallelism.</article-title>
          <string-name>
            <surname>O'Reilly Media</surname>
          </string-name>
          , Inc.,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Richter J. Concurrent</surname>
          </string-name>
          affairs
          <article-title>-concurrency and coordination runtime</article-title>
          .
          <source>Louisville: MSDN Magazine</source>
          ,
          <year>2006</year>
          ;
          <fpage>117</fpage>
          -
          <lpage>128</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Schäling B. The</surname>
          </string-name>
          boost C+
          <article-title>+ libraries</article-title>
          .
          <source>Boris Schäling</source>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <article-title>The Go programming language specification</article-title>
          .
          <source>Google Inc</source>
          .
          <year>2009</year>
          . Source: &lt;http://golang.org/doc/go_spec.html&gt;.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <article-title>Occam programming manual</article-title>
          .
          <source>INMOS Limited</source>
          . Prentice Hall Direct;
          <year>1984</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Ritchie</surname>
            <given-names>DM</given-names>
          </string-name>
          .
          <article-title>The Limbo programming language</article-title>
          .
          <source>Inferno Programmer(TM) Manual</source>
          ,
          <year>1997</year>
          ;
          <fpage>2</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Larson</surname>
            <given-names>J</given-names>
          </string-name>
          .
          <article-title>Erlang for concurrent programming</article-title>
          .
          <source>Communications of the ACM</source>
          ,
          <year>2009</year>
          ;
          <volume>52</volume>
          (
          <issue>3</issue>
          ):
          <fpage>48</fpage>
          -
          <lpage>56</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Cole</surname>
            <given-names>M.</given-names>
          </string-name>
          <article-title>Bringing skeletons out of the closet: a pragmatic manifesto for skeletal parallel programming</article-title>
          .
          <source>Parallel computing</source>
          ,
          <year>2004</year>
          ;
          <volume>30</volume>
          (
          <issue>3</issue>
          ):
          <fpage>389</fpage>
          -
          <lpage>406</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>González-Vélez</surname>
            <given-names>H</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Leyton</surname>
            <given-names>M.</given-names>
          </string-name>
          <article-title>A survey of algorithmic skeleton frameworks: high-level structured parallel programming enablers</article-title>
          .
          <source>Software: Practice and Experience</source>
          ,
          <year>2010</year>
          ;
          <volume>40</volume>
          (
          <issue>12</issue>
          ):
          <fpage>1135</fpage>
          -
          <lpage>1160</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Aldinucci</surname>
            <given-names>M</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Danelutto</surname>
            <given-names>M</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kilpatrick</surname>
            <given-names>P</given-names>
          </string-name>
          .
          <article-title>Skeletons for multi/many-core systems</article-title>
          .
          <source>in Proc. of PARCO</source>
          ,
          <year>2009</year>
          ;
          <fpage>265</fpage>
          -
          <lpage>272</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Karasawa</surname>
            <given-names>Y</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Iwasaki H</surname>
          </string-name>
          .
          <article-title>A parallel skeleton library for multi-core clusters</article-title>
          .
          <source>in Parallel Processing</source>
          ,
          <year>2009</year>
          . ICPP'09. International Conference on. IEEE,
          <year>2009</year>
          ;
          <fpage>84</fpage>
          -
          <lpage>91</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>Dagum</surname>
            <given-names>L</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Menon R. OpenMP</surname>
          </string-name>
          <article-title>: an industry standard API for shared-memory programming</article-title>
          .
          <source>Computational Science &amp; Engineering</source>
          , IEEE,
          <year>1998</year>
          ;
          <volume>5</volume>
          (
          <issue>1</issue>
          ):
          <fpage>46</fpage>
          -
          <lpage>55</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          20.
          <string-name>
            <surname>Blumore</surname>
            <given-names>R</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Joerg</surname>
            <given-names>C</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kuszmaul</surname>
            <given-names>B</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Leiserson</surname>
            <given-names>C</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Randall</surname>
            <given-names>K</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zhou</surname>
            <given-names>Y. Cilk:</given-names>
          </string-name>
          <article-title>An efficient multithreaded runtime system</article-title>
          .
          <source>Journal of parallel and distributed computing</source>
          ,
          <year>1996</year>
          ;
          <volume>37</volume>
          (
          <issue>1</issue>
          ):
          <fpage>55</fpage>
          -
          <lpage>69</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          21.
          <string-name>
            <surname>Konovalov</surname>
            <given-names>N</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Krukov</surname>
            <given-names>V</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sazanov</surname>
            <given-names>Y</given-names>
          </string-name>
          . “
          <string-name>
            <surname>C-DVM -</surname>
          </string-name>
          <article-title>a language for the development of portable parallel programs</article-title>
          .
          <source>Programming and Computer Software</source>
          ,
          <year>1999</year>
          ;
          <volume>25</volume>
          (
          <issue>1</issue>
          ):
          <fpage>46</fpage>
          -
          <lpage>55</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          22.
          <string-name>
            <surname>Abramov</surname>
            <given-names>S</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Adamovich</surname>
            <given-names>A</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Inyukhin</surname>
            <given-names>A</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Moskovsky</surname>
            <given-names>A</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Roganov</surname>
            <given-names>V</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shevchuk</surname>
            <given-names>E</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shevchuk</surname>
            <given-names>Y</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vodomerov</surname>
            <given-names>A</given-names>
          </string-name>
          .
          <article-title>OpenTS: an outline of dynamic parallelization approach</article-title>
          .
          <source>in Parallel Computing Technologies</source>
          . Springer,
          <year>2005</year>
          ;
          <fpage>303</fpage>
          -
          <lpage>312</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          23.
          <string-name>
            <surname>Atkinson</surname>
            <given-names>C</given-names>
          </string-name>
          , Kuhne T.
          <article-title>Model-driven development: a metamodeling foundation</article-title>
          .
          <source>Software</source>
          , IEEE,
          <year>2003</year>
          ;
          <volume>20</volume>
          (
          <issue>5</issue>
          ):
          <fpage>36</fpage>
          -
          <lpage>41</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          24.
          <string-name>
            <surname>Selic</surname>
            <given-names>B.</given-names>
          </string-name>
          <article-title>The pragmatics of model-driven development</article-title>
          .
          <source>IEEE software</source>
          ,
          <year>2003</year>
          ;
          <volume>20</volume>
          (
          <issue>5</issue>
          ):
          <fpage>19</fpage>
          -
          <lpage>25</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>