<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>0012-7353</journal-id>
<journal-title><![CDATA[DYNA]]></journal-title>
<abbrev-journal-title><![CDATA[Dyna rev.fac.nac.minas]]></abbrev-journal-title>
<issn>0012-7353</issn>
<publisher>
<publisher-name><![CDATA[Universidad Nacional de Colombia]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S0012-73532014000400032</article-id>
<article-id pub-id-type="doi">10.15446/dyna.v81n186.40428</article-id>
<title-group>
<article-title xml:lang="en"><![CDATA[Attaining multiple dispatch in widespread object-oriented languages]]></article-title>
<article-title xml:lang="es"><![CDATA[Aproximaciones para obtener multi-métodos en los lenguajes orientados a objetos más extendidos]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Ortin]]></surname>
<given-names><![CDATA[Francisco]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Quiroga]]></surname>
<given-names><![CDATA[Jose]]></given-names>
</name>
<xref ref-type="aff" rid="A02"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Redondo]]></surname>
<given-names><![CDATA[Jose M.]]></given-names>
</name>
<xref ref-type="aff" rid="A03"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Garcia]]></surname>
<given-names><![CDATA[Miguel]]></given-names>
</name>
<xref ref-type="aff" rid="A04"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,University of Oviedo Computer Science Department ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
<country>Spain</country>
</aff>
<aff id="A02">
<institution><![CDATA[,University of Oviedo Computer Science Department ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
<country>Spain</country>
</aff>
<aff id="A03">
<institution><![CDATA[,University of Oviedo Computer Science Department ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
<country>Spain</country>
</aff>
<aff id="A04">
<institution><![CDATA[,University of Oviedo Computer Science Department ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
<country>Spain</country>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>08</month>
<year>2014</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>08</month>
<year>2014</year>
</pub-date>
<volume>81</volume>
<numero>186</numero>
<fpage>242</fpage>
<lpage>250</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_arttext&amp;pid=S0012-73532014000400032&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_abstract&amp;pid=S0012-73532014000400032&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_pdf&amp;pid=S0012-73532014000400032&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="en"><p><![CDATA[Multiple dispatch allows determining the actual method to be executed, depending on the dynamic types of its arguments. Although some programming languages provide multiple dispatch, most widespread object-oriented languages lack this feature. Therefore, different implementation techniques are commonly used to obtain multiple dispatch in these languages. We evaluate the existing approaches, presenting a new one based on hybrid dynamic and static typing. A qualitative evaluation is presented, considering factors such as software maintainability and readability, code size, parameter generalization, and compile-time type checking. We also perform a quantitative assessment of runtime performance and memory consumption.]]></p></abstract>
<abstract abstract-type="short" xml:lang="es"><p><![CDATA[Los multi-métodos seleccionan una de las implementaciones de un método sobrecargado, dependiendo en el tipo dinámico de sus argumentos. Aunque existen lenguajes que soportan multi-métodos, la mayoría de los lenguajes más extendidos no ofrecen esta funcionalidad. Por ello, es común ver el uso de distintos mecanismos auxiliares para obtener su funcionalidad. En este artículo evaluamos las alternativas existentes y presentamos una nueva basada en lenguajes con tipado híbrido. Una primera evaluación cualitativa analiza factores como la mantenibilidad, legibilidad, tamaño del código fuente, generalización de los parámetros y comprobación estática de tipos. También presentamos una evaluación cuantitativa del rendimiento en tiempo de ejecución y consumo de memoria.]]></p></abstract>
<kwd-group>
<kwd lng="en"><![CDATA[Multiple dispatch]]></kwd>
<kwd lng="en"><![CDATA[multi-method]]></kwd>
<kwd lng="en"><![CDATA[dynamic binding]]></kwd>
<kwd lng="en"><![CDATA[reflection]]></kwd>
<kwd lng="en"><![CDATA[method overload]]></kwd>
<kwd lng="en"><![CDATA[hybrid typing]]></kwd>
<kwd lng="es"><![CDATA[Multi-métodos]]></kwd>
<kwd lng="es"><![CDATA[enlace dinámico]]></kwd>
<kwd lng="es"><![CDATA[reflexión]]></kwd>
<kwd lng="es"><![CDATA[sobrecarga de métodos]]></kwd>
<kwd lng="es"><![CDATA[tipado híbrido]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a href="http://dx.doi.org/10.15446/dyna.v81n186.40428" target="_blank">http://dx.doi.org/10.15446/dyna.v81n186.40428</a></font></p>     <p align="center"><font size="4" face="Verdana, Arial, Helvetica, sans-serif"><b>Attaining multiple   dispatch in widespread object-oriented languages</b></font></p>     <p align="center"><i><font size="3"><b><font face="Verdana, Arial, Helvetica, sans-serif">Aproximaciones   para obtener multi-m&eacute;todos en los lenguajes orientados a objetos m&aacute;s extendidos</font></b></font></i></p>     <p align="center">&nbsp;</p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Francisco Ortin <i><sup>a</sup></i>, Jose Quiroga <i><sup>b</sup></i>,   Jose M. Redondo <i><sup>c</sup></i> &amp;   Miguel Garcia <i><sup>d</sup></i></b></font></p>     <p align="center">&nbsp;</p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><sup><i>a </i></sup><i>Computer Science Department, University of   Oviedo, Spain, <a href="mailto:ortin@uniovi.es">ortin@uniovi.es</a>    <br>   <sup>b </sup>Computer Science Department, University of   Oviedo, Spain, <a href="mailto:quirogajose@uniovi.es">quirogajose@uniovi.es</a>    <br>   <sup>c </sup>Computer Science Department, University of   Oviedo, Spain, <a href="mailto:redondojose@uniovi.es">redondojose@uniovi.es</a>    <br>   <sup>d </sup>Computer Science Department, University of   Oviedo, Spain, <a href="mailto:garciarmiguel@uniovi.es">garciarmiguel@uniovi.es</a></i></font></p>     ]]></body>
<body><![CDATA[<p align="center">&nbsp;</p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Received: October   23<sup>th</sup>, de 2013. Received in revised form: April 28<sup>th</sup>, 2014. Accepted: May 22<sup>th</sup>,   2014</b></font></p>     <p align="center">&nbsp;</p> <hr>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Abstract    <br>   </b></font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Multiple dispatch allows determining the actual method to   be executed, depending on the dynamic types of its arguments. Although some   programming languages provide multiple dispatch, most widespread   object-oriented languages lack this feature. Therefore, different   implementation techniques are commonly used to obtain multiple dispatch in   these languages. We evaluate the existing approaches, presenting a new one   based on hybrid dynamic and static typing. A qualitative evaluation is   presented, considering factors such as software maintainability and   readability, code size, parameter generalization, and compile-time type   checking. We also perform a quantitative assessment of runtime performance and   memory consumption.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>Keywords:</i> Multiple dispatch; multi-method; dynamic binding;   reflection; method overload; hybrid typing.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Resumen    <br>   </b></font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los   multi-m&eacute;todos seleccionan una de las implementaciones de un m&eacute;todo   sobrecargado, dependiendo en el tipo din&aacute;mico de sus argumentos. Aunque existen   lenguajes que soportan multi-m&eacute;todos, la mayor&iacute;a de los lenguajes m&aacute;s   extendidos no ofrecen esta funcionalidad. Por ello, es com&uacute;n ver el uso de   distintos mecanismos auxiliares para obtener su funcionalidad. En este art&iacute;culo   evaluamos las alternativas existentes y presentamos una nueva basada en lenguajes   con tipado h&iacute;brido. Una primera evaluaci&oacute;n cualitativa analiza factores como la   mantenibilidad, legibilidad, tama&ntilde;o del c&oacute;digo fuente, generalizaci&oacute;n de los   par&aacute;metros y comprobaci&oacute;n est&aacute;tica de tipos. Tambi&eacute;n presentamos una evaluaci&oacute;n   cuantitativa del rendimiento en tiempo de ejecuci&oacute;n y consumo de memoria.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>Palabras clave:</i> Multi-m&eacute;todos; enlace din&aacute;mico;   reflexi&oacute;n; sobrecarga de m&eacute;todos; tipado h&iacute;brido.</font></p> <hr>     <p>&nbsp;</p>     ]]></body>
<body><![CDATA[<p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>1.  Introduction</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Object-oriented programming languages provide dynamic binding as a   mechanism to implement maintainable code. Dynamic binding is a dispatching   technique that postpones the process of associating a message to a specific   method until runtime. Therefore, when the toString message is passed to a   Java object, the actual toString method called is that   implemented by the dynamic type of the object, discovered by the virtual   machine at runtime. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Although dynamic binding is a powerful tool, widespread languages such as   Java, C# and C++ only support it as a single dispatch mechanism: the actual   method to be invoked depends on the dynamic type of a <i>single </i>object. In these languages, multiple-dispatch is simulated   by the programmer using specific design patterns, inspecting the dynamic type   of objects, or using reflection. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">In languages that support multiple-dispatch, a message can be   dynamically associated to a specific method based on the runtime type of all   its arguments. These multiple-dispatch methods are also called multi-methods &#91;1&#93;. For example, if we   want to evaluate binary expressions of different types with different   operators, multi-methods allow modularizing each operand-operator-operand   combination in a single method. In the example C# code in <a href="#fig01">Fig. 1</a>, each Visit method implements a   different kind of operation for three concrete types, returning the appropriate   value type. </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="fig01"></a></font><img src="/img/revistas/dyna/v81n186/v81n186a32fig01.gif"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">As shown in <a href="#fig02">Fig. 2</a>,   the values and operators implement the Value and Operator interface, respectively. Taking two Value operands and an Operator, a multi-method is able   to receive these three parameters and dynamically select the appropriate Visit method to be called. It works like dynamic   binding, but with multiple types. In our example, a triple dispatch mechanism   is required (the appropriate Visit method   to be called is determined by the dynamic type of its <i>three</i> parameters).</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="fig02"></a></font><img src="/img/revistas/dyna/v81n186/v81n186a32fig02.gif"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Polymorphism can be used to provide a default behavior if   one combination of two expressions and one operator is not provided. Since   Value and Operator are the base types of the parameters (<a href="#fig02">Fig. 2</a>), the last   Visit method in <a href="#fig01">Fig. 1</a> will be called by the multiple dispatcher when there is   no other suitable Visit method with the concrete dynamic types of the arguments   passed. An example is evaluating the addition (AddOp) of two Boolean (Bool)   expressions.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">In this paper, we   analyze the common approaches programmers use to simulate multiple dispatching   in those widespread object-oriented languages that only provide single dispatch   (e.g., Java, C# and C++). To qualitatively compare the different alternatives,   we consider factors such as software maintainability and readability, code size,   parameter generalization, and compile-time type checking. A quantitative   assessment of runtime performance and memory consumption is also presented. We   also present a new approach to obtain multiple dispatch in languages that   provide hybrid dynamic and static typing, such as C#, Objective-C, Boo and   Cobra. This alternative provides high maintainability and readability, requires   reduced code size, allows parameter generalization, and performs significantly   better than the reflective approach. In contrast, it requires 31% more memory   resources than the other alternatives.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">The rest of this paper is structured as follows. In   Section 2, the common approaches to obtain multi-methods in widespread   object-oriented programming languages are presented and qualitatively   evaluated. Section 3 presents a new approach for hybrid typing languages, and a   comparison with the previously analyzed systems. Section 4 details the runtime   performance and memory consumption evaluation. Conclusions and future work are   presented in Section 5.</font></p>     ]]></body>
<body><![CDATA[<p>&nbsp;</p>     <p><b><font size="3" face="Verdana, Arial, Helvetica, sans-serif">2.  Common   approaches</font></b></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>2.1.  The Visitor   design pattern    <br>   </b>The Visitor design pattern is a very common approach to obtain   multiple dispatch in object-oriented languages that do not implement   multi-methods &#91;2&#93;. By using method   overloading, each combination of non-abstract types is implemented in a   specific Visit method (<a href="#fig01">Fig. 1</a>). Static type checking is used to modularize each   operation in a different method. The compiler solves method overloading by selecting   the appropriate implementation depending on the static types of the parameters.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Suppose an n-dispatch scenario: a method with n   polymorphic parameters, where each parameter should be dynamically dispatched   considering its dynamic type (i.e., multiple dynamic binding). In this   n-dispatch scenario, the n parameters belong to the H1, H2... Hn hierarchies,   respectively. Under these circumstances, there are potentially <img src="/img/revistas/dyna/v81n186/v81n186a32eq002.gif"> Visit methods, CCi being the number of   concrete (non-abstract) classes in the Hi hierarchy. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Using polymorphism, parameters can be generalized in   groups of shared behavior (base classes or interfaces). An example of this   generalization is the two last addition methods in <a href="#fig01">Fig. 1</a>. They generalize the   way strings are concatenated with any other Value. This feature that allows   grouping implementations by means of polymorphism is the parameter   generalization criterion mentioned in the previous section. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">As shown in <a href="#fig02">Fig. 2</a>, the Visitor pattern places the Visit   methods in another class (or hierarchy) to avoid mixing the tree structures to   be visited (Value and Operator) with the traversal algorithms (Visitor) &#91;3&#93;. The (single) dispatching   mechanism used to select the correct Visit method is dynamic binding &#91;2&#93;. A polymorphic (virtual)   method must be declared in the tree hierarchy, because that is the hierarchy   the specific parameter types of the Visit methods belong to. In <a href="#fig02">Fig. 2</a>, the   Accept method in Value provides the multiple dispatch. When overriding this   method in a concrete Value class, the type of   this will be non-abstract, and hence the specific dynamic type of the first parameter of Visit will be   known. Therefore, by using dynamic binding, the type of the first parameter is   discovered. This process has to be repeated for every parameter of the Visit   method. In our example (<a href="#fig02">Fig. 2</a>), the type of the second operand is discovered   with the Accept2 method in Operator, and Accept3 in Value discovers the type of   the third parameter before calling the appropriate Visit method.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">In this approach, the number of AcceptX method   implementations grows geometrically relative to the dispatch dimensions (i.e.,   the n in n-dispatch, or the number of the Visit parameters). Namely, for H1,   H2... Hn hierarchies of the corresponding n parameters in Visit, the number of   Accept methods are 1+<img src="/img/revistas/dyna/v81n186/v81n186a32eq006.gif">.   Therefore, the code size grows geometrically with the number of parameters in   the multi-method. Additionally, declaring the signature of each single AcceptX   method is error-prone and reduces its readability.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Adding a new concrete class to the tree hierarchy requires   adding more AcceptX methods to the implementation (see the formula in the   previous paragraph). This feature reduces the maintainability of this approach,   causing the so-called expression problem &#91;4&#93;. This problem is produced   when the addition of a new type to a type hierarchy involves changes in other   classes. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">The Visitor approach provides different advantages. First,   the static type error detection provided by the compiler. Second, the best   runtime performance (see Section 4). Finally, parameter generalization, as   mentioned, is also supported. A summary of the pros and cons of all the   approaches is presented in <a href="#tab01">Table 1</a>.</font></p>     ]]></body>
<body><![CDATA[<p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="tab01"></a></font><img src="/img/revistas/dyna/v81n186/v81n186a32tab01.gif"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>2.2.  Runtime type   inspection</b>    <br>   </font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">In the previous approach, the dispatcher is   implemented by reducing multiple-dispatch to multiple cases of single dispatch.   Its high dependence on the number of concrete classes makes it error-prone and   reduces its maintainability. This second approach implements a dispatcher by   consulting the dynamic type of each parameter in order to   solve the specific Visit method to be called. This type inspection could be performed by either   using an <i>is type of</i> operator (e.g., is in C# or instanceof in Java) or asking   the type of an object at runtime (</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">e.g., GetType in C# or getClass in Java). <a href="#fig03">Fig. 3</a> shows an example implementation   in C# using the is operator. Notice   that this single Accept method is part of the EvaluateExpression class in <a href="#fig01">Fig. 1</a> (it does not need to be added to   the tree hierarchy). </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="fig03"></a></font><img src="/img/revistas/dyna/v81n186/v81n186a32fig03.gif"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a href="#fig03">Fig. 3</a> shows the low readability of this approach for our triple dispatch   example with seven concrete classes. The maintainability of the code is also   low, because the dispatcher implementation is highly coupled with the number of   both the parameters of the Visit method and the concrete classes in the tree   hierarchy. At the same time, the code size of the dispatcher grows with the   number of parameters and concrete classes.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">The is operator approach makes extensive use of type casts. Since cast   expressions perform type checks at runtime, this approximation loses the   robustness of full compile-time </font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">type checking. The GetType approach also has this limitation together with the   use of strings for class names, which may cause runtime errors when the class   name is not written correctly. Parameter generalization is provided by means of   polymorphism. As discussed in Section 4, the runtime performance of these two   approaches (is and GetType) is not as good as that of the previous alternative.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i><b>2.3  Reflection</b>    <br>   </i></font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">The objective of the reflection approach is to   implement a dispatcher that does not depend on the number of concrete classes   in the tree hierarchy. For this purpose, not only the types of the parameters   but also the methods to be invoked are discovered at runtime. The mechanism   used to obtain this objective is reflection, one of the main techniques used in   meta-programming &#91;5&#93;. Reflection is the capability of a computational system to reason about   and act upon itself, adjusting itself to changing conditions &#91;6&#93;. Using reflection, the self-representation of programs can be dynamically   consulted and, sometimes, modified &#91;7&#93;. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">As shown in <a href="#fig05">Fig. 5</a>, the dynamic type of an   object can be obtained using reflection (GetType). It is also possible to retrieve the specific Visit method implemented by its dynamic type (GetMethod), passing the dynamic types of the parameters.   It also provides the runtime invocation of dynamically discovered methods (Invoke). </font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">The code size of this approach does not grow with the number of concrete   classes. Moreover, the addition of another parameter does involve important   changes in the code. Consequently, as shown in <a href="#tab01">Table 1</a>, this approach is more   maintainable than the previous ones. Although the reflective Accept method in <a href="#fig04">Fig. 4</a> may   be somewhat atypical at first, we think its readability is certainly higher   than the one in <a href="#fig03">Fig. 3</a>.</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="fig04"></a></font><img src="/img/revistas/dyna/v81n186/v81n186a32fig04.gif"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">The first drawback of this approach is that no   static type checking is performed. If Accept invokes a nonexistent Visit method, an exception is thrown at runtime, but no compilation error is   produced. Another limitation is that parameter generalization is not provided   because reflection only looks for one specific Visit method. If an implementation with the exact signature specified does not   exist, no other polymorphic implementation is searched (e.g., the last Visit method in <a href="#fig01">Fig. 1</a> is never called). Finally, this   approach showed the worst runtime performance in our evaluation (Section 4).</font></p>     <p>&nbsp;</p>     <p><b><font size="3" face="Verdana, Arial, Helvetica, sans-serif">3.  A hybrid typing   approach</font></b></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Hybrid static and dynamic typing (henceforth referred to   simply as <i>hybrid typing</i>) languages   provide both typing approaches in the very same programming language.   Programmers may use one alternative or the other depending on their interests,   following the <i>static typing where   possible, dynamic typing when needed</i> principle &#91;8&#93;.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">In the case of multiple dispatch, we have used static   typing to modularize the implementation of each operand and operator type   combination (Visit methods in <a href="#fig01">Fig. 1</a>). We propose the use of dynamic typing to implement multiple   dispatchers that dynamically discover the suitable Visit method to be invoked. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">In a hybrid typing language, its static typing rules are   also applied at runtime when dynamic typing is selected. This means that, for   instance, method overload is postponed until runtime, but the resolution   algorithm stays the same &#91;9&#93;.   We have used this feature to implement a multiple dispatcher that discovers the   correct Visit method to be invoked at runtime, using the overload resolution mechanism   provided by the language. At the same time, parameter generalization by means   of polymorphism is also achieved.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a href="#fig05">Fig. 5</a> shows an example of a multiple dispatch   implementation (Accept method) in C#. With dynamic, the programmer indicates that   dynamic typing is preferred, postponing the overload resolution until runtime.   The first maintainability benefit is that the dispatcher does not depend on the   number of concrete classes in the tree hierarchy (the <i>expression problem</i> &#91;4&#93;). Besides, another   dispatching dimension can be provided by simply declaring one more parameter,   and passing it as a new argument to Visit. The dispatcher consists in a single   invocation to the overloaded Visit method, indicating which parameters require dynamic binding (multiple dispatching) with a cast to dynamic. If the programmer wants to avoid   dynamic binding for a specific parameter, this cast to dynamic will not be used. This simplicity makes the code highly readable and reduces   its size considerably (<a href="#tab01">Table 1</a>). At the same time, since the overload   resolution mechanism is preserved, parameter generalization by means of   polymorphism is also provided (i.e., polymorphic methods like the two last   addition implementations for strings in <a href="#fig01">Fig. 1</a>). </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="fig05"></a></font><img src="/img/revistas/dyna/v81n186/v81n186a32fig05.gif"></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">In C#, static type checking is disabled when the dynamic type   is used, lacking the compile-time detection of type errors. However, there are   research works on hybrid typing languages, such as the <i>StaDyn</i> programming language &#91;10&#93;, which provide static type   checking when the dynamic type is used. When this feature is not supported, the best   approach is to use static types to declare the Accept parameters using polymorphism   (restricting their types to Value and Operator, as shown in <a href="#fig05">Fig. 5</a>). At the same time, exception   handling is another mechanism that can be used to make the code more robust   -notice that parameter generalization reduces the number of possible exceptions   to be thrown, compared to the reflection approach. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Finally, this approach shows a runtime performance between   the statically typed implementation and the reflective one (see Section 4).   Hybrid typing languages, including C#, commonly implement a dynamic cache to   improve runtime performance of dynamically typed code &#91;11&#93;.   This technique provides a significant runtime performance improvement compared   to reflection &#91;12&#93;. </font></p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>4.  Evaluation</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">In this section,   we measure execution time and memory consumption of the five different   approaches analyzed. Detailed information is presented to justify the   performance and memory assessment in the two last columns of <a href="#tab01">Table 1</a>. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>4.1.  Methodology</b>    <br>   </font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">In order to   compare the performance of the proposed approaches, we have developed a set of   synthetic micro-benchmarks. These benchmarks measure the influence of the   following variables on runtime performance and memory consumption: </font></p> <ul>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Dispatch dimensions. We have     measured programs executing single, double and triple dispatch methods. These     dispatch dimensions represent the number of parameters passed to the Accept method shown in <a href="#fig03">Figs. 3</a>, <a href="#fig04">4</a> and <a href="#fig05">5</a>.</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Number of concrete classes.     This variable is the number of concrete classes of each parameter of the Accept method. For each one, we define from     1 to 5 possible derived concrete classes. Therefore, the implemented     dispatchers will have to select the correct Visit method out of up to 125 different     implementations (5<sup>3</sup>). </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Invocations. Each program is     called an increasing number of times to analyze their performance in     long-running scenarios (e.g., server applications). </font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Approach. The same application is implemented using     the static typing, runtime type inspection (is and GetType alternatives), reflection, and hybrid typing approaches.</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Each program implements a collection of Visit methods that   simply increment a counter field. The idea is to measure the execution time of   each dispatch technique, avoiding additional significant computation -we   have previously evaluated a more realistic application in &#91;13&#93;. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Regarding the data analysis, we have followed the   methodology proposed in &#91;14&#93;   to evaluate the runtime performance of applications, including those executed   on virtual machines that provide JIT compilation. We have followed a two-step   methodology: </font></p> <ol>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">We     measure the elapsed execution time of running multiple times the same program.     This results in <i>p</i> (we have taken <i>p</i> = 30) measurements <i>x<sub>i</sub></i> with 1&le; <i>i</i> &le; <i>p</i>. </font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">The     confidence interval for a given confidence level (95%) is computed to eliminate     measurement errors that may introduce a bias in the evaluation. The confidence     interval is computed using the <i>Student's</i> <i>t</i>-distribution because we took <i>p</i> = 30 &#91;15&#93;. Therefore, we compute the confidence interval &#91;<i>c<sub>1</sub></i>,<i>c<sub>2</sub></i>&#93; as: </font></li>     </ol>     <p><img src="/img/revistas/dyna/v81n186/v81n186a32eq01.gif"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">where <img src="/img/revistas/dyna/v81n186/v81n186a32eq012.gif"> is the arithmetic mean of the xi measurements, <font face="Symbol">a</font> = 0.05(95%), s is the standard deviation of the xi measurements, and <img src="/img/revistas/dyna/v81n186/v81n186a32eq014.gif"> is defined such that a random variable T, that   follows the Student's t-distribution with <img src="/img/revistas/dyna/v81n186/v81n186a32eq016.gif"> degrees of freedom, obeys</font></p>     <p><img src="/img/revistas/dyna/v81n186/v81n186a32eq02.gif"></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">The memory   consumption has been measured following the same methodology to determine the   memory used by the whole process. All the tests were carried out on a lightly   loaded 3.4 GHz Intel Core I7 2600 system with 16 GB of RAM running an updated   64-bit version of Windows 8 Professional.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>4.2.  Runtime   performance    <br>   </b><a href="#fig06">Fig. 6</a> shows the execution time of single, double and   triple dispatch, when each parameter of the multi-method has five concrete   derived types. Each Visit method is executed at least once. To analyze the   influence of the number of invocations on the execution time, we invoke   multi-methods in loops from 1 to 100,000 iterations. <a href="#fig06">Fig. 6</a> shows the average   execution time for a 95% confidence level, with an error interval lower than   2%.</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="fig06"></a></font><img src="/img/revistas/dyna/v81n186/v81n186a32fig06.gif"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">As can be seen in <a href="#fig06">Fig. 6</a>, all the approaches have a linear   influence of the number of iterations on execution time. However, the dispatch   dimension (i.e., the number of multi-method parameters) of the analyzed   approaches shows a different influence. For single dispatch, the hybrid typing   approach is 19% and 2,787% faster than GetType and reflection, respectively,   but requires 157% and 876% more execution time than is and static typing. For   double dispatch, the runtime performance of the hybrid approach improves in   comparison with the rest of alternatives (<a href="#fig06">Fig. 6</a>). For triple dispatch, the   hybrid static and dynamic typing alternative is the second fastest one,   performing 1.4, 2.5 and 265 times better than is, GetType and reflection, respectively   (static typing is 2.7 times faster than hybrid typing in this scenario). </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a href="#fig07">Fig. 7</a> shows execution time, when the number of concrete   classes that implement each multi-method parameter increases (for 100,000 fixed   iterations). For each parameter, we increment (from 1 to 5) the number of its   derived concrete classes. In the case of triple dispatch and five different   concrete classes, the multiple dispatcher has to select the correct Visit   method out of 125 (53) different implementations.</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="fig07"></a></font><img src="/img/revistas/dyna/v81n186/v81n186a32fig07.gif"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">As shown in <a href="#fig07">Fig. 7</a>, the relative performance of the hybrid   approach improves as the number of concrete classes increases. For single   dispatch, hybrid typing requires 213% more execution time than GetType for one   concrete type of the single parameter; however, the hybrid approach is 19%   faster than GetType for five different concrete types. For double dispatch, the   hybrid approach improves its relative performance, being faster than GetType   for any number of classes. When the dimension of the dispatch is triple, the   relative runtime performance of the hybrid approach also improves as the number   of concrete classes increases. With five different types for each of the three   parameters, the hybrid approach is the second fastest one, being 40% faster   than is and 265 times faster than reflection (static typing is 2.7 times faster   than hybrid typing). </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>4.3.  Memory   consumption</b>    <br>   </font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">We have measured memory consumption, analyzing all the   variables mentioned in the Section 4.1. There is no influence of the number of   iterations, the dimensions of dispatch, or the number of concrete classes, in   the memory consumed by the benchmark. </font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">The memory required by all approaches except hybrid typing   are similar (the difference is 1%, lower than the 2% error interval). However,   the hybrid approach involves an average increase of 31% compared with the other   approaches. This difference is due to the use of the Dynamic Language Runtime   (DLR) &#91;16&#93;. The DLR is a new layer   over the CLR to provide a set of services to facilitate the implementation of   dynamic languages. The DLR implements a runtime cache to optimize runtime   performance of dynamically typed operations, performing better than reflection   (as shown in <a href="#fig06">Figs. 6</a> and <a href="#fig07">7</a>) &#91;13&#93;. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">However, this runtime performance improvement also   requires additional memory resources. </font></p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>5.  Related work</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">In this section, we describe the existing languages and   frameworks that provide multiple dispatch &#91;17&#93;. CLOS &#91;18&#93; and Clojure &#91;19&#93; are   examples of dynamically typed languages that include multi-methods in their   semantics. Clojure has recently created a port for .Net that makes use of the   DLR &#91;20&#93;. These approaches are fully dynamic, detecting all the type errors at   runtime. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Xtend is a Java extension that provides statically typed   multiple dispatch &#91;21&#93;.   Method resolution and binding in Xtend are done at compile time as in Java.   Dylan &#91;22&#93;,   Cecil &#91;1&#93; and, recently, Groovy 2 &#91;23&#93;   are programming languages that provide both dynamic and static typing. Although   these three languages support dynamically typed multi-methods, multiple   dispatch can also be achieved with the hybrid typing approach proposed in this   article. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Many different approaches exist to provide multiple   dispatch for the Java platform. One of the first works is Runabout, a library   to support two-argument dispatch (i.e., </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">double dispatch) for Java &#91;24&#93;.   Runabout is based on improving a previous reflective implementation of the   Visitor pattern called Walkabout &#91;25&#93;.   The appropriate method implementation is found via reflection, but method   invocation is performed by generating Java bytecode at runtime performing   better than Walkabout. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Dynamic Dispatcher is a double-dispatch framework for Java   &#91;26&#93;.   Three different dispatch methods are provided, combining the use of reflection   and dynamic code generation. It provides the generalization of multi-method   parameters by means of polymorphism. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Sprintabout is another   double-dispatch alternative for Java, provided as a library &#91;27&#93;. Sprintabout   uses a naming convention to identify multi-methods. Multi-methods implement a   runtime type inspection dispatch (the GetType approach). The dispatch object implements a cache to efficiently obtain the   different method implementations at runtime, avoiding the use of reflection. </font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MultiJava is a   backward-compatible extension of Java that supports any dispatch dimension (not   just double dispatch) &#91;28&#93;. Given a set of multi-method implementations, the   MultiJava compiler produces a single Java dispatch method containing the bodies of the set of multi-method implementations. The multi-method   implements the runtime type inspection approach, using the instanceof Java operator (is in C#).</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">The Java   Multi-Method Framework (JMMF) uses reflection to provide multiple dispatch for   Java &#91;29&#93;. Multi-methods can be defined in any class and with any name. JMMF is   provided as a library; it proposes neither language extensions nor virtual   machine modifications.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">PolyD is aimed at   providing a flexible multiple dispatch technique for Java &#91;30&#93;. PolyD generates   Java bytecodes dynamically, and allows the user to define customized   dispatching policies. Three standard dispatching policies are available:   multiple dispatching (cached GetType runtime type inspection), overloading (static method overload) and a   ‘non-subsumptive' policy (only calls a method if the classes of the arguments   match exactly those of the method parameters; i.e. no parameter   generalization).</font></p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>6.  Conclusions</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Different alternatives are nowadays used to achieve   multiple dispatch in widespread languages that do not provide multi-methods. A   qualitative evaluate has shown the pros and cons of each approach. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A new alternative has   been described for hybrid typing languages. Their benefits are high readability   and maintainability, loose coupling with the number of concrete classes and the   dispatch dimensions, and parameter generalization. The main limitation is no   compile-time type error detection. Its runtime performance is analogous to the   runtime type inspection approaches. The average execution time of all the   measured hybrid programs took 3.9 times more execution time the <i>Visitor</i> design pattern, being 36.6 times   faster than reflection. The proposed approach has consumed 31% more memory   resources than the rest of alternatives.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Since the main limitation of the hybrid typing approach is   its lack of compile-time error detection, we are currently working on defining   and implementing a hybrid language that provides compile-time type checking   &#91;10&#93;. That language, called <i>StaDyn</i>,   is an extension of C# that performs type inference over dynamic references. This C#   extension may eventually detect some type errors of the hybrid typing approach   at compile-time &#91;31&#93;. Another future work will be analyzing the suitability of   implementing multi-methods in Java using the new invokedynamic opcode &#91;32&#93;.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">All the programs used in the evaluation of runtime   performance and memory consumption, and the detailed measurement data are   freely available at <a href="http://www.reflection.uniovi.es/stadyn/download/2013/dyna.zip" target="_blank">http://www.reflection.uniovi.es/stadyn/download/2013/dyna.zip</a></font></p>     <p>&nbsp;</p>     ]]></body>
<body><![CDATA[<p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>Acknowledgements</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">This work has been   partially funded by Microsoft Research and the Department of Science and   Innovation (Spain) under the National Program for Research, Development and   Innovation: project TIN2011-25978. </font></p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>References</b></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;1&#93;</b> Chambers,   G., Object-oriented multi-methods in Cecil. European Conference on   Object-Oriented Programming (ECOOP). The Netherlands, 1992, pp. 33-56.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000117&pid=S0012-7353201400040003200001&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;2&#93;</b> Erich,   G., Richard, H., Ralph, J. and John, V., Design patterns: Elements of reusable   object-oriented software. Addison Wesley, 1995.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000119&pid=S0012-7353201400040003200002&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --> </font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;3&#93;</b> Ortin,   F., Zapico, D. and Cueva, J.M., Design patterns for teaching type checking in a   compiler construction course, IEEE Transactions on Education 50, pp. 273-283,   2007.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000121&pid=S0012-7353201400040003200003&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --> </font></p>     ]]></body>
<body><![CDATA[<!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;4&#93;</b> Torgersen,   M., The expression problem revisited. European Conference on Object-Oriented   Programming (ECOOP). Oslo, Norway, 2004, pp. 123-146.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000123&pid=S0012-7353201400040003200004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;5&#93;</b> Ortin,   F., L&oacute;pez, B. and P&eacute;rez-Schofield, J.B.G., Separating adaptable persistence   attributes through computational reflection, IEEE Software 21, pp. 41-49, 2004.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000125&pid=S0012-7353201400040003200005&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --> </font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;6&#93;</b> Maes,   P., Computational Reflection. PhD Thesis, Laboratory for Artificial   Intelligence, Vrije Universiteit, Amsterdam, The Netherlands, 1987.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000127&pid=S0012-7353201400040003200006&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --> </font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;7&#93;</b> Redondo, J.M. and Ortin, F., Efficient   support of dynamic inheritance for class- and prototype-based languages,   Journal of Systems and Software 86, pp. 278-301, 2013.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000129&pid=S0012-7353201400040003200007&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --> </font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;8&#93;</b> Meijer, E. and Drayton, P., Static typing   where possible, dynamic typing when needed: The end of the cold war between   programming languages. OOPSLA 2004 Workshop on Revival of Dynamic Languages.   Vancouver, Canada, 2004, pp.1-6.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000131&pid=S0012-7353201400040003200008&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --> </font></p>     ]]></body>
<body><![CDATA[<!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;9&#93;</b> Bierman, G., Meijer, E. and Torgersen, M.,   Adding dynamic types to C#. European Conference on Object-Oriented Programming   (ECOOP). Maribor, Slovenia, 2010, pp. 76-100.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000133&pid=S0012-7353201400040003200009&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;10&#93;</b> Ortin,   F., Zapico, D., Perez-Schofield, J.B.G. and Garcia, M., Including both static   and dynamic typing in the same programming language, IET Software, 4, pp. 268-282,   2010.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000135&pid=S0012-7353201400040003200010&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;11&#93;</b> Ortin, F., Redondo, J.M. and Perez-Schofield,   J.B.G., Efficient virtual machine support of runtime structural reflection, Science   of computer Programming 74, pp. 836-860, 2009.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000137&pid=S0012-7353201400040003200011&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;12&#93;</b> Redondo,   J.M., Ortin, F. and Cueva, J.M., Optimizing reflective primitives of dynamic   languages, International Journal of Software Engineering and Knowledge   Engineering 18, pp. 759-783, 2008.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000139&pid=S0012-7353201400040003200012&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;13&#93;</b> Ortin,   F., Garcia, M., Redondo, J.M. and Quiroga, J., Achieving multiple dispatch in   hybrid statically and dynamically typed languages. World Conference on   Information Systems and Technologies (WorldCIST), Advances in Information   Systems and Technologies 206, pp. 703-713, 2013.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000141&pid=S0012-7353201400040003200013&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     ]]></body>
<body><![CDATA[<!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;14&#93;</b> Georges,   A., Buytaert, D. and Eeckhout, L., Statistically rigorous Java performance   evaluation. Object-Oriented Programming, Systems, Languages &amp; Applications   (OOPSLA). Montreal, 2007. Pp.57-76.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000143&pid=S0012-7353201400040003200014&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;15&#93;</b> Lilja, D.J., Measuring computer performance:   A practitioner's guide. Cambridge University Press, 2005.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000145&pid=S0012-7353201400040003200015&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;16&#93;</b> Chiles,   B. and Turner, A., Dynamic Language Runtime &#91;May 2014&#93; Available at: <a href="http://www.codeplex.com/Download?ProjectName=dlr&DownloadId=127512" target="_blank">http://www.codeplex.com/Download?ProjectName=dlr&amp;DownloadId=127512</a>.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000147&pid=S0012-7353201400040003200016&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;17&#93;</b> G&oacute;mez-Luna, E.,   Fernando-Navas, D., Aponte-Mayor, G. and Betancour-Buitrago, L.A., Literature   review methodology for scientific and information management, through its structuring   and systematization, DYNA 81 (184), pp 158-163, 2014.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000149&pid=S0012-7353201400040003200017&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;18&#93;</b> DeMichiel,   L.G. and Gabriel, R.P., The common lisp object system: An overview. European   Conference on Object-Oriented Programming (ECOOP). Paris, France, 1987,   pp.151-170.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000151&pid=S0012-7353201400040003200018&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     ]]></body>
<body><![CDATA[<!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;19&#93;</b> Hickey, R., The Clojure programming language. Symposium on Dynamic   Languages (DLS). Paphos, Cyprus, 2008, pp.1-10.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000153&pid=S0012-7353201400040003200019&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;20&#93;</b> ClojureCLR., A port of Clojure to the CLR, part of the Clojure   project &#91;May 2014&#93;. Available at: <a href="https://github.com/clojure/clojure-clr" target="_blank">https://github.com/clojure/clojure-clr</a></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000155&pid=S0012-7353201400040003200020&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;21&#93;</b> Eclipse Project, Xtend, Java 10 today! &#91;May   2014&#93; Available at: <a href="http://www.eclipse.org/xtend" target="_blank">http://www.eclipse.org/xtend</a>.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000156&pid=S0012-7353201400040003200021&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;22&#93;</b> Shalit, A., The Dylan reference   manual: The definitive guide to the new object-oriented dynamic language.   Addison Wesley Longman Publishing, 1996.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000158&pid=S0012-7353201400040003200022&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;23&#93;</b> Groovy   2.0 release notes. A &quot;static theme&quot; for a dynamic language. &#91;May 2014&#93;   Available at: <a href="http://groovy.codehaus.org/Groovy+2.0+release+notes" target="_blank">http://groovy.codehaus.org/Groovy+2.0+release+notes</a></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000160&pid=S0012-7353201400040003200023&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;24&#93;</b> Grothoff, C., Walkabout revisited: The   Runabout. European Conference on Object-Oriented Programming (ECOOP).   Darmstadt, Germany, 2003, pp. 103-125.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000161&pid=S0012-7353201400040003200024&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     ]]></body>
<body><![CDATA[<!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;25&#93;</b> Palsberg, J. and Jay, C.B., The   essence of the visitor pattern. Computer Software and Applications Conference   (COMPSAC). Vienna, Austria, 1998, pp. 9-15.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000163&pid=S0012-7353201400040003200025&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;26&#93;</b> Büttner, F., Radfelder, O., Lindow, A.   and Gogolla, M., Digging into the visitor pattern. International Conference on   Software Engineering &amp; Knowledge Engineering (SEKE). Banff, Alberta,   Canada, 2004, pp. 135-141.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000165&pid=S0012-7353201400040003200026&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;27&#93;</b> Forax, R., Duris, E. and Roussel, G.,   Reflection-based implementation of Java extensions: The double-dispatch   use-case. Symposium on Applied Computing (SAC). Santa Fe, New Mexico, 2005, pp.   1409-1413.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000167&pid=S0012-7353201400040003200027&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;28&#93;</b> Clifton, C., Leavens, G.T., Chambers, G. and Millstein, T.,   MultiJava: Modular open classes and symmetric multiple dispatch for Java.   Object-Oriented Programming Systems, Languages, and Applications (OOPSLA).   Minneapolis, Minnesota, 2000, pp. 130-145.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000169&pid=S0012-7353201400040003200028&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;29&#93;</b> Forax, R., Duris, E. and Roussel, G., A reflective implementation   of Java multi-methods, IEEE Transactions on Software Engineering 30, pp. 1055-1071,   2004.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000171&pid=S0012-7353201400040003200029&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     ]]></body>
<body><![CDATA[<!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;30&#93;</b> Cunei, A. and   Vitek, J., An efficient and flexible toolkit for composing customized method   dispatchers, Software: Practice and Experience 38, pp. 33-73, 2008.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000173&pid=S0012-7353201400040003200030&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;31&#93;</b> Ortin,   F., Type inference to optimize a hybrid statically and dynamically typed   language, Computer Journal 54, pp. 1901-1924, 2011.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000175&pid=S0012-7353201400040003200031&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>&#91;32&#93;</b> Ortin, F.,   Conde, P., Fernandez-Lanvin, D. and Izquierdo, R., A runtime performance of   invokedynamic: Evaluation with a Java library, IEEE Software 31, pp. 1-16, 2014.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000177&pid=S0012-7353201400040003200032&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --></font></p>     <p>&nbsp;</p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Francisco Ortin</b>,   Born in 1973, he is an Associate Professor of the Computer Science Department   at the University of Oviedo, Spain. He is the head of the Computational   Reflection research group (www.reflection.uniovi.es).   He received his BSc in Computer Science in 1994, and his MSc in Computer   Engineering in 1996. In 2002, he was awarded his PhD entitled A Flexible   Programming Computational System developed over a Non-Restrictive Reflective   Abstract Machine. He has been the principal investigator of different research   projects funded by Microsoft Research and the Spanish Department of Science and   Innovation. His main research interests include dynamic languages, type   systems, aspect-oriented programming, computational reflection, and runtime   adaptable applications.</font> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">ORCID: 0000-0003-1199-8649</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Jose Quiroga</b>, Born in 1982, he is a   Research Assistant of the Computer Science Department at the University of   Oviedo. He was awarded his BSc degree in Computer Science in 2004 and, in 2009,   an MSc in Computer Engineering. He worked in the Research and Development   department of the CTIC Foundation until 2012, when he became a Research   Assistant financed by the Spanish Department of Competitiveness and   Productivity. As a PhD student, he is doing research on the optimization of   dynamically typed programming languages, performing compile-time inference of   type information.</font> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">ORCID: 0000-0002-1646-4796</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Jose M. Redondo</b>, Born in 1978, he is an Assistant Professor of   the Computer Science Department at the University of Oviedo, Spain. He received   his BSc in Computer Science in 2000, and his MSc in Computer Engineering in   2002. In 2007, he was awarded his PhD entitled <i>Improving the performance of structural reflection using JIT   compilation techniques</i>. He has participated in different research projects   funded by Microsoft Research and the Spanish Department of Science and   Innovation. His main research interests include virtual machines, JIT   compilation, computational reflection, and runtime adaptable applications.</font> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">ORCID: 0000-0002-0939-0186</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Miguel Garcia</b>, Born in 1979, he is a   Postdoctoral Research Assistant of the Computer Science Department at the   University of Oviedo. He received his BSc degree in Computer Science in 2005.   In 2008, he was awarded an MSc in Web Engineering, and an MSc in Software   Engineering Research in 2010. In 2013, he presented his PhD dissertation   entitled <i>Improving the Runtime   Performance and Robustness of Hybrid Static and Dynamic Typing Languages</i>.   His research interests include compiler construction, programming languages   design, and aspect-oriented software development.</font> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">ORCID: 0000-0002-3150-2826</font></p>      ]]></body><back>
<ref-list>
<ref id="B1">
<label>1</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Chambers]]></surname>
<given-names><![CDATA[G.]]></given-names>
</name>
</person-group>
<source><![CDATA[Object-oriented multi-methods in Cecil]]></source>
<year></year>
<conf-name><![CDATA[ European Conference on Object-Oriented Programming]]></conf-name>
<conf-date>1992</conf-date>
<conf-loc> </conf-loc>
</nlm-citation>
</ref>
<ref id="B2">
<label>2</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Erich]]></surname>
<given-names><![CDATA[G.]]></given-names>
</name>
<name>
<surname><![CDATA[Richard]]></surname>
<given-names><![CDATA[H.]]></given-names>
</name>
<name>
<surname><![CDATA[Ralph]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
<name>
<surname><![CDATA[John]]></surname>
<given-names><![CDATA[V.]]></given-names>
</name>
</person-group>
<source><![CDATA[Design patterns: Elements of reusable object-oriented software]]></source>
<year>1995</year>
<publisher-name><![CDATA[Addison Wesley]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B3">
<label>3</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ortin]]></surname>
<given-names><![CDATA[F.]]></given-names>
</name>
<name>
<surname><![CDATA[Zapico]]></surname>
<given-names><![CDATA[D.]]></given-names>
</name>
<name>
<surname><![CDATA[Cueva]]></surname>
<given-names><![CDATA[J.M.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Design patterns for teaching type checking in a compiler construction course]]></article-title>
<source><![CDATA[IEEE Transactions on Education]]></source>
<year>2007</year>
<numero>50</numero>
<issue>50</issue>
<page-range>273-283</page-range></nlm-citation>
</ref>
<ref id="B4">
<label>4</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Torgersen]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
</person-group>
<source><![CDATA[The expression problem revisited]]></source>
<year></year>
<conf-name><![CDATA[ European Conference on Object-Oriented Programming]]></conf-name>
<conf-date>2004</conf-date>
<conf-loc>Oslo </conf-loc>
<page-range>123-146</page-range></nlm-citation>
</ref>
<ref id="B5">
<label>5</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ortin]]></surname>
<given-names><![CDATA[F.]]></given-names>
</name>
<name>
<surname><![CDATA[López]]></surname>
<given-names><![CDATA[B.]]></given-names>
</name>
<name>
<surname><![CDATA[Pérez-Schofield]]></surname>
<given-names><![CDATA[J.B.G.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Separating adaptable persistence attributes through computational reflection]]></article-title>
<source><![CDATA[IEEE Software]]></source>
<year>2004</year>
<volume>21</volume>
<page-range>41-49</page-range></nlm-citation>
</ref>
<ref id="B6">
<label>6</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Maes]]></surname>
<given-names><![CDATA[P.]]></given-names>
</name>
</person-group>
<source><![CDATA[Computational Reflection]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B7">
<label>7</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Redondo]]></surname>
<given-names><![CDATA[J.M.]]></given-names>
</name>
<name>
<surname><![CDATA[Ortin]]></surname>
<given-names><![CDATA[F.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Efficient support of dynamic inheritance for class- and prototype-based languages]]></article-title>
<source><![CDATA[Journal of Systems and Software]]></source>
<year>2013</year>
<volume>86</volume>
<page-range>278-301</page-range></nlm-citation>
</ref>
<ref id="B8">
<label>8</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Meijer]]></surname>
<given-names><![CDATA[E.]]></given-names>
</name>
<name>
<surname><![CDATA[Drayton]]></surname>
<given-names><![CDATA[P.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Static typing where possible, dynamic typing when needed: The end of the cold war between programming languages]]></article-title>
<source><![CDATA[]]></source>
<year></year>
<conf-name><![CDATA[ OOPSLA 2004 Workshop on Revival of Dynamic Languages]]></conf-name>
<conf-date>2004</conf-date>
<conf-loc>Vancouver </conf-loc>
<page-range>1-6</page-range></nlm-citation>
</ref>
<ref id="B9">
<label>9</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Bierman]]></surname>
<given-names><![CDATA[G.]]></given-names>
</name>
<name>
<surname><![CDATA[Meijer]]></surname>
<given-names><![CDATA[E.]]></given-names>
</name>
<name>
<surname><![CDATA[Torgersen]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Adding dynamic types to C#.]]></article-title>
<source><![CDATA[]]></source>
<year></year>
<conf-name><![CDATA[ European Conference on Object-Oriented Programming (ECOOP)]]></conf-name>
<conf-date>2010</conf-date>
<conf-loc>Maribor </conf-loc>
<page-range>76-100</page-range></nlm-citation>
</ref>
<ref id="B10">
<label>10</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ortin]]></surname>
<given-names><![CDATA[F.]]></given-names>
</name>
<name>
<surname><![CDATA[Zapico]]></surname>
<given-names><![CDATA[D.]]></given-names>
</name>
<name>
<surname><![CDATA[Perez-Schofield]]></surname>
<given-names><![CDATA[J.B.G.]]></given-names>
</name>
<name>
<surname><![CDATA[Garcia]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Including both static and dynamic typing in the same programming language]]></article-title>
<source><![CDATA[IET Software]]></source>
<year>2010</year>
<numero>4</numero>
<issue>4</issue>
<page-range>268-282</page-range></nlm-citation>
</ref>
<ref id="B11">
<label>11</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ortin]]></surname>
<given-names><![CDATA[F.]]></given-names>
</name>
<name>
<surname><![CDATA[Redondo]]></surname>
<given-names><![CDATA[J.M.]]></given-names>
</name>
<name>
<surname><![CDATA[Perez-Schofield]]></surname>
<given-names><![CDATA[J.B.G.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Efficient virtual machine support of runtime structural reflection]]></article-title>
<source><![CDATA[Science of computer Programming]]></source>
<year>2009</year>
<numero>74</numero>
<issue>74</issue>
<page-range>836-860</page-range></nlm-citation>
</ref>
<ref id="B12">
<label>12</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Redondo]]></surname>
<given-names><![CDATA[J.M.]]></given-names>
</name>
<name>
<surname><![CDATA[Ortin]]></surname>
<given-names><![CDATA[F.]]></given-names>
</name>
<name>
<surname><![CDATA[Cueva]]></surname>
<given-names><![CDATA[J.M.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Optimizing reflective primitives of dynamic languages]]></article-title>
<source><![CDATA[International Journal of Software Engineering and Knowledge Engineering]]></source>
<year>2008</year>
<numero>18</numero>
<issue>18</issue>
<page-range>759-783</page-range></nlm-citation>
</ref>
<ref id="B13">
<label>13</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ortin]]></surname>
<given-names><![CDATA[F.]]></given-names>
</name>
<name>
<surname><![CDATA[Garcia]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
<name>
<surname><![CDATA[Redondo]]></surname>
<given-names><![CDATA[J.M.]]></given-names>
</name>
<name>
<surname><![CDATA[Quiroga]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Achieving multiple dispatch in hybrid statically and dynamically typed languages]]></article-title>
<source><![CDATA[Advances in Information Systems and Technologies]]></source>
<year>2013</year>
<numero>206</numero>
<issue>206</issue>
<page-range>703-713</page-range></nlm-citation>
</ref>
<ref id="B14">
<label>14</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Georges]]></surname>
<given-names><![CDATA[A.]]></given-names>
</name>
<name>
<surname><![CDATA[Buytaert]]></surname>
<given-names><![CDATA[D.]]></given-names>
</name>
<name>
<surname><![CDATA[Eeckhout]]></surname>
<given-names><![CDATA[L.]]></given-names>
</name>
</person-group>
<source><![CDATA[Statistically rigorous Java performance evaluation]]></source>
<year></year>
<conf-name><![CDATA[ Object-Oriented Programming, Systems, Languages & Applications]]></conf-name>
<conf-date>2007</conf-date>
<conf-loc>Montreal </conf-loc>
<page-range>57-76</page-range></nlm-citation>
</ref>
<ref id="B15">
<label>15</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Lilja]]></surname>
<given-names><![CDATA[D.J.]]></given-names>
</name>
</person-group>
<source><![CDATA[Measuring computer performance: A practitioner's guide]]></source>
<year>2005</year>
<publisher-name><![CDATA[Cambridge University Press]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B16">
<label>16</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Chiles]]></surname>
<given-names><![CDATA[B.]]></given-names>
</name>
<name>
<surname><![CDATA[Turner]]></surname>
<given-names><![CDATA[A.]]></given-names>
</name>
</person-group>
<source><![CDATA[Dynamic Language Runtime]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B17">
<label>17</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Gómez-Luna]]></surname>
<given-names><![CDATA[E.]]></given-names>
</name>
<name>
<surname><![CDATA[Fernando-Navas]]></surname>
<given-names><![CDATA[D.]]></given-names>
</name>
<name>
<surname><![CDATA[Aponte-Mayor]]></surname>
<given-names><![CDATA[G.]]></given-names>
</name>
<name>
<surname><![CDATA[Betancour-Buitrago]]></surname>
<given-names><![CDATA[L.A.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Literature review methodology for scientific and information management, through its structuring and systematization]]></article-title>
<source><![CDATA[DYNA]]></source>
<year>2014</year>
<volume>81</volume>
<numero>184</numero>
<issue>184</issue>
<page-range>158-163</page-range></nlm-citation>
</ref>
<ref id="B18">
<label>18</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[DeMichiel]]></surname>
<given-names><![CDATA[L.G.]]></given-names>
</name>
<name>
<surname><![CDATA[Gabriel]]></surname>
<given-names><![CDATA[R.P.]]></given-names>
</name>
</person-group>
<source><![CDATA[The common lisp object system: An overview]]></source>
<year></year>
<conf-name><![CDATA[ European Conference on Object-Oriented Programming]]></conf-name>
<conf-date>1987</conf-date>
<conf-loc>Paris </conf-loc>
<page-range>151-170</page-range></nlm-citation>
</ref>
<ref id="B19">
<label>19</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Hickey]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<source><![CDATA[The Clojure programming language]]></source>
<year>2008</year>
<conf-name><![CDATA[ Symposium on Dynamic Languages]]></conf-name>
<conf-loc>Paphos </conf-loc>
<page-range>1-10</page-range></nlm-citation>
</ref>
<ref id="B20">
<label>20</label><nlm-citation citation-type="">
<collab>ClojureCLR</collab>
<source><![CDATA[A port of Clojure to the CLR, part of the Clojure project]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B21">
<label>21</label><nlm-citation citation-type="">
<collab>Eclipse Project</collab>
<source><![CDATA[Xtend: Java 10 today!]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B22">
<label>22</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Shalit]]></surname>
<given-names><![CDATA[A.]]></given-names>
</name>
</person-group>
<source><![CDATA[The Dylan reference manual: The definitive guide to the new object-oriented dynamic language]]></source>
<year>1996</year>
<publisher-name><![CDATA[Addison Wesley Longman Publishing]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B23">
<label>23</label><nlm-citation citation-type="">
<source><![CDATA[Groovy 2.0 release notes: A "static theme" for a dynamic language]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B24">
<label>24</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Grothoff]]></surname>
<given-names><![CDATA[C.]]></given-names>
</name>
</person-group>
<source><![CDATA[Walkabout revisited: The Runabout]]></source>
<year>2003</year>
<conf-name><![CDATA[ European Conference on Object-Oriented Programming]]></conf-name>
<conf-loc>Darmstadt </conf-loc>
<page-range>103-125</page-range></nlm-citation>
</ref>
<ref id="B25">
<label>25</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Palsberg]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
<name>
<surname><![CDATA[Jay]]></surname>
<given-names><![CDATA[C.B.]]></given-names>
</name>
</person-group>
<source><![CDATA[The essence of the visitor pattern]]></source>
<year></year>
<conf-name><![CDATA[ Computer Software and Applications Conference]]></conf-name>
<conf-date>1998</conf-date>
<conf-loc>Vienna </conf-loc>
<page-range>9-15</page-range></nlm-citation>
</ref>
<ref id="B26">
<label>26</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Büttner]]></surname>
<given-names><![CDATA[F.]]></given-names>
</name>
<name>
<surname><![CDATA[Radfelder]]></surname>
<given-names><![CDATA[O.]]></given-names>
</name>
<name>
<surname><![CDATA[Lindow]]></surname>
<given-names><![CDATA[A.]]></given-names>
</name>
<name>
<surname><![CDATA[Gogolla]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
</person-group>
<source><![CDATA[Digging into the visitor pattern]]></source>
<year></year>
<conf-name><![CDATA[ International Conference on Software Engineering & Knowledge Engineering]]></conf-name>
<conf-date>2004</conf-date>
<conf-loc>Banff Alberta</conf-loc>
</nlm-citation>
</ref>
<ref id="B27">
<label>27</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Forax]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
<name>
<surname><![CDATA[Duris]]></surname>
<given-names><![CDATA[E.]]></given-names>
</name>
<name>
<surname><![CDATA[Roussel]]></surname>
<given-names><![CDATA[G.]]></given-names>
</name>
</person-group>
<source><![CDATA[Reflection-based implementation of Java extensions: The double-dispatch use-case]]></source>
<year></year>
<conf-name><![CDATA[ Symposium on Applied Computing]]></conf-name>
<conf-date>2005</conf-date>
<conf-loc>Santa Fe New Mexico</conf-loc>
<page-range>1409-1413</page-range></nlm-citation>
</ref>
<ref id="B28">
<label>28</label><nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Clifton]]></surname>
<given-names><![CDATA[C.]]></given-names>
</name>
<name>
<surname><![CDATA[Leavens]]></surname>
<given-names><![CDATA[G.T.]]></given-names>
</name>
<name>
<surname><![CDATA[Chambers]]></surname>
<given-names><![CDATA[G.]]></given-names>
</name>
<name>
<surname><![CDATA[Millstein]]></surname>
<given-names><![CDATA[T.]]></given-names>
</name>
</person-group>
<source><![CDATA[Modular open classes and symmetric multiple dispatch for Java]]></source>
<year></year>
<conf-name><![CDATA[ Object-Oriented Programming Systems, Languages, and Applications]]></conf-name>
<conf-date>2000</conf-date>
<conf-loc>Minneapolis Minnesota</conf-loc>
<page-range>130-145</page-range></nlm-citation>
</ref>
<ref id="B29">
<label>29</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Forax]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
<name>
<surname><![CDATA[Duris]]></surname>
<given-names><![CDATA[E.]]></given-names>
</name>
<name>
<surname><![CDATA[Roussel]]></surname>
<given-names><![CDATA[G.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[A reflective implementation of Java multi-methods]]></article-title>
<source><![CDATA[IEEE Transactions on Software Engineering]]></source>
<year>2004</year>
<numero>30</numero>
<issue>30</issue>
<page-range>1055-1071</page-range></nlm-citation>
</ref>
<ref id="B30">
<label>30</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Cunei]]></surname>
<given-names><![CDATA[A.]]></given-names>
</name>
<name>
<surname><![CDATA[Vitek]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[An efficient and flexible toolkit for composing customized method dispatchers]]></article-title>
<source><![CDATA[Software: Practice and Experience]]></source>
<year>2008</year>
<numero>38</numero>
<issue>38</issue>
<page-range>33-73</page-range></nlm-citation>
</ref>
<ref id="B31">
<label>31</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ortin]]></surname>
<given-names><![CDATA[F.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Type inference to optimize a hybrid statically and dynamically typed language]]></article-title>
<source><![CDATA[Computer Journal]]></source>
<year>2011</year>
<numero>54</numero>
<issue>54</issue>
<page-range>1901-1924</page-range></nlm-citation>
</ref>
<ref id="B32">
<label>32</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ortin]]></surname>
<given-names><![CDATA[F.]]></given-names>
</name>
<name>
<surname><![CDATA[Conde]]></surname>
<given-names><![CDATA[P.]]></given-names>
</name>
<name>
<surname><![CDATA[Fernandez-Lanvin]]></surname>
<given-names><![CDATA[D.]]></given-names>
</name>
<name>
<surname><![CDATA[Izquierdo]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[A runtime performance of invokedynamic: Evaluation with a Java library]]></article-title>
<source><![CDATA[IEEE Software]]></source>
<year>2014</year>
<numero>31</numero>
<issue>31</issue>
<page-range>1-16</page-range></nlm-citation>
</ref>
</ref-list>
</back>
</article>
