<!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>Methods and Tools of Parallel Programming</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Victor Kasyanov</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Elena Kasyanova</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Institute of Informatics Systems</institution>
          ,
          <addr-line>630090 Novosibirsk, Russia</addr-line>
          ,
          <institution>Novosibirsk State University</institution>
          ,
          <addr-line>630090 Novosibirsk</addr-line>
          ,
          <country country="RU">Russia</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2016</year>
      </pub-date>
      <fpage>141</fpage>
      <lpage>154</lpage>
      <abstract>
        <p>Using traditional methods, it is very dificult to develop high quality, portable software for parallel computers. In particular, parallel software cannot be developed on low cost, sequential computers and then moved to high performance parallel computers without extensive rewriting and debugging. In this paper, the CSS system being under development at the Institute of Informatics Systems is considered. The CSS is aimed to be an interactive visual environment for supporting of cloud parallel programming. The input language of the CSS system is a functional language Cloud Sisal that exposes implicit parallelism through data dependence and guarantees determinate result. The CSS system provides means to write and debug functional programs regardless target architectures on low-cost devices as well as to translate them into optimized parallel programs, appropriate to the target execution platforms, and then execute on high performance parallel computers in clouds without extensive rewriting and debugging.</p>
      </abstract>
      <kwd-group>
        <kwd>cloud computing</kwd>
        <kwd>computer science education</kwd>
        <kwd>functional programming</kwd>
        <kwd>hierarchical graph representation</kwd>
        <kwd>parallel programming</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>
        Functional language Sisal (Streams and Iterations in a Single Assignment
Language) is considered as an alternative to FORTRAN language for
supercomputers [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ],[
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Compared with imperative languages (like FORTRAN), functional
languages, such as Sisal, simplifies programmer’s work. He has only to specify
a result of calculations and it is a compiler that is responsible for mapping an
algorithm to certain calculator architecture. In contrast with other functional
languages (like Lisp, ML and Haskel), Sisal supports data types and operators
typical for scientific calculations such as loops and arrays. At present, there are
implementations of the Sisal 1.2 language [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] for many supercomputers (e. g.,
SGI, Sequent, Encore Multimax, Cray X-MP, Cray 2, etc). Sisal 90 [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] language
definitions increase the language’s utility for scientific programming and include
language level support for complex values, array and vector operations, higher
order functions, rectangular arrays, and an explicit interface to other languages
like FORTRAN and C. The Sisal 3.2 language [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ],[
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] integrates features of Sisal
2.0 [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] and Sisal 90 versions and includes language level support for module
design, mixed language programming, and preprocessing.
      </p>
      <p>
        In this paper, a visual cloud system CSS (Cloud Sisal System) of functional
and parallel programming being under development at the Institute of
Informatics Systems is considered. The input language of the system is a functional
language Cloud Sisal [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] that is a modification of our Sisal 3.2 language which is
aimed to increase the language’s utility for supporting of cloud scientific
computations and cloud parallel programming. The Cloud Sisal language supports also
so-called annotated programming and concretizing transformations [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ].
The system presented uses intermediate languages of hierarchical graphs and
provides means to write and debug functional programs regardless target
architectures on low-cost devices as well as to translate them into optimized parallel
programs, appropriate to the target execution platforms, and then execute them
on high performance parallel computers in clouds without extensive rewriting
and debugging [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. So, the system can open the world of parallel and
functional programming to all students and scientists without requiring a large
investment in new, top-end computer systems.
2
      </p>
    </sec>
    <sec id="sec-2">
      <title>The CSS System</title>
      <p>The advancement of computer technology and the increasing complexity of
research problems are creating the need to teach parallel programming in higher
education more effectively. Programming massively-parallel machine is a
daunting task for any human programmer and parallelization may even be impossible
for any compiler. Instead, the functional programming paradigm may prove to be
an ideal solution by providing an implicitly parallel interface to the programmer.</p>
      <p>The CSS system is based on hierarchical graph representations of functional
and parallel programs and is intended to provide a general-purpose user interface
for a wide range of parallel processing platforms (See Fig. 1). In our conception,
cloud interface gives transparent ability to execute programs on arbitrary
environment. JavaScript client does not demand installation; small educational
programs can be executed on client devices (computers or smart phones). V8
server allows the language parser and some optimizations to be used at both
client and server sides.</p>
      <p>The CSS system uses a functional language Cloud Sisal and includes five
big parts: interface, interpreter, graphic visualization/debugging subsystem,
optimizing cross compiler, cluster runtime.</p>
      <p>
        The interpreter is available on web via browser; it translates
Cloud-Sisalprogram to the first internal representation (IR1) and runs it without making
actual low-level code. It is useful because in this case a user can get any debugging
information in visual forms of hierarchical graphs [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. Web interface also
contains some usual parts like syntax highlighting, persistent storage for program
code, authorization and so on.
      </p>
      <p>The CSS system provides means to write and debug Cloud-Sisal-programs
on low-cost devices as well as to translate and execute them in clouds. The
CSS system can open the world of parallel and functional programming to all
students and scientists without requiring a large investment in new, top-end
computer systems.
3</p>
    </sec>
    <sec id="sec-3">
      <title>Cloud Sisal Language</title>
      <p>
        The Cloud Sisal language that has been designed as the input language of the
CSS system is a modification of our Sisal 3.2 language which is aimed to increase
the language’s utility for supporting of cloud scientific computations and cloud
parallel programming [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ],[
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ],[
        <xref ref-type="bibr" rid="ref15">15</xref>
        ].
3.1
      </p>
      <sec id="sec-3-1">
        <title>Single Assignment</title>
        <p>
          Cloud Sisal differs from other functional languages and we think that this
difference make Cloud Sisal more adapted for computational tasks. First of all, it
has some usual functional language benefits like single assignment [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]. This
approach requires every variable to be defined only once. Someone would say that
it is not an advantage because every imperative program can be converted to
SSA-form, and of course at low-level programming it has no difference but
imagine some function and the global variable in the language where every variable
need to be declared (we use C for example):
int g=0;
void foo(void) { g=1; }
        </p>
        <p>You need to re-declare the global variable when it is modified, but you can’t
make it inside the function. Inside the compiler this program will be converted
quite easy but to write initially singe assignment programs is not the same. You
can declare another global variable without setting any value but it can bring
more questions to the rest of the code, we can use more complex example to
withdraw this but we wouldn’t. The idea is that single assignment is something
similar to structural programming where “goto” operator is prohibited.
3.2</p>
      </sec>
      <sec id="sec-3-2">
        <title>Streams and Arrays</title>
        <p>Cloud Sisal also uses arrays and loops which is not common for a functional
language, but it is good for computation: you don’t have to worry about the
recognition of the tail recursion or the number of iterations or matrix description
which is simpler with arrays. You can operate with n-th element of the array in
a natural way like in FORTRAN:
for i in 1, N repeat</p>
        <p>R := A[i] * B[k]
returns array of R
end for
3.3</p>
      </sec>
      <sec id="sec-3-3">
        <title>Verbose Syntax</title>
        <p>And the last benefit is more verbose syntax. It makes program source more
readable and as the result - long time development by different people becomes
easier. Many functional languages suffers from the lack of the words in the
program source, it makes the text hard to understand. The example below is the
famous Haskell quicksort:
qsort [] = []
qsort (x : xs) =</p>
        <p>qsort[y|y &lt;- xs, y &lt; x] ++ [x] ++ qsort [y|y &lt;- xs, y &gt;= x]
This kind of code is hard to maintain. The same algorithm implemented in
Cloud Sisal listed below:
function qsort (Data:array[real] returns array[real])
if array_size(Data) &gt; 2 then
let</p>
        <p>
          L, Middle, R := for E in Data
returns
array of E when E &lt; Data[
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]
array of E when E = Data[
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]
array of E when E &gt; Data[
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]
in
end for
In functional programming every statement is a function returning the value, the
Cloud Sisal loops are the same. Reduction is used to determine the returning
value of the loop. Keyword ”returns” at the end of the loop is followed by the
name of the reduction and its parameters. For example, if we need to summarize
the elements in the array or the stream we can use the following function with
”for all” loop:
function sum(A: array[real] returns real)
for r in A
        </p>
        <p>returns sum of r
end for
end function</p>
        <p>Of course, loop construction can be used without any function declaration.
Cloud Sisal is pure functional, it has no side effects and any loop contains the
reduction call, also user can implement his own reductions.</p>
        <p>The reductions are good because its implementation can depend on target
system. When the program is executed in single-threaded environment it can
be performed sequentially, but when executed on multiple threads it can be
performed in parallel. Similar idea can be found in modern library ”Threading
Building Blocks” by Intel. This library allows usage of reduction mechanism in
C++, but user can also use ordinary loops as well. In Cloud Sisal programs
reductions can’t be avoided.</p>
        <p>
          In Cloud Sisal we have three kinds of loops: post-conditional, pre-conditional
and ”for all” (operation is applied to a set). Reductions can be folding or
generating (some aggregation function or an array generator). Conditional loops are
sequential in general but reduction allows them to be pipelined easier (Fig. 2,
Fig. 3). Loops can be divided into parts: initialization, loop body, loop test, loop
reduction (ret) and range generator. We think that the part names can briefly
describe them, but if you need more information - please check Sisal 3.2 or Cloud
Sisal language description [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ], [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ].
        </p>
        <p>Using reductions matrix multiplication can be implemented meaningfully:
function multiply( A,B : array[array[real]];</p>
        <p>M,N,L : integer</p>
        <p>Reduction can be always used in sequential style:
function multiply (A:array[array[real]];</p>
        <p>B:array[array[real]];
N:integer
returns array[array[real]])
for i in 1, N cross j in 1, N
returns array of
for
initial s := 0.0; k := 1
while (k &lt;= N)
repeat
s:=old s + A[i,old k]*B[old k,j];
k := old k + 1
returns value of s
end for
end for
end function</p>
        <p>But imperative languages doesn’t have any reduction mechanism at all.</p>
      </sec>
      <sec id="sec-3-4">
        <title>3.5 Error Handling</title>
        <p>Try-catch mechanism is more popular for error handling today but this approach
has conflicts with parallel program execution. When the exception occurs all the
execution streams must be stopped, pipeline flushed and so on. Also it is harder
to keep program determinism in the case of the parallel execution and exception
occurs. Check the following Java example:
try {for (int i=0; i&lt;N; i++) {a[i]= a[i]/((i+1) % K);}
} catch (Exception e) {
//display partial results stored in ‘‘a’’
}</p>
        <p>In this example loop iterations are independent and can be executed in
parallel. Sequential execution will always give the same result (for the fixed values of N
and K); the result will not depend on the executor properties as far as it remains
to be sequential. While there is no dependence between the iterations,
programming language semantics remains to be sequential and parallelism exploration
can break this semantics or demand additional corrections to keep it. Interpreter
or parallelizing compiler needs additional mechanism to differ between the data
before and after the exception.</p>
        <p>In Cloud Sisal language we have “always finished computations” semantics,
which means that execution stream will not stop on any error and return
resulting value even if the error occurs (Fig. 4).
3.6</p>
      </sec>
      <sec id="sec-3-5">
        <title>Optimizing Annotations</title>
        <p>
          The Cloud Sisal language supports also so-called annotated programming and
concretizing transformations [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ] and includes pragma statements in the form
of formalized comments (annotations) that start with dollar sign ’$’ and are
predicate constraints on admissible properties of program fragments or states of
computations. In addition to restricted set of program executions and restricted
set of program outputs some suitable criterion of program quality can be defined
by annotations, and every concretizing transformation of an annotated program
is aimed at improving the program according to the qualitative criterion without
disturbing the meaning of the program in the application context defined by
annotations.
forward function fact (n: integer
/*$ assert=n&gt;=1*/
/*$ assert=_&gt;=n*/
returns integer)
function fact (n: integer returns integer)
if n = 1 then 1
else /*$ assert = _ &gt; 0 */
        </p>
        <p>fact(n-1)*n
end if
end function</p>
        <p>
          According to the approach used [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ], any source program is considered as
a base for constructions of a number of different specialized programs. Every
construction starts with the source program and an application context conveyed
in annotations. Some program annotations can be formed in parallel with the
development of the source program, others are added by users and describe a
specific context of source program applications. Then a series of concretizing
transformations is applied to the annotated general-purpose program (either
automatically or interactively with the user), which results in a correct and
qualitative specialized program.
        </p>
        <p>
          For example, every expression in Cloud-Sisal-program can be prefixed by a
pragma “assert = Boolean expression”, that can be checked for truth after the
expression evaluation during program debugging and then can be used in
program optimizing transformations. The result of the expression can be denoted
as the underscore symbol “ ” and if the expression is  -ary (where  &gt; 1), then
its components can be denoted as an array with the name “ ”: “ [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]”,..., “ [n]”.
In addition, the pragma “assert = Boolean expression” can be placed before
returns keyword in procedure declarations and can be used to control results of
this procedure after its invocation. As an example of the assert pragma
statement usage please consider factorial function declaration and definition which
are represented in Fig. 5. Another example of optimizing annotations is a pragma
“parallel” which can be used before a case expression in Sisal (analogous to a
switch expression in C language). This pragma can be specified if it is known
that only one test can be true. The pragma of the form “parallel = Boolean
expression” means that only one test is true if the specified Boolean expression
is true.
        </p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4 Internal Representations</title>
      <p>
        The CSS system uses three internal presentations of Cloud-Sisal-programs: IR1,
IR2 and IR3.
function sign (N: integer returns integer)
if N &gt; 0 then 1
elseif N &lt; 0 then -1 else 0 end if
end function
IR1 is a language of hierarchical graphs [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] made up simple and compound
computation nodes, edges, ports and types (See Fig. 6). Nodes correspond to
computations. Simple nodes are vertices and denote operations such as add or
divide. Compound nodes are subgraphs and represent compound constructions
such as structured expressions and loops. Ports are vertices that are used for
input values and results of compound nodes. Edges show the transmission of data
between simple nodes and ports; types are associated with the data transmitted
on edges. IR1-program represents data dependencies, with control left implicit;
e. g. iteration is represented as a compound node with subgraphs describing
generation of index values, the body of the loop, and the packaging of results.
4.2
      </p>
      <sec id="sec-4-1">
        <title>Representation IR2</title>
        <p>IR2 is an extension of IR1. All nodes in the IR2 graph are partially ordered by
the ⪯ ordering in such a way that if  1 ≺  2, then  1 must be executed
before  2, and if  1 =  2, then  1 and  2 can be executed in any order,
and a parallel execution is possible. All edges in the IR2 graph are decorated by
variables (See Fig. 7) which will be the operands of IR3 operations. Each variable
has the following attributes: a unique identifier, a unique name, a type and an
additional Boolean variable which defines the ”IsError” property. The types in
IR2 and IR3 represent the types of the Cloud Sisal language within IR2 and
IR3. Each type contains additional low-level information about objects (such
as machine representation of the type). IR2 is intended to provide a natural
and usable structure for optimizations. During the optimization process, the
optimizations can create additional data connected with a node, an edge or a
port. The data created by one optimization can be reused by another.
IR3 is a classical three-address code representation with hierarchical blocks. For
example, function sign can be represented as follows:
0 entry "function sign[integer]" (V_1(I32) returns V_3(I32));
{
1
2
3
4
5
6
7</p>
        <p>V_5(I32) = V_1(I32);
V_5(I32) = V_1(I32);
V_9(I32) = 0x0(I32);
V_13(I32) = 0x0(I32);
V_7(BOOL) = (V_9(I32) &lt; V_5(I32));
V_11(BOOL) = (V_5(I32) &lt; V_13(I32));
if (V_7(BOOL) == true(BOOL))</p>
        <p>V_15(I32) = 0x1(I32);
V_3(I32) = V_15(I32);
if (V_11(BOOL) == true(BOOL))
{</p>
        <p>V_19(I32) = 0x1(I32);
V_17(I32) = - V_19(I32);
V_3(I32) = V_17(I32);
}
else
{</p>
        <p>V_21(I32) = 0x0(I32);</p>
        <p>V_3(I32) = V_21(I32);
}
}
20 return;</p>
        <p>}
5</p>
        <p>Cross-compiler
The optimizing cross-compiler of the CSS system consists of two main parts:
front-end and back-end compilers (Fig. 8).</p>
        <p>The front-end compiler translates Cloud-Sisal-modules into a monolithic
IR1program which is used also by the interpreter and the graphic
visualization/debugging subsystem.</p>
        <p>
          The back-end compiler begins with R2Gen which produces a semantically
equivalent program in IR2. Then the IR2Opt subsystem performs some
optimizations and concretizations on the annotated program to produce a
semantically equivalent, but faster basic program. After completion of the
machineindependent optimizations, the IR3Gen subsystem preallocates array storage
where compile time analysis or compiler generated expressions executed at run
time can calculate the final size of an array. The result of this phase is the
production of a semantically equivalent program in IR3. The next phase of compilation
(IR3Opt) performs update-in-place analysis and restructures some graphs to help
identify at compile tune those operations that can execute in-place and to
improve chances for in-place operation at run time when analysis fails. It performs
also some machine-dependent optimizations and defines the desired granularity
of parallelism based on an estimate of computational cost and various
parameters that tune analysis. After parallelization, CodeGen generates C++ or C#
code, and the compilation can be completed using the target machine’s C++ or
C# compiler.
New parallel language development is not popular today; more popular is existing
language extension (sometimes it is positioned as a separate language); such
approach keeps sequential semantics problems, but considered as the fastest
both for the developer and for the final application execution. In this section we
will not observe such extensions as related.
This language has been developed as a functional language for creation of
architecture-independent parallel programs [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ]. The Pifagor language is optimized to
dataflow graph description and has a specific syntax which is not easy to
understand because it differs from common imperative and functional languages.
For example, the follow-ing Pifagor function performs vector multiplication by
scalar:
VecScalMult &lt;&lt; funcdef Param
// Argument format: ((x1, x2, : xn), y),
// where ((x1,x2,:xn) is a vector, y is a scalar
{
((Param:1,(Param:2,Param:1:|):dup):#:[]:*) &gt;&gt;return
}
        </p>
        <p>
          It is hard to compare Pifagor syntax and constructions with Sisal because
they are completely different. Sisal has loops and arrays; we suppose it is better
for science computational tasks. According to the articles of the Pifagor
developers [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ] the Pifagor language is aimed on the list processing and the conception
of unlimited parallelism scheduled as limited at runtime. At present, there are
both an experimental compiler and an experimental interpreter for the Pifagor
language that are used for scientific proposes such as a development of the new
scheduling algorithms and for parallel programming education.
6.2
        </p>
      </sec>
      <sec id="sec-4-2">
        <title>The F# language</title>
        <p>
          We can’t say that F# [
          <xref ref-type="bibr" rid="ref18">18</xref>
          ] is the project in a same direction with Sisal, but
Microsoft’s developments in a functional paradigm can’t be avoidable. As the
complexity of the systems was increased the complexity of compiler grows and some
features of the functional languages formerly considered as ineffective started to
implement in imperative languages.
        </p>
        <p>On the one hand F# is functional ML-family language and functional
paradigm suits better for parallel computations. On the other hand F# has an
ability to create any mutable indexes, non-functional calls or dependencies, external
.NET objects and operations. It can’t be considered as single assignment or
parallel language. It is hybrid language that can be used for writing both implicitly
parallel and sequential programs. Multi-threaded programming on F# is quite
similar to C# or C programming.</p>
        <p>Not only in case of the F# language but for the most of functional languages
developers are trying to make the programming language available for wide range
of users but it makes language less pure and less functional. State modification
operators such as input and output give the developer familiar ability to process
the data but make the semantic sequential or non-deterministic.
7</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Conclusion</title>
      <p>The project of visual cloud system CSS aimed at supporting of functional and
parallel programming teaching and learning was considered.</p>
      <p>The CSS system is intended to provide means to write and debug functional
programs regardless target architectures on low-cost devices as well as to
translate them into optimized parallel programs, appropriate to the target execution
platforms, and then execute them in clouds on high performance parallel
computers without extensive rewriting and debugging. So, the CSS system can open
the world of parallel and functional programming to all students and scientists
without requiring a large investment in new, top-end computer systems.</p>
      <p>At present, the CSS system consists of experimental versions of Web-interface,
interpreter, graphic visualization / debugging subsystem, optimizing
cross-compiler. The current target platform for the Cloud-Sisal-compiler is .NET. The
compiler performs conventional optimizing transformations and generates the
C# code. It allows the users to perform the experimental execution of
CloudSisal-programs and examine the effectiveness of optimizing transformations
applied by the compiler. We starts some experiments of using our system for
teaching and leaning of functional and parallel programming as well as of optimizing
compilation and high performance computing.</p>
      <p>Acknowledgments. Our thanks to all colleagues taking part in the project
described. This research is supported by the Russian Foundation for Basic
Research under grant RFBR N 15-07-02029.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Backus</surname>
          </string-name>
          , J.:
          <article-title>Can programming be liberated from the von Neumann style? Commun</article-title>
          . ACM.
          <volume>21</volume>
          ,
          <issue>8</issue>
          ,
          <fpage>613</fpage>
          -
          <lpage>641</lpage>
          (
          <year>1978</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Cann</surname>
            ,
            <given-names>D. C.</given-names>
          </string-name>
          : Retire Fortran?
          <article-title>: a debate rekindled</article-title>
          .
          <source>Commun. ACM</source>
          .
          <volume>34</volume>
          ,
          <issue>8</issue>
          ,
          <fpage>81</fpage>
          -
          <lpage>89</lpage>
          (
          <year>1992</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Gaudiot</surname>
          </string-name>
          , J.-L.,
          <string-name>
            <surname>DeBoni</surname>
          </string-name>
          , T.,
          <string-name>
            <surname>Feo</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          , et all:
          <article-title>The Sisal project: real world functional programming</article-title>
          . In: Pande,
          <string-name>
            <given-names>S.</given-names>
            ,
            <surname>Agrawal</surname>
          </string-name>
          ,
          <string-name>
            <surname>D.P</surname>
          </string-name>
          . (eds.)
          <article-title>Compiler Optimizations for Scalable Parallel Systems: Languages, Compilation Techniques, and Run Time Systems</article-title>
          . LNCS, vol.
          <year>1808</year>
          , pp.
          <fpage>45</fpage>
          -
          <lpage>72</lpage>
          . Springer, Heidelberg (
          <year>2001</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>McGraw</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Skedzielewski</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Allan</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Grit</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Oldehoeft</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Glauert</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dobes</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Hohensee</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>SISAL-Streams and Iterations in a Single Assignment Language</article-title>
          ,
          <source>Language Reference Manual: Version 1.2. Technical Report TR M-146</source>
          , University of California, Lawrence Livermore Laboratory,
          <source>March</source>
          (
          <year>1985</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Feo</surname>
            ,
            <given-names>J. T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Miller</surname>
            ,
            <given-names>P. J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Skedzielewski</surname>
            ,
            <given-names>S. K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Denton</surname>
            ,
            <given-names>S. M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Solomon</surname>
            ,
            <given-names>C. J.</given-names>
          </string-name>
          :
          <source>SISAL 90. In: Proceedings of High Performance Functional Computing</source>
          , pp.
          <fpage>35</fpage>
          -
          <lpage>47</lpage>
          , Denver (
          <year>1995</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Kasyanov</surname>
            ,
            <given-names>V. N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Stasenko</surname>
            ,
            <given-names>A.P.</given-names>
          </string-name>
          :
          <article-title>Sisal 3.2 programming language</article-title>
          .
          <source>In: Tools and techniques of program construction</source>
          , pp.
          <fpage>56</fpage>
          -
          <lpage>134</lpage>
          ,
          <string-name>
            <surname>Novosibirsk</surname>
          </string-name>
          (
          <year>2007</year>
          )
          <article-title>(In Russian)</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Kasyanov</surname>
            ,
            <given-names>V. N.</given-names>
          </string-name>
          :
          <article-title>Sisal 3.2: functional language for scientific parallel programming</article-title>
          .
          <source>Enterprise Information Systems. 7</source>
          ,
          <issue>2</issue>
          ,
          <fpage>227</fpage>
          -
          <lpage>236</lpage>
          (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Cann</surname>
            ,
            <given-names>D. C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Feo</surname>
            ,
            <given-names>J.T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bohm</surname>
            ,
            <given-names>A. P. W.</given-names>
          </string-name>
          , et all:
          <source>Sisal Reference Manual: Language Version 2</source>
          .0.
          <string-name>
            <surname>Tech</surname>
          </string-name>
          . Rep. Lawrence Livermore National Laboratory, UCRLMA-
          <volume>109098</volume>
          , Livermore, CA (
          <year>1991</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Kasyanov</surname>
            ,
            <given-names>V. N. Idrisov R.I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kasyanova</surname>
            <given-names>E.V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Stasenko</surname>
            <given-names>A.P.:</given-names>
          </string-name>
          <article-title>A parallel programming language Cloud Sisal</article-title>
          . In: Proceedings of XVI International Conference “Informatics: problems, methodology,
          <source>technology”</source>
          . vol.
          <volume>5</volume>
          , pp.
          <fpage>157</fpage>
          -
          <lpage>161</lpage>
          ,
          <string-name>
            <surname>Voronezh</surname>
          </string-name>
          (
          <year>2016</year>
          )
          <article-title>(In Russian)</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Kasyanov</surname>
            ,
            <given-names>V. N.</given-names>
          </string-name>
          :
          <article-title>Transformational approach to program concretization</article-title>
          .
          <source>Theoretical Computer Science</source>
          .
          <volume>90</volume>
          ,
          <issue>1</issue>
          ,
          <fpage>37</fpage>
          -
          <lpage>46</lpage>
          (
          <year>1991</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Kasyanov</surname>
            ,
            <given-names>V. N.:</given-names>
          </string-name>
          <article-title>A support tool for annotated program manipulation</article-title>
          .
          <source>In: Proceedings of Fifth European Conference on Software Maintenance and Reengineering</source>
          , pp.
          <fpage>85</fpage>
          -
          <lpage>94</lpage>
          , IEEE Computer Society Press, (
          <year>2001</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Kasyanov</surname>
            ,
            <given-names>V. N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kasyanova</surname>
            ,
            <given-names>E. V.</given-names>
          </string-name>
          :
          <article-title>Information visualization based on graph models</article-title>
          .
          <source>Enterprise Information Systems. 7</source>
          ,
          <issue>2</issue>
          ,
          <fpage>187</fpage>
          -
          <lpage>197</lpage>
          (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Kasyanov</surname>
            ,
            <given-names>V. N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kasyanova</surname>
            ,
            <given-names>E. V.</given-names>
          </string-name>
          :
          <article-title>Graph- and cloud-based tools for computer science education</article-title>
          . In: Boumerdassi,
          <string-name>
            <given-names>S.</given-names>
            ,
            <surname>Bouzefrane</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            ,
            <surname>Renault</surname>
          </string-name>
          ,
          <string-name>
            <surname>E. (eds.) MSPN</surname>
          </string-name>
          <year>2015</year>
          .
          <article-title>LNCS</article-title>
          , vol.
          <volume>9395</volume>
          ,
          <fpage>41</fpage>
          -
          <lpage>54</lpage>
          . Springer, Heidelberg (
          <year>2015</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Gordeev</surname>
            ,
            <given-names>D.S.:</given-names>
          </string-name>
          <article-title>Visualization of internal representation of Cloud Sisal programs</article-title>
          .
          <source>Scientific Visualization. 8</source>
          ,
          <issue>2</issue>
          ,
          <fpage>98</fpage>
          -
          <lpage>106</lpage>
          (
          <year>2016</year>
          )
          <article-title>(In Russian)</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Idrisov</surname>
          </string-name>
          , R.:
          <article-title>Sisal: parallel language development</article-title>
          .
          <source>In: Proceedings of the 6th Spring/Summer Young Researchers Colloquium on Software Engineering (SYRCoSE</source>
          <year>2012</year>
          ), pp.
          <fpage>38</fpage>
          -
          <lpage>42</lpage>
          ,
          <string-name>
            <surname>Perm</surname>
          </string-name>
          (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Cytron</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ferrante</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rosen</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wegman</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Zadeck</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          :
          <article-title>Eficiently computing static single assignment form</article-title>
          .
          <source>Transactions on Programming Languages and Systems</source>
          .
          <volume>13</volume>
          ,
          <issue>4</issue>
          ,
          <fpage>451</fpage>
          -
          <lpage>490</lpage>
          (
          <year>1991</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Legalov</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          :
          <article-title>Functional language for creation of architecture-independent parallel programs</article-title>
          .
          <source>Computational Technologies</source>
          .
          <volume>10</volume>
          ,
          <issue>1</issue>
          ,
          <fpage>71</fpage>
          -
          <lpage>89</lpage>
          (
          <year>2005</year>
          )
          <article-title>(In Russian)</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Syme</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Granicz</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cisternino</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          : Expert F#
          <volume>3</volume>
          .0.
          <string-name>
            <surname>Apress</surname>
          </string-name>
          (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>