<!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>n + 1 Challenges for Software Language Engineering?</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Fernuniversitt in Hagen</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Germany steimann@acm.org</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Forget about Trees</institution>
          ,
          <addr-line>or: Embrace Relations</addr-line>
        </aff>
      </contrib-group>
      <fpage>52</fpage>
      <lpage>61</lpage>
      <abstract>
        <p>This is a free transcription of the author's keynote held at the Workshop on Original and Open Problems of Software Language Engineering. ? Copyright c 2020 for this paper by its author. Use permitted under Creative Commons License Attribution 4.0 International (CC BY 4.0).</p>
      </abstract>
      <kwd-group>
        <kwd>trees vs</kwd>
        <kwd>graphs executable metalanguages editing empirical evidence vs</kwd>
        <kwd>game theory</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Prologue</title>
      <p>Software Language Engineering (SLE) is the study of techniques and tools for
SLE. It follows from the recursiveness in this denition of SLE that for any
challenge of SLE identied, there will be a next challenge, namely to devise a
technique or tool for addressing it.</p>
      <p>That would be an SLEish explanation of the title of my keynote. However,
the true reason for the ominous n + 1 is that at the time of its announcement,
I was not sure how many challenges I wanted to present; I only knew that I
wanted to present one concluding, down-to-earth challenge that everyone could
relate to.</p>
      <p>The list of challenges I ended up with has length 5 + 1, and is a personal
one. I am sure that others see other challenges, and also that some may not
even regard my challenges as such. However, if the presented challenges cause
frowning, I am happy, since frowning usually marks the beginning of progress.</p>
      <p>Without further ado, here are my challenges, nicely enumerated and
terminated by one banal bonus challenge.
Text-based language is inherently linear. This holds for spoken as well as for
written language. Graphs are not generally linear, but can be linearized; in fact,
they must be linearized when speaking or writing about them (using language,
that is). The linearization of non-linear content requires encodings that may add
complexity to interpretation, which is needed to reconstruct the information lost
by linearization.</p>
      <p>Not all types of graphs suer equally from linearization. For instance, trees
like</p>
      <p>a
b
c
are conveniently encoded as terms, which blend seamlessly with linear text, as
in</p>
      <p>terms like a(b; c) blend seamlessly with text.</p>
      <p>While the same holds for set-notation based lineaer representations of graphs
like
f(a; b); (a; c)g
f(a; b); (a; a)g
their interpretation requires the build-up of a (mental) environment, or lookup
table, here to note that a occurs twice, meaning that the graph has two edges
starting from the same node. The term representation, which does not need
lookup for its interpretation, is therefore at advantage here.</p>
      <p>Term representation is however challenged by graphs that are not trees. For
instance,
which is but a slight variation of (1), cannot be directly encoded as a term:
whereas (2) delinearizes as
(1)
(2)
its naive rendering as a term a(b; a), if at all considered legal, delinearizes as
in which the two occurrences of a represent dierent nodes, meaning that a(b; a)
represents a dierent graph than (2). To encode the same graph as a term, an
explicit lookup must be introduced, as in a(b; a ): while syntactically, this still
represents a tree
the quoting can be used to construct the graph
a</p>
      <p>b
b</p>
      <p>a
a
a
a
b
b
a
from it. However, now the term representation has lost its above-noted
advantage, namely its independence from lookup.</p>
      <p>
        Even if it requires lookup, using terms for the representation of graphs still
has the advantage of overlaying the graphs with trees, which requires special
markup for set-based representations of graphs like (1) and (2) (see the nal
challenge for an example). This overlaid tree not only xes linearization (for the
set-based linearization, the order of edges is arbitrary), it also denes a
containment relation that can be used, for instance, for restricting lookup. However,
most realistic languages have more than one such relation, so that markup will
be needed anyway, and lookup cannot generally rely on containment alone (see,
e.g., [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] for some standard complications). So, why should we use terms to
represent graphs?
      </p>
      <p>When looking at our metalanguages, and also at the metatheories that come
with them, we nd that terms are the predominant data structure: terms
encode the syntactic structure of the subjects of the metalanguages, and also drive
inductive denitions and proofs. And yet, the general insuciency of terms
becomes all too evident in the omnipresence of environments, or lookup tables
(often encoded in Greek, with the usual connotation that it is getting
complicated), which are required to account for the inherent non-treeness of the subject
matter.</p>
      <p>
        So, are trees a necessary tribute to the use of metalanguages and their
theories? Rather not. As has been pointed out by Martin Erwig [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], the same
inductive principles that work for trees also work for graphs. And yet, the use of
trees predominates. This gives us
      </p>
      <p>The Graph Paradox: In dealing with graphs, we resort to trees.
It is a paradox because we express the general in terms of the special, which
should be impossible. That it is possible nevertheless is because actually, we
resort to trees plus environments, and to lookup for extracting edges on the y.</p>
      <p>
        Leaving this academic kink aside, the preference of trees over graphs appears
to come with a preference of functional metalanguages over relational ones.
However, just like trees are more constrained than graphs, functional languages are
more constrained than relational languages. While being more constrained can
amount to being more powerful, more power usually comes with less
expressiveness, and indeed, functions are uni-directional, and dealing with partiality
(partial undenedness) and mapping to more than one value require clumsy
workarounds. It is somewhat revealing how the functional community takes pride
in their Maybe and List monads, which eectively make functional languages
more relational, yet only at the price of adding indirection through a container,
which adds considerable complexity [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ].
      </p>
      <p>Language shapes thought. Maybe the linearity of languages leads to a
preference of trees; and with it to a preference of functions, over graphs and relations.
Maybe we would fare better if we used graphs and relations directly, rather than
encode them as trees and functions. We will not know until we try.</p>
      <p>
        Tend To Your Metalanguage, or: Use One that Works
In his acclaimed keynote It’s Time for a New Old Language [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], Guy Steele
identied 28 dierent notations for substitution in POPL papers published
between 1973 and 2016. While this diversity would not be such a problem if every
paper properly introduced its used notation, there is usually no space for such
introductions. That the papers are accepted nevertheless suggests that there is
sucient redundancy in each paper to let the reader infer with certainty what
gets substituted by what, which in turn suggests that the presentation could
have been terser still by removing that redundancy had the community
agreed on a standardized notation.
      </p>
      <p>
        Terseness combined with implicit standardization, or conventions, can be
a hindrance to the accessibility of papers. For instance, and as also noted by
Steele [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], to represent unenclosed sequences, the notations e , e1 : : : en, and e
are in common use, with origins that are not easy to trace and with meaning that
is not self-evident. For instance, the star in e , where e is an expression, is not the
Kleene star (even though it is sometimes so called); the Kleene star constructs
the set of all concatenations of elements from a base set, but neither e nor e
stand for sets they stand for elements of such sets. The overbar (or overscore,
or overline) notation of e is reminiscent of the mathematical notation of vectors
(!e ), and indeed, the ei that e represents are assumed to be ordered, yet, e is
not one object like !e would be, but instead stands for many objects of the same
kind, with no additional meaning imposed (there is no whole such as a vector).
Also, as syntax specications, both the e and the e notation have problems
with inserting separator tokens, which leads to some ad hoc conventions such as
writing
      </p>
      <p>
        C(C f ) fsuper(f ); this:f = f ; g
(from the specication of Featherweight Java [
        <xref ref-type="bibr" rid="ref4">4, 19</xref>
        ]), which is only loosely
related to the concrete syntax (expressed in a variant of EBNF with terminals
underlined)
      </p>
      <p>C( [ C f f ; C f g ] ) fsuper( [ f f;f g ] ); fthis:f = f ;gg
which in turn must be expanded to
or even, in the most general case, to</p>
      <p>C(C1 f1; : : : ; Cn fn) fsuper(f1; : : : ; fn); this:f1 = f1; : : : this:fn = fn; g
C(C1 f1; : : : ; Cn fn) fsuper(f10 ; : : : ; f n00 ); this:f100 = f1000; : : : this:f n0000 = f n00000 ; g
when it comes to specifying semantics. As if this were not occult enough, dierent
papers use dierent notations, so that accessing any one of these papers is only
possible if one already knows which content to expect. Wouldn’t it be great to
have a single metalanguage whose mastering is sucient to access the contents
of all papers?</p>
      <p>Of course, the community has such a metalanguage: Latex. Unfortunately,
Latex is a highly underconstrained language that is not at all related to, let
alone domain-specic for, solving the problems of SLE. 1 What would be needed
instead is a unied language for SLE, or a</p>
      <sec id="sec-1-1">
        <title>Unied SLE Standard</title>
        <p>(USLES).</p>
        <p>And yet, experience with another unied language standard tells us that
usefulness may be compromised, rather than increased, by unication. Why, then, not
use an existing, versatile, proven language as metalanguage? A language that
works not only on paper, but that can actually do something? Like ML, Prolog,
or Coq?</p>
        <p>In fact, although not generally a requirement, it would be good to have
executable metalanguages, since only executable languages can actually do some
work for us. This of course would make all our specications programs, which is
great, since programs we know how to test and debug. And, after all, isn’t the
passion for programming much wider spread than the passion for specication?
3</p>
      </sec>
    </sec>
    <sec id="sec-2">
      <title>The Metalevel is Not the</title>
      <p>Operationalize Editing</p>
    </sec>
    <sec id="sec-3">
      <title>World of Static, or:</title>
      <p>Like object languages, metalanguages are usually constrained by static
semantics. The metalanguages in which static semantics are expressed additionally
need dynamic, or operational, semantics, for otherwise, the constraints expressed
cannot be evaluated. However, these constraint languages are usually not
programming languages in the sense that they are unable to construct new objects,
or lack a notion of state. Programming languages, on the other hand, can be,
and routinely are, used to express both static and dynamic semantics of
metalanguages, even though most programming languages are not particularly suited
for this purpose. That’s why SLE is so rich in DSLs.</p>
      <p>
        For many programming languages, statically type-safe ones in particular,
static and dynamic semantics work hand in hand so as to guarantee certain
runtime properties of programs. These properties usually include notions of
wellformedness of run-time structures (preservation [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]); for instance, in a type-safe
language, all variables are guaranteed to hold only values conforming to their
declared type. This means that all operations creating new objects, or causing
state changes, are guaranteed to respect the language’s rules of well-typedness,
so that no runtime-cheking is required. Other constraints on the static structure
(such as those for ensuring object ownership or non-nullness) make other runtime
guarantees.
1 Note that it is not helpful to think of Latex as a meta-metalanguage for SLE, since
in SLE, every metalanguage is a language on equal footing, so all problems apply
recursively. Specically, if Latex is not suited for specifying languages, it is not
useful for specifying metalanguages. That said, it would however help to have widely
shared Latex packages that standardize notation, for instance by providing
universally accepted macros for substitutions and unenclosed sequences.
      </p>
      <p>Why not apply this situation to the level of metalanguages? After all, when
we run an editor as a program, its operations are the edit operations, and its state
is the current shape of the object (program, model) being edited. And yet, even
though a semantic editor embodies the static semantics of the object language
(i.e., the language of the object being edited), its edit operations usually make
only weak guarantees with regard to preserving well-formedness of the object
(the runtime structure manipulated by the editor as a program), and leave most
of the constraints of the static semantics of the object language to runtime
checking. This is so because many well-formedness constraints of the object
languages are non-local, and because single primitive edit operations, even in a
semantic editor (in which an AST is manipulated directly and hence in a
typesafe manner), are generally insucient to preserve global well-formedness. Yet,
this is not a lost case.</p>
      <p>
        For instance, sound refactoring tools compute sequences of primitive edit
operations required to make the intended change and to keep the program
wellformed [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. By dropping the condition of behavior preservation, the techniques
of refactoring can be generalized to well-formedness preserving editing [
        <xref ref-type="bibr" rid="ref6 ref9">6, 9</xref>
        ].
Soundness proofs of such complex edit operations are possible [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], but are
generally dicult for imperative implementations of editors. Also, in practice,
complementing intended primitive edits with computed well-formedness preserving
ones requires user interaction, thus calling for a notion of edit transactions .
      </p>
      <p>
        Edit transactions will also be needed in the context of collaboration, or
parallel editing of the same object [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. Editors thus becomes database programs:
a set of primitive update operations is performed in isolation and can only be
committed if the so-edited object is well-formed. As above, the task is
complicated by the fact that well-formedness is not a local property in the general case,
meaning that the locks required for guaranteeing isolation of edit transactions
may severely impede parallelism; yet, database technology is rich in methods
of dealing with these problems, and it is not at all clear that these methods
do not work better for us than our current, optimistic version control systems,
especially when considering the commit procrastination caused by the fear of
manual merging (edit conict resolution).
      </p>
      <p>Speaking of version control: what do programming languages have to do with
les? Nothing! 2 Files are the subjects of programming tools, that’s all. There is
no theoretical obstacle to storing source programs in databases, and to use more
sophisticated representations than plain text for this on the contrary, there’s
a lot to be gained from doing so. SLE will know that it has delivered when
programmers no longer ask for copy &amp;paste of arbitrary (i.e., not structurally
bounded) ranges of text.
2 Of course, some languages are dened as depending of les, like C for instance. Java
on the other hand replaces les with the notion of compilation units, which are
storage technology neutral. Yet, compilation units are chunks of text, which can be
edited just like (text) les.</p>
    </sec>
    <sec id="sec-4">
      <title>Diversify, or: Gain Relevance</title>
      <p>A compiler that compiles itself, a metalanguage that denes itself SLE is the
metacircular discipline of metacircularity. While others 3 consider eating their
own dog food an academic exercise, the SLE community lives on it.</p>
      <p>While such a practice may be considered educational, and certainly is both
witty and economic (what an undefeatable combination!), I conjecture that it
generates generations of scholars for whom SLE tools are the only programs
they have ever seen the inners of. As a corollary to this conjecture, I assume
that the same scholars prefer to model everything as an immutable tree. Life
can be wonderful if spent inside an ivory tower.</p>
      <p>The real world is very dierent, however. In the society that covers my salary,
an estimated 80% of all software created is embedded, and security, real-time,
and resource eciency are as important as safety guarantees. For the remaining
20% of software created, distribution, persistence, and integrity are just as vital.</p>
      <p>Almost none of this is the subject of SLE. Yet, SLE is dearly needed in
these contexts, as the demands from software, and with it the software, grow
rapidly beyond what can be managed without SLE techniques and tools. But
would companies whose revenues come from other products than geeks’ tools
hire software language engineers? If they did, what would they get? From inside
an ivory tower, it is easy to judge what is going on out in the wild, yet almost
impossible to change it for the better. Only if software language engineers know
enough about security, real-time, and resource eciency, as well as distribution,
persistence, and integrity, they will have a real impact. And real impact can be
more rewarding than agreeing inside an ivory tower on how the outside world
should be.
5</p>
      <p>Escape the Empiricism Trap, or: Formalize Utility
Relevance requires utility. After too many papers making too grandiose claims
supported by too little, the scientic community agreed that if formal proofs
cannot be delivered, empirical evidence will be needed instead. Hard empirical
evidence is however hard to obtain in a eld in which experiments have strong
cognitive aspects and confounding factors are hard to control. Specically, the
performance of humans making use of the latest SLE product depends on
experience and education, and memory makes every experiment a confounding factor
for the next. It is therefore questionable whether SLE experiments with humans
provide more reliable answers than clear judgment common sense reasoning.</p>
      <p>
        So, what can we do to escape the empiricism trap? In economics, very
prestigious prizes have been repeatedly awarded to the development of mathematical
models of human behavior in decision making problems, aka game theory.
Programming is a decision making problem; more specically, and when taking tool
support into account, it is a game played by the programmer and the IDE, in
3 It seems that as a tool, metacircularity works only for informatics; in other
disciplines, it is either impossible to construct, or considered bogus.
which each take turns: the programmer strikes a key, the IDE responds with
immediate feedback such as proposing completions or marking or unmarking errors.
In fact, programming with an IDE is a cooperative game, one in which the
programmer has the idea of what the program should do, while the IDE knows how
the program may evolve. The programmer works towards the program becoming
useful, and the IDE works towards best use of existing code and error-freeness.
Any new aid in this process that is put forward in a scientic context should
show how it improves this game, by some self-selected metric. Metrics can be:
number of decisions to be made by the programmer until a program is correct;
number of choices oered by the IDE at each decision point; information
content of the made proposals, etc. If analytical captures of the complexity (big
O) of the decision problems are too hard to derive (which, given the complexity
of the nature of programming, would not be surprising), simulation and Monte
Carlo techniques may still provide acceptable evidence. Some rst work in this
direction (albeit restricted to software processes, not tool interaction) has only
just appeared [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]; looking into other disciplines for more inspiration might prove
worthwhile.
5 + 1
      </p>
    </sec>
    <sec id="sec-5">
      <title>How to Type that Damn Parent Attribute?</title>
      <p>Abstract syntax trees are typed and attributed graphs in which each node is
an instance of a type (or class) representing a syntactic category, and in which
attributes hold either values or references to other nodes. Attributes are also
typed; reference-typed attributes provide for the edges of the graph.</p>
      <p>Some of the attributes dened for each node type are designated as child
attributes; they dene the spanning trees that let us regard abstract syntax
graphs as trees (cf. Challenge 1). This tree structure is of special signicance even
at the abstract syntax level, namely when it denes the containment relation of a
programming language, and with it its lexical scopes. Because of this special role,
the containment relation almost always needs to be navigated in both directions:
from the owner of the attribute to the child and from the child to the owner,
aka parent. The parent direction of the relation is usually also represented by
an attribute (which may be derived, though) and, therefore, is also typed. The
question is, what is its type?</p>
      <p>Naively, it has the type of the owner of the corresponding child attribute,
but this does not work if dierent parent node types share the same child node
type. This however is routinely the case; for instance, for programs comprised
of (global) variables and functions, where functions may have local variables, we
may nd the node type declarations
node type Prog =
child var : Var;
child fun : Fun
end;
node type Var =</p>
      <p>parent() : Prog
end;
node type Fun =
child var : Var;
parent() : Prog
end;
(where parent() means that the parent is derived). Now given the nodes</p>
      <p>p : Prog
var
v : Var</p>
      <p>fun
f : Fun
v0 : Var
var
the expression v0.parent().parent(), which would get one from v0 to f to
p, is ill-typed, because the type of v0.parent() is Prog, and Prog does not
have a parent() attribute.</p>
      <p>While this problem is a very standard one, it seems that it is solved by
every implementation of abstract syntax trees anew: some use union types (here:
Prog#Fun for the parent attribute of type Var) or least common supertypes for
parent attributes, and resort to type tests and downcasts for accessing attributes
specic to an actual parent node (here: to access parent() on v0.parent()),
while others may use more sophisticated type systems or bypass static typing
entirely. Why is that so?</p>
    </sec>
    <sec id="sec-6">
      <title>Epilogue</title>
      <sec id="sec-6-1">
        <title>We have:</title>
        <p>We get:
the world depends on software software depends on software languages
the world depends on software languages</p>
      </sec>
      <sec id="sec-6-2">
        <title>SLE will never run out of challenges</title>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1. van Antwerpen,
          <string-name>
            <given-names>H.</given-names>
            ,
            <surname>Neron</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            ,
            <surname>Tolmach</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.P.</given-names>
            ,
            <surname>Visser</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            ,
            <surname>Wachsmuth</surname>
          </string-name>
          , G.:
          <article-title>A constraint language for static semantic analysis based on scope graphs</article-title>
          . In: Erwig,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Rompf</surname>
          </string-name>
          , T. (eds.)
          <source>Proceedings of the 2016 ACM SIGPLAN Workshop on Partial Evaluation and Program Manipulation</source>
          ,
          <string-name>
            <surname>PEPM</surname>
          </string-name>
          <year>2016</year>
          ,
          <article-title>St</article-title>
          . Petersburg, FL, USA, January
          <volume>20</volume>
          -
          <issue>22</issue>
          ,
          <year>2016</year>
          . pp.
          <fpage>4960</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          (
          <year>2016</year>
          ). https://doi.org/10.1145/2847538.2847543, https://doi.org/10.1145/2847538.2847543
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Erwig</surname>
            ,
            <given-names>M.:</given-names>
          </string-name>
          <article-title>Inductive graphs and functional graph algorithms</article-title>
          .
          <source>J. Funct. Program</source>
          .
          <volume>11</volume>
          (
          <issue>5</issue>
          ),
          <volume>467492</volume>
          (
          <year>2001</year>
          ). https://doi.org/10.1017/S0956796801004075, https://doi.org/10.1017/S0956796801004075
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Gavidia-Calderon</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sarro</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Harman</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Barr</surname>
          </string-name>
          , E.T.:
          <article-title>Gametheoretic analysis of development practices: Challenges and opportunities</article-title>
          .
          <source>Journal of Systems and Software</source>
          <volume>159</volume>
          ,
          <issue>110424</issue>
          (
          <year>2020</year>
          ). https://doi.org/https://doi.org/10.1016/j.jss.
          <year>2019</year>
          .
          <volume>110424</volume>
          , http://www.sciencedirect.com/science/article/pii/S0164121219301980
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Pierce</surname>
            ,
            <given-names>B.C.</given-names>
          </string-name>
          :
          <article-title>Types and programming languages</article-title>
          . MIT Press (
          <year>2002</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>Steele</given-names>
            <surname>Jr.</surname>
          </string-name>
          ,
          <string-name>
            <surname>G.L.</surname>
          </string-name>
          :
          <article-title>It's time for a new old language</article-title>
          . In: Sarkar,
          <string-name>
            <given-names>V.</given-names>
            ,
            <surname>Rauchwerger</surname>
          </string-name>
          ,
          <string-name>
            <surname>L</surname>
          </string-name>
          . (eds.)
          <source>Proceedings of the 22nd ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming</source>
          , Austin, TX, USA, February 4-
          <issue>8</issue>
          ,
          <year>2017</year>
          . p.
          <fpage>1</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          (
          <year>2017</year>
          ), https://www.youtube.com/watch?v=7HKbjYqqPPQ
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Steimann</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          :
          <article-title>Befactoring: preserving non-functional properties under behavioural change</article-title>
          . In:
          <string-name>
            <surname>Murphy-Hill</surname>
            ,
            <given-names>E.R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Schfer</surname>
          </string-name>
          , M. (eds.)
          <source>Proceedings of the 2013 ACM Workshop on Refactoring Tools, WRT@SPLASH</source>
          <year>2013</year>
          ,
          <article-title>Indianapolis</article-title>
          , IN, USA, October
          <volume>27</volume>
          ,
          <year>2013</year>
          . pp.
          <fpage>2124</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          (
          <year>2013</year>
          ). https://doi.org/10.1145/2541348.2541354, https://doi.org/10.1145/2541348.2541354
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Steimann</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          :
          <article-title>None, one, many what's the dierence</article-title>
          , anyhow? In: Ball,
          <string-name>
            <given-names>T.</given-names>
            ,
            <surname>Bodk</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            ,
            <surname>Krishnamurthi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            ,
            <surname>Lerner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.S.</given-names>
            ,
            <surname>Morrisett</surname>
          </string-name>
          ,
          <string-name>
            <surname>G</surname>
          </string-name>
          . (eds.) 1st
          <source>Summit on Advances in Programming Languages, SNAPL 2015, May 3-6</source>
          ,
          <year>2015</year>
          , Asilomar, California, USA. LIPIcs, vol.
          <volume>32</volume>
          , pp.
          <fpage>294308</fpage>
          .
          <string-name>
            <surname>Schloss Dagstuhl - LeibnizZentrum fr Informatik</surname>
          </string-name>
          (
          <year>2015</year>
          ). https://doi.org/10.4230/LIPIcs.SNAPL.
          <year>2015</year>
          .
          <volume>294</volume>
          , https://doi.org/10.4230/LIPIcs.SNAPL.
          <year>2015</year>
          .294
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Steimann</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          :
          <article-title>Constraint-based refactoring</article-title>
          .
          <source>ACM Trans. Program. Lang. Syst</source>
          .
          <volume>40</volume>
          (
          <issue>1</issue>
          ),
          <volume>2</volume>
          :
          <fpage>12</fpage>
          :
          <fpage>40</fpage>
          (
          <year>2018</year>
          ). https://doi.org/10.1145/3156016, https://doi.org/10.1145/3156016
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Steimann</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Frenkel</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Voelter</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Robust projectional editing</article-title>
          . In: Combemale,
          <string-name>
            <given-names>B.</given-names>
            ,
            <surname>Mernik</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Rumpe</surname>
          </string-name>
          ,
          <string-name>
            <surname>B</surname>
          </string-name>
          . (eds.)
          <source>Proceedings of the 10th ACM SIGPLAN International Conference on Software Language Engineering</source>
          ,
          <string-name>
            <surname>SLE</surname>
          </string-name>
          <year>2017</year>
          , Vancouver, BC, Canada,
          <source>October 23-24</source>
          ,
          <year>2017</year>
          . pp.
          <fpage>7990</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          (
          <year>2017</year>
          ). https://doi.org/10.1145/3136014.3136034, https://doi.org/10.1145/3136014.3136034
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Steimann</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kurowsky</surname>
          </string-name>
          , N.:
          <article-title>Transactional editing: giving ACID to programmers</article-title>
          . In: Nierstrasz,
          <string-name>
            <given-names>O.</given-names>
            ,
            <surname>Gray</surname>
          </string-name>
          , J., d. S. Oliveira, B.C. (eds.)
          <source>Proceedings of the 12th ACM SIGPLAN International Conference on Software Language Engineering</source>
          ,
          <string-name>
            <surname>SLE</surname>
          </string-name>
          <year>2019</year>
          , Athens, Greece,
          <source>October 20-22</source>
          ,
          <year>2019</year>
          . pp.
          <fpage>202215</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          (
          <year>2019</year>
          ). https://doi.org/10.1145/3357766.3359536, https://doi.org/10.1145/3357766.3359536
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>