<?xml version="1.0" encoding="utf-8"?>
<raweb xmlns:xlink="http://www.w3.org/1999/xlink" xml:lang="en" year="2017">
  <identification id="gallium" isproject="true">
    <shortname>GALLIUM</shortname>
    <projectName>Programming languages, types, compilation and proofs</projectName>
    <theme-de-recherche>Proofs and Verification</theme-de-recherche>
    <domaine-de-recherche>Algorithmics, Programming, Software and Architecture</domaine-de-recherche>
    <urlTeam>http://gallium.inria.fr/</urlTeam>
    <header_dates_team>Creation of the Project-Team: 2006 May 01</header_dates_team>
    <LeTypeProjet>Project-Team</LeTypeProjet>
    <keywordsSdN>
      <term>A1.1.1. - Multicore, Manycore</term>
      <term>A1.1.3. - Memory models</term>
      <term>A2.1. - Programming Languages</term>
      <term>A2.1.1. - Semantics of programming languages</term>
      <term>A2.1.2. - Object-oriented programming</term>
      <term>A2.1.3. - Functional programming</term>
      <term>A2.1.6. - Concurrent programming</term>
      <term>A2.1.11. - Proof languages</term>
      <term>A2.2. - Compilation</term>
      <term>A2.2.1. - Static analysis</term>
      <term>A2.2.2. - Memory models</term>
      <term>A2.2.3. - Run-time systems</term>
      <term>A2.2.4. - Parallel architectures</term>
      <term>A2.4. - Verification, reliability, certification</term>
      <term>A2.4.1. - Analysis</term>
      <term>A2.4.3. - Proofs</term>
      <term>A2.5.4. - Software Maintenance &amp; Evolution</term>
      <term>A7.1.2. - Parallel algorithms</term>
      <term>A7.2. - Logic in Computer Science</term>
      <term>A7.2.2. - Automated Theorem Proving</term>
      <term>A7.2.3. - Interactive Theorem Proving</term>
    </keywordsSdN>
    <keywordsSecteurs>
      <term>B5.2.3. - Aviation</term>
      <term>B6.1. - Software industry</term>
      <term>B6.6. - Embedded systems</term>
      <term>B9.4.1. - Computer science</term>
    </keywordsSecteurs>
    <UR name="Paris"/>
  </identification>
  <team id="uid1">
    <person key="gallium-2014-idm29528">
      <firstname>Xavier</firstname>
      <lastname>Leroy</lastname>
      <categoryPro>Chercheur</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Team leader, Inria, Senior Researcher</moreinfo>
    </person>
    <person key="gallium-2014-idm28256">
      <firstname>Umut</firstname>
      <lastname>Acar</lastname>
      <categoryPro>Chercheur</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Carnegie Mellon University &amp; Inria, Advanced Research Position</moreinfo>
    </person>
    <person key="gallium-2014-idm26976">
      <firstname>Damien</firstname>
      <lastname>Doligez</lastname>
      <categoryPro>Chercheur</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, Researcher</moreinfo>
    </person>
    <person key="gallium-2014-idm25696">
      <firstname>Fabrice</firstname>
      <lastname>Le Fessant</lastname>
      <categoryPro>Chercheur</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, Researcher, until Sep 2017</moreinfo>
    </person>
    <person key="focus-2014-idp101040">
      <firstname>Jean-Marie</firstname>
      <lastname>Madiot</lastname>
      <categoryPro>Chercheur</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, Researcher</moreinfo>
    </person>
    <person key="gallium-2014-idp66296">
      <firstname>Luc</firstname>
      <lastname>Maranget</lastname>
      <categoryPro>Chercheur</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, Researcher</moreinfo>
    </person>
    <person key="gallium-2016-idp121360">
      <firstname>Michel</firstname>
      <lastname>Mauny</lastname>
      <categoryPro>Chercheur</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, Senior Researcher</moreinfo>
    </person>
    <person key="gallium-2014-idp67496">
      <firstname>François</firstname>
      <lastname>Pottier</lastname>
      <categoryPro>Chercheur</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, Senior Researcher</moreinfo>
      <hdr>oui</hdr>
    </person>
    <person key="gallium-2016-idp126752">
      <firstname>Michael</firstname>
      <lastname>Rainey</lastname>
      <categoryPro>Chercheur</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, Starting Research Position</moreinfo>
    </person>
    <person key="gallium-2014-idp70256">
      <firstname>Didier</firstname>
      <lastname>Rémy</lastname>
      <categoryPro>Chercheur</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, Senior Researcher</moreinfo>
      <hdr>oui</hdr>
    </person>
    <person key="gallium-2016-idp132096">
      <firstname>Sébastien</firstname>
      <lastname>Hinderer</lastname>
      <categoryPro>Technique</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, Research Engineer, 80%</moreinfo>
    </person>
    <person key="gallium-2017-idp144112">
      <firstname>Thomas</firstname>
      <lastname>Blanc</lastname>
      <categoryPro>Technique</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, from Apr 2017 until Sep 2017</moreinfo>
    </person>
    <person key="gallium-2017-idp146592">
      <firstname>Gergö</firstname>
      <lastname>Barany</lastname>
      <categoryPro>PostDoc</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, from Mar 2017</moreinfo>
    </person>
    <person key="parkas-2014-idp142896">
      <firstname>Adrien</firstname>
      <lastname>Guatto</lastname>
      <categoryPro>PostDoc</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, from Sep 2017</moreinfo>
    </person>
    <person key="gallium-2015-idp72464">
      <firstname>Vitalii</firstname>
      <lastname>Aksenov</lastname>
      <categoryPro>PhD</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria</moreinfo>
    </person>
    <person key="gallium-2015-idp84952">
      <firstname>Armaël</firstname>
      <lastname>Guéneau</lastname>
      <categoryPro>PhD</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Université Paris Diderot</moreinfo>
    </person>
    <person key="gallium-2017-idp156416">
      <firstname>Naomi</firstname>
      <lastname>Testard</lastname>
      <categoryPro>PhD</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria</moreinfo>
    </person>
    <person key="gallium-2014-idp85776">
      <firstname>Thomas</firstname>
      <lastname>Williams</lastname>
      <categoryPro>PhD</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>ENS Paris</moreinfo>
    </person>
    <person key="gallium-2017-idp161280">
      <firstname>Idir</firstname>
      <lastname>Lankri</lastname>
      <categoryPro>Stagiaire</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, from Jun 2017 until Jul 2017</moreinfo>
    </person>
    <person key="gallium-2017-idp163760">
      <firstname>Danny</firstname>
      <lastname>Willems</lastname>
      <categoryPro>Stagiaire</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria, from Feb 2017 until May 2017</moreinfo>
    </person>
    <person key="polsys-2014-idp85904">
      <firstname>Laurence</firstname>
      <lastname>Bourcier</lastname>
      <categoryPro>Assistant</categoryPro>
      <research-centre>Paris</research-centre>
      <moreinfo>Inria</moreinfo>
    </person>
  </team>
  <presentation id="uid2">
    <bodyTitle>Overall Objectives</bodyTitle>
    <subsection id="uid3" level="1">
      <bodyTitle>Research at Gallium</bodyTitle>
      <p>The research conducted in the Gallium group aims at improving the
safety, reliability and security of software through advances in
programming languages and formal verification of programs. Our work
is centered on the design, formalization and implementation of
functional programming languages, with particular emphasis on type
systems and type inference, formal verification of compilers, and
interactions between programming and program proof. The OCaml language
and the CompCert verified C compiler embody many of our research
results. Our work spans the whole spectrum from theoretical
foundations and formal semantics to applications to real-world
problems.</p>
    </subsection>
  </presentation>
  <fondements id="uid4">
    <bodyTitle>Research Program</bodyTitle>
    <subsection id="uid5" level="1">
      <bodyTitle>Programming languages: design, formalization, implementation</bodyTitle>
      <p>Like all languages, programming languages are the media by which
thoughts (software designs) are communicated (development),
acted upon (program execution), and reasoned upon (validation).
The choice of adequate programming languages has a tremendous impact
on software quality. By “adequate”, we mean in particular the
following four aspects of programming languages:</p>
      <simplelist>
        <li id="uid6">
          <p noindent="true"><b>Safety.</b> The programming language must not expose
error-prone low-level operations (explicit memory deallocation,
unchecked array access, etc) to programmers. Further, it should
provide constructs for describing data structures, inserting
assertions, and expressing invariants within programs. The consistency
of these declarations and assertions should be verified through
compile-time verification (e.g. static type-checking) and run-time
checks.</p>
        </li>
        <li id="uid7">
          <p noindent="true"><b>Expressiveness.</b> A programming language should manipulate
as directly as possible the concepts and entities of the application
domain. In particular, complex, manual encodings of domain notions
into programmatic notations should be avoided as much as possible. A
typical example of a language feature that increases expressiveness is
pattern matching for examination of structured data (as in symbolic
programming) and of semi-structured data (as in XML processing).
Carried to the extreme, the search for expressiveness leads to
domain-specific languages, customized for a specific application area.</p>
        </li>
        <li id="uid8">
          <p noindent="true"><b>Modularity and compositionality.</b> The complexity of large
software systems makes it impossible to design and develop them as
one, monolithic program. Software decomposition (into semi-independent
components) and software composition (of existing or
independently-developed components) are therefore crucial. Again,
this modular approach can be applied to any programming language,
given sufficient fortitude by the programmers, but is much facilitated
by adequate linguistic support. In particular, reflecting notions of
modularity and software components in the programming language enables
compile-time checking of correctness conditions such as type
correctness at component boundaries.</p>
        </li>
        <li id="uid9">
          <p noindent="true"><b>Formal semantics.</b> A programming language should fully and
formally specify the behaviours of programs using mathematical
semantics, as opposed to informal, natural-language specifications.
Such a formal semantics is required in order to apply formal methods
(program proof, model checking) to programs.</p>
        </li>
      </simplelist>
      <p>Our research work in language design and implementation centers on
the statically-typed functional programming paradigm,
which scores high on safety, expressiveness and formal semantics,
complemented with full imperative features and objects for additional
expressiveness, and modules and classes for compositionality. The
OCaml language and system embodies many of our earlier
results in this area <ref xlink:href="#gallium-2017-bid0" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.
Through collaborations, we also gained experience with several
domain-specific languages based on a functional core, including
distributed programming (JoCaml), XML processing (XDuce, CDuce),
reactive functional programming, and hardware modeling.</p>
    </subsection>
    <subsection id="uid10" level="1">
      <bodyTitle>Type systems</bodyTitle>
      <p>Type systems  <ref xlink:href="#gallium-2017-bid1" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/> are a very effective way to improve
programming language reliability. By grouping the data manipulated by
the program into classes called types, and ensuring that operations
are never applied to types over which they are not defined
(e.g. accessing an integer as if it were an array, or calling a string
as if it were a function), a tremendous number of programming errors
can be detected and avoided, ranging from the trivial (misspelled
identifier) to the fairly subtle (violation of data structure
invariants). These restrictions are also very effective at thwarting
basic attacks on security vulnerabilities such as buffer overflows.</p>
      <p>The enforcement of such typing restrictions is called type-checking,
and can be performed either dynamically (through run-time type tests)
or statically (at compile-time, through static program analysis). We
favor static type-checking, as it catches bugs earlier and even in
rarely-executed parts of the program, but note that not all type
constraints can be checked statically if static type-checking is to
remain decidable (i.e. not degenerate into full program proof).
Therefore, all typed languages combine static and dynamic
type-checking in various proportions.</p>
      <p>Static type-checking amounts to an automatic proof of
partial correctness of the programs that pass the compiler. The two
key words here are <i>partial</i>, since only type safety guarantees are
established, not full correctness; and <i>automatic</i>, since the
proof is performed entirely by machine, without manual assistance from
the programmer (beyond a few, easy type declarations in the source).
Static type-checking can therefore be viewed as the poor man's formal
methods: the guarantees it gives are much weaker than full formal
verification, but it is much more acceptable to the general population
of programmers.</p>
      <subsection id="uid11" level="2">
        <bodyTitle>Type systems and language design.</bodyTitle>
        <p>Unlike most other uses of static program analysis, static
type-checking rejects programs that it cannot prove safe.
Consequently, the type system is an integral part of the language
design, as it determines which programs are acceptable and which are
not. Modern typed languages go one step further: most of the language
design is determined by the <i>type structure</i> (type algebra and
typing rules) of the language and intended application area. This is
apparent, for instance, in the XDuce and CDuce domain-specific
languages for XML transformations <ref xlink:href="#gallium-2017-bid2" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>, <ref xlink:href="#gallium-2017-bid3" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>,
whose design is driven by the idea of regular expression types that
enforce DTDs at compile-time. For this reason, research on type
systems – their design, their proof of semantic correctness (type
safety), the development and proof of associated type-checking and
inference algorithms – plays a large and central role in the field of
programming language research, as evidenced by the huge number of type
systems papers in conferences such as Principles of Programming
Languages.</p>
      </subsection>
      <subsection id="uid12" level="2">
        <bodyTitle>Polymorphism in type systems.</bodyTitle>
        <p>There exists a fundamental tension in the field of type systems that
drives much of the research in this area. On the one hand, the desire
to catch as many programming errors as possible leads to type systems
that reject more programs, by enforcing fine distinctions between
related data structures (say, sorted arrays and general arrays). The
downside is that code reuse becomes harder: conceptually identical
operations must be implemented several times (say, copying a general array
and a sorted array). On the other hand, the desire to support code
reuse and to increase expressiveness leads to type
systems that accept more programs, by assigning a common type to
broadly similar objects (for instance, the <tt>Object</tt> type of all class
instances in Java). The downside is a loss of precision in static
typing, requiring more dynamic type checks (downcasts in Java) and
catching fewer bugs at compile-time.</p>
        <p><i>Polymorphic</i> type systems offer a way out of this dilemma by
combining precise, descriptive types (to catch more errors statically)
with the ability to abstract over their differences in pieces of
reusable, generic code that is concerned only with their commonalities.
The paradigmatic example is parametric polymorphism, which is
at the heart of all typed functional programming
languages. Many forms of polymorphic typing have been studied since
then. Taking examples from our group, the work of Rémy, Vouillon and
Garrigue on row polymorphism <ref xlink:href="#gallium-2017-bid4" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>, integrated
in OCaml, extended the benefits of this approach (reusable
code with no loss of typing precision) to object-oriented programming,
extensible records and extensible variants. Another example is the
work by Pottier on subtype polymorphism, using a constraint-based
formulation of the type system <ref xlink:href="#gallium-2017-bid5" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.
Finally, the notion of “coercion polymorphism” proposed by Cretin and
Rémy<ref xlink:href="#gallium-2017-bid6" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/> combines and generalizes both parametric
and subtyping polymorphism.</p>
      </subsection>
      <subsection id="uid13" level="2">
        <bodyTitle>Type inference.</bodyTitle>
        <p>Another crucial issue in type systems research is the issue of type
inference: how many type annotations must be provided by the
programmer, and how many can be inferred (reconstructed) automatically
by the type-checker? Too many annotations make the language more
verbose and bother the programmer with unnecessary details. Too few
annotations make type-checking undecidable, possibly requiring
heuristics, which is unsatisfactory.
OCaml requires explicit type information at data type
declarations and at component interfaces, but infers all
other types.</p>
        <p>In order to be predictable, a type inference algorithm must be complete. That
is, it must not find <i>one</i>, but <i>all</i> ways of filling in the missing
type annotations to form an explicitly typed program. This task is made easier
when all possible solutions to a type inference problem are <i>instances</i>
of a single, <i>principal</i> solution.</p>
        <p>Maybe surprisingly, the strong requirements – such as the existence of
principal types – that are imposed on type systems by the desire to perform
type inference sometimes lead to better designs. An illustration of this is
row variables. The development of row variables was prompted by type inference
for operations on records. Indeed, previous approaches were based on subtyping
and did not easily support type inference. Row variables have proved simpler
than structural subtyping and more adequate for type-checking record update,
record extension, and objects.</p>
        <p>Type inference encourages abstraction and code reuse. A programmer's
understanding of his own program is often initially limited to a particular
context, where types are more specific than strictly required. Type inference
can reveal the additional generality, which allows making the code more
abstract and thus more reuseable.</p>
      </subsection>
    </subsection>
    <subsection id="uid14" level="1">
      <bodyTitle>Compilation</bodyTitle>
      <p>Compilation is the automatic translation of high-level programming
languages, understandable by humans, to lower-level languages, often
executable directly by hardware. It is an essential step in the
efficient execution, and therefore in the adoption, of high-level
languages. Compilation is at the interface between programming
languages and computer architecture, and because of this position has
had considerable influence on the design of both. Compilers have
also attracted considerable research interest as the oldest instance
of symbolic processing on computers.</p>
      <p>Compilation has been the topic of much research work in the last 40
years, focusing mostly on high-performance execution
(“optimization”) of low-level languages such as Fortran and C. Two
major results came out of these efforts: one is a superb body of
performance optimization algorithms, techniques and methodologies; the
other is the whole field of static program analysis, which now serves
not only to increase performance but also to increase reliability,
through automatic detection of bugs and establishment of safety
properties. The work on compilation carried out in the Gallium group
focuses on a less investigated topic: compiler certification.</p>
      <subsection id="uid15" level="2">
        <bodyTitle>Formal verification of compiler correctness.</bodyTitle>
        <p>While the algorithmic aspects of compilation (termination and
complexity) have been well studied, its semantic correctness – the
fact that the compiler preserves the meaning of programs – is
generally taken for granted. In other terms, the correctness of
compilers is generally established only through testing. This is
adequate for compiling low-assurance software, themselves validated
only by testing: what is tested is the executable code produced by the
compiler, therefore compiler bugs are detected along with application
bugs. This is not adequate for high-assurance, critical software
which must be validated using formal methods: what is formally
verified is the source code of the application; bugs in the compiler
used to turn the source into the final executable can invalidate the
guarantees so painfully obtained by formal verification of the source.</p>
        <p>To establish strong guarantees that the compiler can be trusted not
to change the behavior of the program, it is necessary to apply formal
methods to the compiler itself. Several approaches in this direction
have been investigated, including translation validation,
proof-carrying code, and type-preserving compilation. The approach
that we currently investigate, called <i>compiler verification</i>,
applies program proof techniques to the compiler itself, seen as a
program in particular, and use a theorem prover (the Coq system) to
prove that the generated code is observationally equivalent to the
source code. Besides its potential impact on the critical software
industry, this line of work is also scientifically fertile: it
improves our semantic understanding of compiler intermediate
languages, static analyses and code transformations.</p>
      </subsection>
    </subsection>
    <subsection id="uid16" level="1">
      <bodyTitle>Interface with formal methods</bodyTitle>
      <p>Formal methods collectively refer to the mathematical specification of
software or hardware systems and to the verification of these systems
against these specifications using computer assistance: model
checkers, theorem provers, program analyzers, etc. Despite their
costs, formal methods are gaining acceptance in the critical software
industry, as they are the only way to reach the required levels of
software assurance.</p>
      <p>In contrast with several other Inria projects, our research objectives
are not fully centered around formal methods. However, our research
intersects formal methods in the following two areas, mostly related
to program proofs using proof assistants and theorem provers.</p>
      <subsection id="uid17" level="2">
        <bodyTitle>Software-proof codesign</bodyTitle>
        <p>The current industrial practice is to write programs first, then
formally verify them later, often at huge costs. In contrast, we
advocate a codesign approach where the program and its proof of
correctness are developed in interaction, and we are interested in
developing ways and means to facilitate this approach. One
possibility that we currently investigate is to extend functional
programming languages such as OCaml with the ability to state
logical invariants over data structures and pre- and post-conditions
over functions, and interface with automatic or interactive provers to
verify that these specifications are satisfied. Another approach that
we practice is to start with a proof assistant such as Coq and improve
its capabilities for programming directly within Coq.</p>
      </subsection>
      <subsection id="uid18" level="2">
        <bodyTitle>Mechanized specifications and proofs for
programming languages components</bodyTitle>
        <p>We emphasize mathematical specifications and proofs of correctness for
key language components such as semantics, type systems, type
inference algorithms, compilers and static analyzers. These
components are getting so large that machine assistance becomes
necessary to conduct these mathematical investigations. We have
already mentioned using proof assistants to verify compiler
correctness. We are also interested in using them to specify and
reason about semantics and type systems. These efforts are part of a
more general research topic that is gaining importance: the formal
verification of the tools that participate in the construction and
certification of high-assurance software.</p>
      </subsection>
    </subsection>
  </fondements>
  <domaine id="uid19">
    <bodyTitle>Application Domains</bodyTitle>
    <subsection id="uid20" level="1">
      <bodyTitle>High-assurance software</bodyTitle>
      <p>A large part of our work on programming languages and tools focuses on
improving the reliability of software. Functional programming,
program proof, and static type-checking contribute significantly to
this goal.</p>
      <p>Because of its proximity with mathematical specifications,
pure functional programming is well suited to program proof.
Moreover, functional programming languages such as OCaml are eminently
suitable to develop the code generators and verification tools that
participate in the construction and qualification of high-assurance
software. Examples include Esterel Technologies's KCG 6 code
generator, the Astrée static analyzer, the
Caduceus/Jessie program prover, and the Frama-C platform. Our own
work on compiler verification combines these two aspects of functional
programming: writing a compiler in a pure functional language and
mechanically proving its correctness.</p>
      <p>Static typing detects programming errors early, prevents a number
of common sources of program crashes (null dereferences, out-of bound
array accesses, etc), and helps tremendously to enforce the integrity
of data structures. Judicious uses of generalized abstract data types
(GADTs), phantom types, type abstraction and other encapsulation
mechanisms also allow static type checking to enforce program
invariants.</p>
    </subsection>
    <subsection id="uid21" level="1">
      <bodyTitle>Software security</bodyTitle>
      <p>Static typing is also highly effective at preventing a number of
common security attacks, such as buffer overflows, stack smashing, and
executing network data as if it were code. Applications developed in
a language such as OCaml are therefore inherently more secure than
those developed in unsafe languages such as C.</p>
      <p>The methods used in designing type systems and establishing their
soundness can also deliver static analyses that automatically verify
some security policies. Two examples from our past work include Java
bytecode verification <ref xlink:href="#gallium-2017-bid7" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/> and enforcement of
data confidentiality through type-based inference of information flow
and noninterference properties <ref xlink:href="#gallium-2017-bid8" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.</p>
    </subsection>
    <subsection id="uid22" level="1">
      <bodyTitle>Processing of complex structured data</bodyTitle>
      <p>Like most functional languages, OCaml is very well suited to expressing
processing and transformations of complex, structured data. It
provides concise, high-level declarations for data structures; a very
expressive pattern-matching mechanism to destructure data; and
compile-time exhaustiveness tests.
Therefore, OCaml is an excellent match for applications involving significant
amounts of symbolic processing: compilers, program analyzers and
theorem provers, but also (and less obviously) distributed
collaborative applications, advanced Web applications, financial
modeling tools, etc.</p>
    </subsection>
    <subsection id="uid23" level="1">
      <bodyTitle>Rapid development</bodyTitle>
      <p>Static typing is often criticized as being verbose (due to the additional
type declarations required) and inflexible (due to, for instance, class
hierarchies that must be fixed in advance). Its combination with type
inference, as in the OCaml language, substantially diminishes the
importance of these problems: type inference allows programs to be
initially written with few or no type declarations; moreover, the
OCaml approach to object-oriented programming completely separates the
class inheritance hierarchy from the type compatibility relation.
Therefore, the OCaml language is highly suitable for fast
prototyping and the gradual evolution of software prototypes into
final applications, as advocated by the popular “extreme
programming” methodology.</p>
    </subsection>
    <subsection id="uid24" level="1">
      <bodyTitle>Teaching programming</bodyTitle>
      <p>Our work on the Caml language family has an impact on the teaching of
programming. Caml Light is one of the programming
languages selected by the French Ministry of Education
for teaching Computer Science in <i>classes
préparatoires scientifiques</i>. OCaml is also widely used for
teaching advanced programming in engineering schools, colleges and
universities in France, the USA, and Japan.</p>
    </subsection>
  </domaine>
  <highlights id="uid25">
    <bodyTitle>Highlights of the Year</bodyTitle>
    <subsection id="uid26" level="1">
      <bodyTitle>Highlights of the Year</bodyTitle>
      <subsection id="uid27" level="2">
        <bodyTitle>Awards</bodyTitle>
        <p>In 2017, Jacques-Henri Jourdan received the
“prix du GDR GPL” (<ref xlink:href="http://gdr-gpl.cnrs.fr/node/284" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>gdr-gpl.<allowbreak/>cnrs.<allowbreak/>fr/<allowbreak/>node/<allowbreak/>284</ref>)
for his dissertation,
entitled
“Verasco: a Formally Verified C Static Analyzer”.
Jacques-Henri was a Ph.D. student in the Gallium team,
advised by Xavier Leroy.</p>
      </subsection>
    </subsection>
  </highlights>
  <logiciels id="uid28">
    <bodyTitle>New Software and Platforms</bodyTitle>
    <subsection id="uid29" level="1">
      <bodyTitle>Compcert</bodyTitle>
      <p>
        <i>The CompCert formally-verified C compiler</i>
      </p>
      <p noindent="true"><span class="smallcap" align="left">Keywords:</span> Compilers - Formal methods - Deductive program verification - C - Coq</p>
      <p noindent="true"><span class="smallcap" align="left">Functional Description:</span> CompCert is a compiler for the C programming language. Its intended use is the compilation of life-critical and mission-critical software written in C and meeting high levels of assurance. It accepts most of the ISO C 99 language, with some exceptions and a few extensions. It produces machine code for the ARM, PowerPC, RISC-V, and x86 architectures. What sets CompCert C apart from any other production compiler, is that it is formally verified to be exempt from miscompilation issues, using machine-assisted mathematical proofs (the Coq proof assistant). In other words, the executable code it produces is proved to behave exactly as specified by the semantics of the source C program. This level of confidence in the correctness of the compilation process is unprecedented and contributes to meeting the highest levels of software assurance. In particular, using the CompCert C compiler is a natural complement to applying formal verification techniques (static analysis, program proof, model checking) at the source code level: the correctness proof of CompCert C guarantees that all safety properties verified on the source code automatically hold as well for the generated executable.</p>
      <p><span class="smallcap" align="left">Release Functional Description:</span> Novelties include a formally-verified type checker for CompCert C, a more careful modeling of pointer comparisons against the null pointer, algorithmic improvements in the handling of deeply nested struct and union types, much better ABI compatibility for passing composite values, support for GCC-style extended inline asm, and more complete generation of DWARF debugging information (contributed by AbsInt).</p>
      <simplelist>
        <li id="uid30">
          <p noindent="true">Participants: Xavier Leroy, Sandrine Blazy, Jacques-Henri Jourdan, Sylvie Boldo and Guillaume Melquiond</p>
        </li>
        <li id="uid31">
          <p noindent="true">Partner: AbsInt Angewandte Informatik GmbH</p>
        </li>
        <li id="uid32">
          <p noindent="true">Contact: Xavier Leroy</p>
        </li>
        <li id="uid33">
          <p noindent="true">URL: <ref xlink:href="http://compcert.inria.fr/" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>compcert.<allowbreak/>inria.<allowbreak/>fr/</ref></p>
        </li>
      </simplelist>
    </subsection>
    <subsection id="uid34" level="1">
      <bodyTitle>Diy</bodyTitle>
      <p>
        <i>Do It Yourself</i>
      </p>
      <p noindent="true"><span class="smallcap" align="left">Keyword:</span> Parallelism</p>
      <p noindent="true"><span class="smallcap" align="left">Functional Description:</span> The diy suite provides a set of tools for testing shared memory models: the litmus tool for running tests on hardware, various generators for producing tests from concise specifications, and herd, a memory model simulator. Tests are small programs written in x86, Power or ARM assembler that can thus be generated from concise specification, run on hardware, or simulated on top of memory models. Test results can be handled and compared using additional tools.</p>
      <simplelist>
        <li id="uid35">
          <p noindent="true">Participants: Jade Alglave and Luc Maranget</p>
        </li>
        <li id="uid36">
          <p noindent="true">Partner: University College London UK</p>
        </li>
        <li id="uid37">
          <p noindent="true">Contact: Luc Maranget</p>
        </li>
        <li id="uid38">
          <p noindent="true">URL: <ref xlink:href="http://diy.inria.fr/" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>diy.<allowbreak/>inria.<allowbreak/>fr/</ref></p>
        </li>
      </simplelist>
    </subsection>
    <subsection id="uid39" level="1">
      <bodyTitle>Menhir</bodyTitle>
      <p><span class="smallcap" align="left">Keywords:</span> Compilation - Context-free grammars - Parsing</p>
      <p noindent="true"><span class="smallcap" align="left">Functional Description:</span> Menhir is a LR(1) parser generator for the OCaml programming language. That is, Menhir compiles LR(1) grammar specifications down to OCaml code. Menhir was designed and implemented by François Pottier and Yann Régis-Gianas.</p>
      <simplelist>
        <li id="uid40">
          <p noindent="true">Contact: François Pottier</p>
        </li>
        <li id="uid41">
          <p noindent="true">Publications: <ref xlink:href="https://hal.inria.fr/hal-01633123" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">A Simple, Possibly Correct LR Parser for C11</ref> -
<ref xlink:href="https://hal.inria.fr/hal-01417004" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Reachability and Error Diagnosis in LR(1) Parsers</ref></p>
        </li>
      </simplelist>
    </subsection>
    <subsection id="uid42" level="1">
      <bodyTitle>OCaml</bodyTitle>
      <p><span class="smallcap" align="left">Keywords:</span> Functional programming - Static typing - Compilation</p>
      <p noindent="true"><span class="smallcap" align="left">Functional Description:</span> The OCaml language is a functional programming language that combines safety with expressiveness through the use of a precise and flexible type system with automatic type inference. The OCaml system is a comprehensive implementation of this language, featuring two compilers (a bytecode compiler, for fast prototyping and interactive use, and a native-code compiler producing efficient machine code for x86, ARM, PowerPC and System Z), a debugger, a documentation generator, a compilation manager, a package manager, and many libraries contributed by the user community.</p>
      <simplelist>
        <li id="uid43">
          <p noindent="true">Participants: Damien Doligez, Xavier Leroy, Fabrice Le Fessant, Luc Maranget, Gabriel Scherer, Alain Frisch, Jacques Garrigue, Marc Shinwell, Jeremy Yallop and Leo White</p>
        </li>
        <li id="uid44">
          <p noindent="true">Contact: Damien Doligez</p>
        </li>
        <li id="uid45">
          <p noindent="true">URL: <ref xlink:href="https://ocaml.org/" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>ocaml.<allowbreak/>org/</ref></p>
        </li>
      </simplelist>
    </subsection>
    <subsection id="uid46" level="1">
      <bodyTitle>PASL</bodyTitle>
      <p><span class="smallcap" align="left">Keyword:</span> Parallel computing</p>
      <p noindent="true"><span class="smallcap" align="left">Functional Description:</span> PASL is a C++ library for writing parallel programs targeting the broadly available multicore computers. The library provides a high level interface and can still guarantee very good efficiency and performance, primarily due to its scheduling and automatic granularity control mechanisms.</p>
      <simplelist>
        <li id="uid47">
          <p noindent="true">Participants: Arthur Charguéraud, Michael Rainey and Umut Acar</p>
        </li>
        <li id="uid48">
          <p noindent="true">Contact: Michael Rainey</p>
        </li>
        <li id="uid49">
          <p noindent="true">URL: <ref xlink:href="http://deepsea.inria.fr/pasl/" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>deepsea.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>pasl/</ref></p>
        </li>
      </simplelist>
    </subsection>
    <subsection id="uid50" level="1">
      <bodyTitle>ZENON</bodyTitle>
      <p><span class="smallcap" align="left">Functional Description:</span> Zenon is an automatic theorem prover based on the tableaux method. Given a first-order statement as input, it outputs a fully formal proof in the form of a Coq proof script. It has special rules for efficient handling of equality and arbitrary transitive relations. Although still in the prototype stage, it already gives satisfying results on standard automatic-proving benchmarks.</p>
      <p>Zenon is designed to be easy to interface with front-end tools (for example integration in an interactive proof assistant), and also to be retargeted to output scripts for different frameworks (for example, Isabelle and Dedukti).</p>
      <simplelist>
        <li id="uid51">
          <p noindent="true">Author: Damien Doligez</p>
        </li>
        <li id="uid52">
          <p noindent="true">Contact: Damien Doligez</p>
        </li>
        <li id="uid53">
          <p noindent="true">URL: <ref xlink:href="http://zenon-prover.org/" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>zenon-prover.<allowbreak/>org/</ref></p>
        </li>
      </simplelist>
    </subsection>
    <subsection id="uid54" level="1">
      <bodyTitle>OPAM Builder</bodyTitle>
      <p><span class="smallcap" align="left">Keywords:</span> Ocaml - Continuous integration - Opam</p>
      <p noindent="true"><span class="smallcap" align="left">Functional Description:</span> OPAM Builder checks in real-time the installability on a computer of all packages after any modification of the repository. To achieve this result, it uses smart mechanisms to compute incremental differencies between package updates, to be able to reuse cached compilations, and switch from a quadratic complexity to a linear complexity.</p>
      <simplelist>
        <li id="uid55">
          <p noindent="true">Partner: OCamlPro</p>
        </li>
        <li id="uid56">
          <p noindent="true">Contact: Fabrice Le Fessant</p>
        </li>
        <li id="uid57">
          <p noindent="true">URL: <ref xlink:href="http://github.com/OCamlPro/opam-builder" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>github.<allowbreak/>com/<allowbreak/>OCamlPro/<allowbreak/>opam-builder</ref></p>
        </li>
      </simplelist>
    </subsection>
    <subsection id="uid58" level="1">
      <bodyTitle>TLAPS</bodyTitle>
      <p>
        <i>TLA+ proof system</i>
      </p>
      <p noindent="true"><span class="smallcap" align="left">Keyword:</span> Proof assistant</p>
      <p noindent="true"><span class="smallcap" align="left">Functional Description:</span> TLAPS is a platform for developing and mechanically verifying proofs about TLA+
specifications. The TLA+ proof language is hierarchical and explicit, allowing a
user to decompose the overall proof into proof steps that can be checked
independently. TLAPS consists of a proof manager that interprets the proof
language and generates a collection of proof obligations that are sent to
backend verifiers. The current backends include the tableau-based prover Zenon
for first-order logic, Isabelle/TLA+, an encoding of TLA+ set theory as an
object logic in the logical framework Isabelle, an SMT backend designed for use
with any SMT-lib compatible solver, and an interface to a decision procedure for
propositional temporal logic.</p>
      <p noindent="true"><span class="smallcap" align="left">News Of The Year:</span> In 2017, we have continued to work on a complete reimplementation of the proof manager. One objective is a cleaner interaction with the TLA<sup>+</sup> front-ends, in particular SANY, the standard parser and semantic analyzer. The reimplementation is also necessary for extending the scope of the fragment of TLA<sup>+</sup> that is handled by TLAPS, in particular full temporal logic and module instantiation.</p>
      <simplelist>
        <li id="uid59">
          <p noindent="true">Participants: Damien Doligez, Stephan Merz and Martin Riener</p>
        </li>
        <li id="uid60">
          <p noindent="true">Contact: Stephan Merz</p>
        </li>
        <li id="uid61">
          <p noindent="true">URL: <ref xlink:href="https://tla.msr-inria.inria.fr/tlaps/content/Home.html" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>tla.<allowbreak/>msr-inria.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>tlaps/<allowbreak/>content/<allowbreak/>Home.<allowbreak/>html</ref></p>
        </li>
      </simplelist>
    </subsection>
    <subsection id="uid62" level="1">
      <bodyTitle>CFML</bodyTitle>
      <p>
        <i>Interactive program verification using characteristic formulae</i>
      </p>
      <p noindent="true"><span class="smallcap" align="left">Keywords:</span> Coq - Software Verification - Deductive program verification - Separation Logic</p>
      <p noindent="true"><span class="smallcap" align="left">Functional Description:</span> The CFML tool supports the verification of OCaml programs through interactive Coq proofs. CFML proofs establish the full functional correctness of the code with respect to a specification. They may also be used to formally establish bounds on the asymptotic complexity of the code. The tool is made of two parts: on the one hand, a characteristic formula generator implemented as an OCaml program that parses OCaml code and produces Coq formulae, and, on the other hand, a Coq library that provides notations and tactics for manipulating characteristic formulae interactively in Coq.</p>
      <simplelist>
        <li id="uid63">
          <p noindent="true">Participants: Arthur Charguéraud, Armaël Guéneau and François Pottier</p>
        </li>
        <li id="uid64">
          <p noindent="true">Contact: Arthur Charguéraud</p>
        </li>
        <li id="uid65">
          <p noindent="true">URL: <ref xlink:href="http://www.chargueraud.org/softs/cfml/" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>www.<allowbreak/>chargueraud.<allowbreak/>org/<allowbreak/>softs/<allowbreak/>cfml/</ref></p>
        </li>
      </simplelist>
    </subsection>
    <subsection id="uid66" level="1">
      <bodyTitle>ldrgen</bodyTitle>
      <p>
        <i>Liveness-driven random C code generator</i>
      </p>
      <p noindent="true"><span class="smallcap" align="left">Keywords:</span> Code generation - Randomized algorithms - Static program analysis</p>
      <p noindent="true"><span class="smallcap" align="left">Functional Description:</span> The ldrgen program is a generator of C code: On every call it generates a new random C function and prints it to the standard output. The generator is "liveness-driven", which means that it tries to avoid generating dead code: All the computations it generates are (in a certain, limited sense) actually used to compute the function's return value. This is achieved by generating the program backwards, in combination with a simultaneous liveness analysis that guides the random generator's choices.</p>
      <simplelist>
        <li id="uid67">
          <p noindent="true">Participant: Gergö Barany</p>
        </li>
        <li id="uid68">
          <p noindent="true">Contact: Gergö Barany</p>
        </li>
        <li id="uid69">
          <p noindent="true">Publication: <ref xlink:href="https://hal.inria.fr/hal-01658563" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Liveness-Driven Random Program Generation</ref></p>
        </li>
        <li id="uid70">
          <p noindent="true">URL: <ref xlink:href="https://github.com/gergo-/ldrgen" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>github.<allowbreak/>com/<allowbreak/>gergo-/<allowbreak/>ldrgen</ref></p>
        </li>
      </simplelist>
    </subsection>
  </logiciels>
  <resultats id="uid71">
    <bodyTitle>New Results</bodyTitle>
    <subsection id="uid72" level="1">
      <bodyTitle>Formal verification of compilers and static analyzers</bodyTitle>
      <subsection id="uid73" level="2">
        <bodyTitle>The CompCert formally-verified compiler</bodyTitle>
        <participants>
          <person key="gallium-2014-idm29528">
            <firstname>Xavier</firstname>
            <lastname>Leroy</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Daniel</firstname>
            <lastname>Kästner</lastname>
            <moreinfo>AbsInt GmbH</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Michael</firstname>
            <lastname>Schmidt</lastname>
            <moreinfo>AbsInt GmbH</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Bernhard</firstname>
            <lastname>Schommer</lastname>
            <moreinfo>AbsInt GmbH</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Prashanth</firstname>
            <lastname>Mundkur</lastname>
            <moreinfo>SRI International</moreinfo>
          </person>
          <p>.</p>
        </participants>
        <p>In the context of our work on compiler verification (see
section <ref xlink:href="#uid15" location="intern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>), since 2005 we have been developing and
formally verifying a moderately-optimizing compiler for a large subset
of the C programming language, generating assembly code for the
ARM, PowerPC, RISC-V and x86 architectures <ref xlink:href="#gallium-2017-bid9" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.
This compiler comprises a back-end part, translating the Cminor
intermediate language to PowerPC assembly and reusable for source
languages other than C <ref xlink:href="#gallium-2017-bid10" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>, and a
front-end translating the CompCert C subset of C to Cminor.
The compiler is mostly written within the specification language of
the Coq proof assistant, from which Coq's extraction facility
generates executable OCaml code. The compiler comes with a 100000-line,
machine-checked Coq proof of semantic preservation establishing that
the generated assembly code executes exactly as prescribed by the
semantics of the source C program.</p>
        <p>This year, we improved the CompCert C compiler in several directions:</p>
        <simplelist>
          <li id="uid74">
            <p noindent="true">The support for 64-bit target processors that was initiated last
year was improved and released as part of version 3.0 of CompCert.
CompCert has been supporting 64-bit integer arithmetic since 2013.
However, pointers and memory addresses were still assumed to be
32 bits wide. CompCert 3.0 lifts this restriction by parameterizing
the compiler over the bit width of memory addresses. This required
extensive changes throughout the back-end compiler passes and their
correctness proofs.</p>
          </li>
          <li id="uid75">
            <p noindent="true">The x86 code generator, initially 32-bit only, was extended to
handle 64-bit x86 as well. This is the first instantiation of the
generic support for 64-bit target architectures mentioned above.
This extension greatly improves the usability and performance
of CompCert on servers and PCs, where x86 64-bit is the dominant
architecture.</p>
          </li>
          <li id="uid76">
            <p noindent="true">Support for the RISC-V processor architecture was added to
CompCert. Prashanth Mundkur contributed a prototype port targeting
32-bit RISC-V. Xavier Leroy extended this port to target 64-bit
RISC-V as well and to integrate it in CompCert 3.1. While not
commercially available yet, the RISC-V architecture is used in many
academic verification projects.</p>
          </li>
          <li id="uid77">
            <p noindent="true">Several minor optimizations were added to address inefficiencies
observed in AbsInt's customer code. The most notable one is the
optimization of leaf functions to avoid return address reloads.</p>
          </li>
          <li id="uid78">
            <p noindent="true">Error and warning messages were improved and made more like
those of GCC and Clang. Command-line flags were added to control
which warning to emit and which warnings to treat as fatal errors.</p>
          </li>
        </simplelist>
        <p>We released version 3.0 of CompCert in February 2017 incorporating
support for 64-bit architectures, and version 3.1 in August 2017
incorporating the other enhancements listed above.</p>
        <p>Two papers describing industrial uses of CompCert for critical
software were written, with Daniel Kästner from AbsInt as lead author.
The first paper <ref xlink:href="#gallium-2017-bid11" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/> was presented at the 2017
symposium of the British Safety-Critical Systems Club. The second
paper <ref xlink:href="#gallium-2017-bid12" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/> will be presented in January 2018 at
the ERTS congress. It describes the use of CompCert to compile
software for nuclear power plant equipment developed by MTU
Friedrichshafen, and the required certification of CompCert
according to the IEC 60880 regulations for the nuclear industry.</p>
      </subsection>
      <subsection id="uid79" level="2">
        <bodyTitle>A verified model of register aliasing in CompCert</bodyTitle>
        <participants>
          <person key="gallium-2017-idp146592">
            <firstname>Gergö</firstname>
            <lastname>Barany</lastname>
          </person>
          <person key="gallium-2014-idm29528">
            <firstname>Xavier</firstname>
            <lastname>Leroy</lastname>
          </person>
        </participants>
        <p>In the setting of the ASSUME ITEA3 project, Gergö Barany and Xavier Leroy are
working on implementing a CompCert back-end for the Kalray MPPA processor
architecture. This architecture features pervasive register aliasing: each of
its 64-bit registers can also be accessed as two separate 32-bit halves. The
ARM architecture's floating-point register file is similarly aliased.
Modifying a superregister invalidates the data stored in subregisters and vice
versa; this behavior was not yet modeled in CompCert's semantics.</p>
        <p>Integrating subregister aliasing in CompCert involved re-engineering much of
its semantic model of the register file and of the call stack. Rather than
simple mappings of locations to values, the register file and the stack are
now modeled more realistically as blocks of memory containing bytes that
represent fragments of values. In this way, we can verify a semantic model in
which a 64-bit register or stack slot may contain either a single 64-bit value
or a pair of two unrelated 32-bit values. This ongoing work is nearing
completion.</p>
      </subsection>
      <subsection id="uid80" level="2">
        <bodyTitle>Random program generation for compiler testing</bodyTitle>
        <participants>
          <person key="gallium-2017-idp146592">
            <firstname>Gergö</firstname>
            <lastname>Barany</lastname>
          </person>
        </participants>
        <p>Randomized testing is a powerful tool for finding bugs in compilers. In a
project aimed at finding missed compiler optimizations, Gergö Barany wanted to
use such random testing techniques, but found that the standard random C
program generator, Csmith, generates very large amounts of dead code. This is
code whose results are never used and that can therefore be removed by the
compiler.</p>
        <p>The presence of large amounts of dead code prevents testing optimizations:
almost all of the code is trivially removed by compilers' dead code
elimination passes. Gergö resolved this problem by designing a new approach to
random program generation. The new generator generates code backwards and
performs a simultaneous liveness analysis of the program to rule out the
generation of dead code. Its practical evaluation shows that it is much more
efficient than Csmith at generating programs that compile to large amounts of
machine code with a much more varied instruction mix than Csmith-generated
code. In addition, the new generator is much faster than Csmith, because it is
designed to work in a single, linear pass, without generating invalid states
that cause backtracking. This work resulted in the development of the
<tt>ldrgen</tt> tool, and was presented at LOPSTR
2017 <ref xlink:href="#gallium-2017-bid13" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.</p>
      </subsection>
      <subsection id="uid81" level="2">
        <bodyTitle>Testing compiler optimizations</bodyTitle>
        <participants>
          <person key="gallium-2017-idp146592">
            <firstname>Gergö</firstname>
            <lastname>Barany</lastname>
          </person>
        </participants>
        <p>Compilers should be correct, but they should ideally also generate machine
code that is as efficient as possible. Gergö Barany started work on adapting
compiler correctness testing techniques for testing the quality of the
generated code.</p>
        <p>In a differential testing approach, one generates random C programs, compiles
them with different compilers, then compares the generated code. The
comparison is done by a custom binary analysis tool that Gergö developed for
this purpose. This tool assigns scores to programs according to various
criteria such as the number of instructions, the number of reads from the
stack (for comparing the quality of register spilling), or the numbers of
various other classes of instructions affected by optimizations of interest.
New criteria can be added using a simple plug-in system. If the binaries
generated by different compilers are assigned different scores, the input
program is considered interesting, and it is reduced to a minimal test case
using an off-the-shelf program reducer (C-Reduce).</p>
        <p>This automated process often results in small, simple examples of missed
optimizations: optimizations that compilers should be able to perform, but
that they failed to apply for various reasons. Gergö found previously
unreported missing arithmetic optimizations, as well as individual cases of
unnecessary register spilling, missed opportunities for register coalescing,
dead stores, redundant computations, and missing instruction selection
patterns. Several of these missed optimization issues were reported and fixed
in the GCC, Clang, and CompCert compilers. An article describing this work is
currently under review, and work is in progress on other binary analysis
techniques that can find further missed optimizations.</p>
      </subsection>
      <subsection id="uid82" level="2">
        <bodyTitle>Towards a verified compilation stack for concurrent programs</bodyTitle>
        <participants>
          <person key="focus-2014-idp101040">
            <firstname>Jean-Marie</firstname>
            <lastname>Madiot</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Andrew</firstname>
            <lastname>Appel</lastname>
            <moreinfo>Princeton University</moreinfo>
          </person>
        </participants>
        <p>The verified compiler CompCert compiles programs from C to assembly while
preserving their semantics, thus allowing formal reasoning on source programs,
which is much more tractable than reasoning on assembly code. It is however
limited to sequential programs, running as one thread on one processor.
Jean-Marie Madiot is working to extend CompCert to shared-memory concurrency
<i>and</i> to provide users with techniques to reason and prove properties
about concurrent programs.</p>
        <p>Concurrent Separation Logic is used to reason about source programs and prove
their correctness with respect to a “concurrent permission machine”. The
programs are compiled by a concurrency-aware version of CompCert. As of 2017,
this has been done for the x86 architecture only.</p>
        <p>This project is a continuation of a collaboration with Andrew Appel's team at
Princeton University. Appel's team has been working for several years on the
“Verified Software Toolchain” project, which provides users with tools to
establish properties of sequential programs. Jean-Marie Madiot has been
extending the program logic to shared-memory concurrency and developing a new
proof of concurrent separation logic that is both formalised and usable in
this setting. A paper has been submitted and rejected and is being improved.</p>
        <p>Jean-Marie Madiot is now also working on a more general adaptation of CompCert
to the reasoning principles of concurrency, and started a collaboration to
adapt it to architectures other than x86 (see Section <ref xlink:href="#uid90" location="intern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>).</p>
      </subsection>
      <subsection id="uid83" level="2">
        <bodyTitle>Verified compilation of Lustre</bodyTitle>
        <participants>
          <person key="gallium-2014-idm29528">
            <firstname>Xavier</firstname>
            <lastname>Leroy</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Timothy</firstname>
            <lastname>Bourke</lastname>
            <moreinfo>team Parkas</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Lélio</firstname>
            <lastname>Brun</lastname>
            <moreinfo>team Parkas</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Pierre-Évariste</firstname>
            <lastname>Dagand</lastname>
            <moreinfo>team Whisper</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Marc</firstname>
            <lastname>Pouzet</lastname>
            <moreinfo>team Parkas</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Lionel</firstname>
            <lastname>Rieg</lastname>
            <moreinfo>Yale University</moreinfo>
          </person>
        </participants>
        <p>The Velus project of team Parkas develops a compiler for the Lustre
reactive language that generates CompCert Clight intermediate code and
is proved correct using the Coq proof assistant. A paper describing
the Velus compiler and its verification was presented at the conference
PLDI 2017 <ref xlink:href="#gallium-2017-bid14" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>. Xavier Leroy contributed
to the verification of the final pass of Velus, the one that
translates from the Obc object-oriented intermediate language of
Velus to the Clight C-like, early intermediate language of CompCert.
The correctness proof of this pass captures the shape of memory states
during execution using formulas from separation logic. The
separation logic assertions for CompCert memory states used in this
proof come from a library that Xavier Leroy developed last year to
help revise the proof of the “stacking” pass of CompCert, and that
Timothy Bourke and Xavier Leroy later extended with a “magic wand”
operator.</p>
      </subsection>
    </subsection>
    <subsection id="uid84" level="1">
      <bodyTitle>Language design and type systems</bodyTitle>
      <subsection id="uid85" level="2">
        <bodyTitle>Refactoring with ornaments in ML</bodyTitle>
        <participants>
          <person key="gallium-2014-idp85776">
            <firstname>Thomas</firstname>
            <lastname>Williams</lastname>
          </person>
          <person key="gallium-2014-idp70256">
            <firstname>Didier</firstname>
            <lastname>Rémy</lastname>
          </person>
        </participants>
        <p>Thomas Williams and Didier Rémy continued working on ornaments for program
refactoring and program transformation in ML. Ornaments have been introduced
as a way of describing changes in data type definitions that preserve the
recursive structure but can reorganize, add, or drop pieces of data. After a
new data structure has been described as an ornament of an older one, the
functions that operate on the bare structure can be partially or sometimes
totally lifted into functions that operate on the ornamented structure.</p>
        <p>This year, Williams and Rémy continued working on the description of the
lifting algorithm: using ornament inference, an ML program is first elaborated
into a generic program, which can be seen as a template for all possible
liftings of the original program. The generic program is defined in a superset
of ML. It can then be instantiated with specific ornaments, and simplified
back into an ML program. Williams and Rémy studied the semantics of this
intermediate language and used it to prove the correctness of the lifting,
using logical relations techniques. A paper has been accepted for presentation
at POPL 2018 <ref xlink:href="#gallium-2017-bid15" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>. A research report gives more
technical details <ref xlink:href="#gallium-2017-bid16" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.</p>
        <p>On the practical side, several families of case studies have been explored,
including refactoring and code specialization, as so as to make certain
existing invariants apparent, or so as to use more efficient data structures.
We improved the user interface of the prototype implementation so as to make
it easier to write useful examples. We are currently developing a new version
of the prototype that will handle most of the OCaml language.</p>
      </subsection>
    </subsection>
    <subsection id="uid86" level="1">
      <bodyTitle>Shared-memory parallelism</bodyTitle>
      <subsection id="uid87" level="2">
        <bodyTitle>The Linux Kernel Memory Model</bodyTitle>
        <participants>
          <person key="gallium-2014-idp66296">
            <firstname>Luc</firstname>
            <lastname>Maranget</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Jade</firstname>
            <lastname>Alglave</lastname>
            <moreinfo>University College London–Microsoft Research, UK</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Paul</firstname>
            <lastname>Mckenney</lastname>
            <moreinfo>IBM Corporation</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Andrea</firstname>
            <lastname>Parri</lastname>
            <moreinfo>Sant'Anna School of Advanced Studies, PISA, Italy</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Alan</firstname>
            <lastname>Stern</lastname>
            <moreinfo>Harvard University</moreinfo>
          </person>
        </participants>
        <p>Modern multi-core and multi-processor computers do not follow the intuitive
“Sequential Consistency” model that would define a concurrent execution as
the interleaving of the executions of its constituent threads and that would
command instantaneous writes to the shared memory. This situation is due both
to in-core optimizations such as speculative and out-of-order execution of
instructions, and to the presence of sophisticated (and cooperating) caching
devices between processors and memory. Luc Maranget is taking part in an
international research effort to define the semantics of the computers of the
multi-core era, and more generally of shared-memory parallel devices or
languages, with a clear initial focus on devices.</p>
        <p>This year saw progress as regards languages. To wit, a two-year effort to
define a weak memory model for the Linux Kernel has yielded an article in the
<i>Linux Weekly News</i> online technical
magazine <ref xlink:href="#gallium-2017-bid17" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>, and a scholarly paper accepted for
publication at the <i>Architectural Support for Programming Languages and
Operating Systems</i> (ASPLOS) conference in March 2018.
While targeting different audiences, both articles describe a formal model
that defines how Linux programs are supposed to behave. The model is of course
a <span class="smallcap" align="left">cat</span> model, hence is understood by the <b>herd</b> simulator
(Section <ref xlink:href="#uid89" location="intern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>) that allows programmers to experiment and develop an
intuition. The model has been tested against hardware and refined in
consultation with maintainers. Finally, the ASPLOS article formalizes the
<i>fundamental law of the Read-Copy-Update synchronization mechanism</i>, and
proves that one of its implementations satisfies this law.</p>
        <p>For the record, Luc Maranget also co-authored a paper that has been presented
at POPL 2017 <ref xlink:href="#gallium-2017-bid18" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>. This work, which we described last
year, is joint work with many researchers, including S. Flur and other members
of P. Sewell's team (University of Cambridge) as well as M. Batty (University
of Kent). Moreover, Luc Maranget still interacts with the Cambridge team,
mostly by providing tests and performing comparisons between his axiomatic
models and the operational models developed by this team.</p>
      </subsection>
      <subsection id="uid88" level="2">
        <bodyTitle>ARMv8 and RISC-V memory models</bodyTitle>
        <participants>
          <person key="PASUSERID">
            <firstname>Will</firstname>
            <lastname>Deacon</lastname>
            <moreinfo>ARM Ltd</moreinfo>
          </person>
          <person key="gallium-2014-idp66296">
            <firstname>Luc</firstname>
            <lastname>Maranget</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Jade</firstname>
            <lastname>Alglave</lastname>
            <moreinfo>University College London–Microsoft Research, UK</moreinfo>
          </person>
        </participants>
        <p>Jade Alglave and Luc Maranget helped Will Deacon, an engineer at ARM Ltd., who
developed a model for the ARMv8 64-bit processor. Will wrote a <span class="smallcap" align="left">cat</span>
model, which ARM uses internally as a specification. (<span class="smallcap" align="left">cat</span> is the
domain-specific language for describing memory models and is understood by the
<b>herd</b> simulator; see Section <ref xlink:href="#uid89" location="intern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.) ARM's official documentation
presents a natural language transliteration of the <span class="smallcap" align="left">cat</span> model.</p>
        <p>Luc Maranget also joined the RISC-V consortium (<ref xlink:href="https://riscv.org/" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>riscv.<allowbreak/>org/</ref>)
as an individual and as a member of the memory model group. He takes part in
the development of the memory model of this open architecture, mostly by
writing <span class="smallcap" align="left">cat</span> models and reviewing tests that will be part of the
documentation. A <span class="smallcap" align="left">cat</span> model will be part of the next version (V2.3) of
the User-Level ISA Specification.</p>
      </subsection>
      <subsection id="uid89" level="2">
        <bodyTitle>Improvements to the <b>diy</b> tool suite</bodyTitle>
        <participants>
          <person key="gallium-2014-idp66296">
            <firstname>Luc</firstname>
            <lastname>Maranget</lastname>
            <moreinfo>
              <b>contact</b>
            </moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Jade</firstname>
            <lastname>Alglave</lastname>
            <moreinfo>University College London–Microsoft Research, UK</moreinfo>
          </person>
        </participants>
        <p>The <b>diy</b> suite (for “Do It Yourself”) provides a set of tools for
testing shared memory models: the litmus tool for running tests on hardware,
various generators for producing tests from concise specifications, and
<b>herd</b>, a memory model simulator. Tests are small programs written in
x86, Power, ARM, generic (LISA) assembler, or a subset of the C language that
can thus be generated from concise specifications, run on hardware, or
simulated on top of memory models. Test results can be handled and compared
using additional tools.</p>
        <p>This year's new features are a model for the Linux Kernel developed as a
collaborative effort (see Section <ref xlink:href="#uid87" location="intern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>) and an ongoing RISC-V model
transliterated by Luc Maranget from the model elaborated by the RISC-V
committee which Luc Maranget joined this year (see Section <ref xlink:href="#uid88" location="intern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>).
Those new models were made possible due to significant extensions of
<b>diy</b>, such as a new tool chain for RISC-V and the extension of the
macro system so as to handle most of the memory-model-related macros used by
Linux kernel developers.</p>
      </subsection>
      <subsection id="uid90" level="2">
        <bodyTitle>Towards formal software verification with respect to weak memory models</bodyTitle>
        <participants>
          <person key="focus-2014-idp101040">
            <firstname>Jean-Marie</firstname>
            <lastname>Madiot</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Jade</firstname>
            <lastname>Alglave</lastname>
            <moreinfo>University College London &amp; Microsoft Research Cambridge</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Simon</firstname>
            <lastname>Castellan</lastname>
            <moreinfo>Imperial College London</moreinfo>
          </person>
        </participants>
        <p>Past research efforts on weak memory models have provided both academia and
industry with very efficient tools to precisely describe memory models and to
carefully test them on a wide variety of architectures. While these models
give us a good understanding of complex <i>hardware</i> behaviors, exploiting
them to formally guarantee the good behavior of <i>software</i> remains
practically out of reach.</p>
        <p>A difficulty is that weak memory models are described in terms of properties
of graphs of execution candidates. Because graphs are far from the usual way
of defining programming language semantics, because execution candidates are
not defined formally, and because existing proofs of “data-race freedom”
(DRF) theorems are hard to fathom and formally imprecise, there is a strong
demand in the programming language community for a formal account of weak
memory models.</p>
        <p>In 2017, Jean-Marie Madiot started a collaboration with weak memory model
expert Jade Alglave and concurrent game semantics researcher Simon Castellan
to tackle these problems. The idea is to have a formal description, using
partial-order techniques similar to the ones used in game semantics, of
execution candidates. On the other side, a given model of shared memory is
then described in terms of partial orders, and the composition of those
partial orders provides the final possible executions of a given program in a
given architecture. This should yield a formal semantics for programs in a
weak memory setting, and should allow proving a DRF theorem so as to connect
this semantics to more standard sequentially consistent semantics. A success
in this direction would finally allow tractable verification of concurrent
programs, particularly in combination with Madiot's ongoing work on a
generalization to concurrency of the CompCert certified compiler (see
Section <ref xlink:href="#uid82" location="intern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>).</p>
      </subsection>
      <subsection id="uid91" level="2">
        <bodyTitle>Granularity control for parallel programs</bodyTitle>
        <participants>
          <person key="gallium-2014-idm28256">
            <firstname>Umut</firstname>
            <lastname>Acar</lastname>
          </person>
          <person key="gallium-2015-idp72464">
            <firstname>Vitaly</firstname>
            <lastname>Aksenov</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Arthur</firstname>
            <lastname>Charguéraud</lastname>
          </person>
          <person key="parkas-2014-idp142896">
            <firstname>Adrien</firstname>
            <lastname>Guatto</lastname>
          </person>
          <person key="gallium-2016-idp126752">
            <firstname>Mike</firstname>
            <lastname>Rainey</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Filip</firstname>
            <lastname>Sieczkowski</lastname>
          </person>
        </participants>
        <p>The DeepSea team focused this year on the development of
techniques for controlling granularity in parallel programs.
Granularity control is an essential problem because creating
too many tasks may induce overwhelming overheads, while creating
too few tasks may harm the ability to process tasks in parallel.
Granularity control turns out to be especially challenging for
nested parallel programs, i.e., programs in which parallel constructs
such as fork-join or parallel-loops can be arbitrarily nested.
Two different approaches were investigated.</p>
        <p>The first approach is based on the use of asymptotic complexity functions
provided by the programmer, combined with runtime measurements
to estimate the constant factors that apply.
Combining these two sources of information allows to predict
with reasonable accuracy the execution time of tasks. Such
predictions may be used to guide the generation of tasks, by
sequentializing computations of sufficiently-small size.
An analysis is developed, establishing that task creation overheads
are indeed bounded to a small fraction of the total runtime.
These results builds upon prior work by the same authors
<ref xlink:href="#gallium-2017-bid19" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>, extending it with a carefully-designed
algorithm for ensuring convergence of the estimation of the
constant factors deduced from the measures, even in the face of
noise and cache effects, which are taken into account in the analysis.
The approach is demonstrated on a range of benchmarks taken from
the state-of-the-art PBBS benchmark suite.
A paper describing the results is under preparation.</p>
        <p>The second approach is based on an instrumentation of the
runtime system. The idea is to process parallel function calls
just like normal function calls, by pushing a frame on the
stack, and only subsequently promoting these frames as threads
that might get scheduled on other cores. The promotion of
frames takes place at regular time intervals,
which is why we named this approach
<i>heartbeat scheduling</i>.
Unlike prior approaches such as <i>lazy scheduling</i>,
in which promotion is guided by the workload of the system,
heartbeat scheduling can be proved to induce only small
scheduling overheads, and to not asymptotically reduce the amount
of parallelism inherent in the program.
The theory behind the approach is formalized in Coq. It is also
implemented through instrumented C++ programs, and evaluated on
PBBS benchmarks.
A paper describing this approach was submitted
to an international conference.</p>
      </subsection>
      <subsection id="uid92" level="2">
        <bodyTitle>Non-zero indicators: a provably-efficient, concurrent data structure</bodyTitle>
        <participants>
          <person key="gallium-2014-idm28256">
            <firstname>Umut</firstname>
            <lastname>Acar</lastname>
          </person>
          <person key="gallium-2016-idp126752">
            <firstname>Mike</firstname>
            <lastname>Rainey</lastname>
          </person>
        </participants>
        <p>This work, conducted in collaboration with Naama Ben David
from Carnegie Mellon University,
investigates the design and analysis of an implementation
of a concurrent data structure called <i>non-zero indicator</i>.
This data structure plays a crucial role in the scheduling
of nested parallel programs: it is used to handle dependency
resolution among parallel tasks.
Concretely, a non-zero indicator is initialized with value 1,
and it supports the following two concurrent operations, which
may be invoked by threads that have knowledge that the counter
is non-zero: (1) atomically increase the counter by one unit,
and (2) atomically decrease the counter by one unit, and detect whether
the counter reaches zero.
While a trivial implementation can be set up using an atomic operation
on a shared memory cell (e.g., fetch-and-add), the key challenge is to
design a non-zero indicator that scales well to hundreds if not
thousands of threads, without suffering from contention.</p>
        <p>Prior work leverages dynamic tree data structures to tame contention  <ref xlink:href="#gallium-2017-bid20" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.
Yet, such prior work, as well as most concurrent data structures in general,
are analyzed empirically, omitting asymptotic bounds on their efficiency.
In this work, we propose a new variant of a tree-based non-zero indicator
implementation, for which we are able to present a formal analysis establishing
bounds on the worst-case contention of concurrent updates.
Our analysis is the first to achieve relevant bounds of this kind.
Furthermore, we demonstrate in practice that our proposal improves
scalability, compared with a naive fetch-and-add atomic counter,
and also compared with the original tree-based data structure.
Our work was presented at PPoPP <ref xlink:href="#gallium-2017-bid21" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.</p>
      </subsection>
      <subsection id="uid93" level="2">
        <bodyTitle>Efficient sequence data structures for ML</bodyTitle>
        <participants>
          <person key="PASUSERID">
            <firstname>Arthur</firstname>
            <lastname>Charguéraud</lastname>
          </person>
          <person key="gallium-2016-idp126752">
            <firstname>Mike</firstname>
            <lastname>Rainey</lastname>
          </person>
        </participants>
        <p>The use of sequence containers, including stacks, queues, and double-ended
queues, is ubiquitous in programming. When the maximal number of elements to
be stored is not known in advance, containers need to grow dynamically. For
this purpose, most ML programs rely on either lists or vectors. These data
structures are inefficient, both in terms of time and space usage. In this
work, we investigate the use of data structures based on <i>chunks</i>,
adapting ideas from some of our prior work implemented in C++
<ref xlink:href="#gallium-2017-bid22" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>. Each chunk stores items in a fixed-capacity array. All
chunks are linked together to represent the full sequence. These chunk-based
structures save a lot of memory and generally deliver better performance than
classic container data structures for long sequences. We measured a 2x speedup
compared with vectors, and up to a 3x speedup compared with long lists. This
work was presented at the ML Family Workshop <ref xlink:href="#gallium-2017-bid23" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.
Generalization of this work to double-ended sequences and to persistent
sequences is under progress.</p>
      </subsection>
      <subsection id="uid94" level="2">
        <bodyTitle>A parallel algorithm for the dynamic trees problem</bodyTitle>
        <participants>
          <person key="gallium-2014-idm28256">
            <firstname>Umut</firstname>
            <lastname>Acar</lastname>
          </person>
          <person key="gallium-2015-idp72464">
            <firstname>Vitaly</firstname>
            <lastname>Aksenov</lastname>
          </person>
          <p>.</p>
        </participants>
        <p>Dynamic algorithms are used to compute a property of some data while the data
undergoes changes over time. Many dynamic algorithms have been proposed, but
nearly all of them are sequential.</p>
        <p>In collaboration with Sam Westrick (Carnegie Mellon University), Umut Acar and
Vitaly Aksenov investigated the design of an efficient parallel dynamic tree
data structure. This data structure supports four operations, namely insertion
and deletion of vertices and edges; these operations can be executed in
parallel.
The proposed data structure is work-efficient and highly parallel.
A preliminary version of this work was presented in a brief announcement
at SPAA 2017 <ref xlink:href="#gallium-2017-bid24" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.</p>
      </subsection>
      <subsection id="uid95" level="2">
        <bodyTitle>A concurrency-optimal binary search tree</bodyTitle>
        <participants>
          <person key="gallium-2015-idp72464">
            <firstname>Vitaly</firstname>
            <lastname>Aksenov</lastname>
          </person>
        </participants>
        <p>In joint work with Vincent Gramoli (IT School of Information Technologies, Sydney),
Petr Kuznetsov (Telecom ParisTech), Anna Malova (Washington University in St Louis),
and Srivatsan Ravi (Purdue University),
Vitaly Aksenov proposed a concurrency-optimal implementation of binary search
trees. Concurrency-optimality means that the data structure allows all
interleavings of the underlying sequential implementation, except those that
would violate linearizability. Aksenov and co-authors show that none of the
state-of-the-art concurrent binary search trees are concurrency-optimal, and
they experimentally verify that the new concurrency-optimal binary search tree
is competitive with known implementations. This work was presented at Euro-Par 2017
<ref xlink:href="#gallium-2017-bid25" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.</p>
      </subsection>
    </subsection>
    <subsection id="uid96" level="1">
      <bodyTitle>The OCaml language and system</bodyTitle>
      <subsection id="uid97" level="2">
        <bodyTitle>The OCaml system</bodyTitle>
        <participants>
          <person key="gallium-2014-idm26976">
            <firstname>Damien</firstname>
            <lastname>Doligez</lastname>
          </person>
          <person key="gallium-2014-idm29528">
            <firstname>Xavier</firstname>
            <lastname>Leroy</lastname>
          </person>
          <person key="gallium-2014-idp66296">
            <firstname>Luc</firstname>
            <lastname>Maranget</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>David</firstname>
            <lastname>Allsop</lastname>
            <moreinfo>Cambridge University</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Florian</firstname>
            <lastname>Angeletti</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Alain</firstname>
            <lastname>Frisch</lastname>
            <moreinfo>Lexifi</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Jacques</firstname>
            <lastname>Garrigue</lastname>
            <moreinfo>University of Nagoya</moreinfo>
          </person>
          <person key="gallium-2016-idp132096">
            <firstname>Sébastien</firstname>
            <lastname>Hinderer</lastname>
            <moreinfo>SED</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Nicolás</firstname>
            <lastname>Ojeda Bär</lastname>
            <moreinfo>Lexifi</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Thomas</firstname>
            <lastname>Refis</lastname>
            <moreinfo>Jane Street</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Gabriel</firstname>
            <lastname>Scherer</lastname>
            <moreinfo>team Parsifal</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Mark</firstname>
            <lastname>Shinwell</lastname>
            <moreinfo>Jane Street</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Leo</firstname>
            <lastname>White</lastname>
            <moreinfo>Jane Street</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Jeremy</firstname>
            <lastname>Yallop</lastname>
            <moreinfo>Cambridge University</moreinfo>
          </person>
        </participants>
        <p>This year, we released four versions of the OCaml system: versions
4.04.1 and 4.04.2 are minor releases that fix about 16 issues;
versions 4.05.0 and 4.06.0 are major releases that introduce some
new features, many improvements in usability and performance, and fix
about 100 issues. The most important new features are:</p>
        <simplelist>
          <li id="uid98">
            <p noindent="true">Character strings are now immutable (read-only) by default.
This completes the evolution of OCaml towards immutable strings
that started in 2014 with the introduction of a compile-time option
to separate text-like read-only strings from array-like read-write
byte sequences. This option is now the default, making OCaml
programs safer and clearer.</p>
          </li>
          <li id="uid99">
            <p noindent="true">Extensions of the “destructive substitution” operator over
module signatures (<i>sig</i> <tt>with type t := </tt>...)
to make it more general and more widely usable.</p>
          </li>
          <li id="uid100">
            <p noindent="true">Support for the UTF8 encoding of Unicode characters in strings
was improved with the introduction of an escape <tt>\u{XXXX}</tt> in
string literals, and more importantly with a complete overhaul of
the OCaml interface for Windows system calls that make them
compatible with UTF8-encoded Unicode.</p>
          </li>
          <li id="uid101">
            <p noindent="true">An alternate register allocator based on linear scan was added
and can be selected to reduce compilation times.</p>
          </li>
        </simplelist>
        <p>On the organization side, we switched to a deadline-based release
cycle whereby a major release occurs at a set date with the features
that are ready by that date, instead of waiting for a set of new
features to be ready. Releases 4.05.0 and 4.06.0 were produced in
this manner at 6-months intervals. Damien Doligez and Gabriel Scherer
served as release managers.</p>
        <p>Sébastien Hinderer worked on integrating <tt>ocamltest</tt>, the compiler's
test driver he developed last year, in the 4.06 release of OCaml. He migrated
a large part of the test suite from the former Makefile-based infrastructure
to <tt>ocamltest</tt>. He also started to rewrite OCaml's build system so that
the compiler can be built in parallel as much as its dependencies allow.</p>
        <p>We have improved our Continuous Integration infrastructure by taking advantage
of Jenkins features such as configuration matrices, adding five new
architectures (ARM-64, Fedora, FreeBSD, PPC64-LE, Ubuntu), and upgrading to
the latest version of MacOS. Our testing is now done on all of the major
architectures that are officially supported by OCaml.</p>
      </subsection>
      <subsection id="uid102" level="2">
        <bodyTitle>Type-checking the OCaml intermediate languages</bodyTitle>
        <participants>
          <person key="PASUSERID">
            <firstname>Pierrick</firstname>
            <lastname>Couderc</lastname>
            <moreinfo>ENSTA-ParisTech &amp; OCamlPro</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Grégoire</firstname>
            <lastname>Henry</lastname>
            <moreinfo>OCamlPro</moreinfo>
          </person>
          <person key="gallium-2014-idm25696">
            <firstname>Fabrice</firstname>
            <lastname>Le Fessant</lastname>
          </person>
          <person key="gallium-2016-idp121360">
            <firstname>Michel</firstname>
            <lastname>Mauny</lastname>
          </person>
          <p>.</p>
        </participants>
        <p>This work aims at designing and implementing a consistency checker for the
type-annotated abstract syntax trees (TASTs) produced by the OCaml
compiler. When presented as inference rules, the different cases of
this TAST checker can be read as the rules of the OCaml type
system. Proving the correctness of (part of) the checker would prove
the soundness of the corresponding part of the OCaml type system. A
preliminary report on this work has been presented at the 17th
Symposium on Trends in Functional Programming (TFP 2016).</p>
        <p>In 2017, Pierrick Couderc formalized the consistency checker, and
wrote a Coq proof of its correctness. The dissertation is being
written, and Pierrick's Ph.D. defense should take place at the beginning of
2018.</p>
      </subsection>
      <subsection id="uid103" level="2">
        <bodyTitle>Optimizing OCaml for satisfiability problems</bodyTitle>
        <participants>
          <person key="PASUSERID">
            <firstname>Sylvain</firstname>
            <lastname>Conchon</lastname>
            <moreinfo>LRI, Univ. Paris Sud</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Albin</firstname>
            <lastname>Coquereau</lastname>
            <moreinfo>ENSTA-ParisTech</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Mohamed</firstname>
            <lastname>Iguernelala</lastname>
            <moreinfo>OCamlPro</moreinfo>
          </person>
          <person key="gallium-2014-idm25696">
            <firstname>Fabrice</firstname>
            <lastname>Le Fessant</lastname>
          </person>
          <person key="gallium-2016-idp121360">
            <firstname>Michel</firstname>
            <lastname>Mauny</lastname>
          </person>
          <p>.</p>
        </participants>
        <p>This work aims at improving the performance of the Alt-Ergo SMT
solver, implemented in OCaml. For safety reasons and to ease
reasoning about its algorithms, the implementation of Alt-Ergo
uses as much as possible a functional programming style and
persistent data structures, which are sometimes less efficient
than imperative style and mutable data. Moreover, some efficient
algorithms, such as CDCL SAT solvers, are naturally expressed in
an imperative style.</p>
        <p>We therefore explored the replacement of Alt-Ergo's default,
functional, SAT solver by an imperative CDCL solver. In a first step,
we reimplemented a C++ version of miniSAT in OCaml. A comparison of
their respective performance showed that the OCaml version is slower
and has more cache misses.</p>
        <p>In a second step, we studied the use of the imperative miniSAT-like
SAT solver in Alt-Ergo. The integration is actually not immediate
because of the interaction between this solver and both the theories
and the quantifier instantiation engines of Alt-Ergo. In fact,
although the default (functional) SAT solver of Alt-Ergo is not as
effective as a CDCL solver for reasoning on pure Boolean problems, its
smart interaction with theories and instantation engines makes it
quite effective in the context of program verification.</p>
      </subsection>
      <subsection id="uid104" level="2">
        <bodyTitle>Type compatibility checking for dynamically-loaded OCaml data</bodyTitle>
        <participants>
          <person key="PASUSERID">
            <firstname>Florent</firstname>
            <lastname>Balestrieri</lastname>
            <moreinfo>ENSTA-ParisTech</moreinfo>
          </person>
          <person key="gallium-2016-idp121360">
            <firstname>Michel</firstname>
            <lastname>Mauny</lastname>
          </person>
          <p>.</p>
        </participants>
        <p>The SecureOCaml project (FUI 18) aims at enhancing the OCaml language
and environment in order to make it more suitable for building secure
applications, following the recommendations published by the French ANSSI
in 2013. Florent Balestrieri (ENSTA-ParisTech) represents
ENSTA-Paristech in this project for 2016 and 2017.</p>
        <p>The first year has been dedicated to designing and producing an effective
OCaml implementation that checks whether a memory graph – typically the
result obtained by unmarshalling some data – is compatible with a given OCaml
type, following the algorithm designed by Henry <i>et al.</i> in 2012. Because
the algorithm requires a runtime representation of OCaml types, Florent
Balestrieri implemented a library for generic programming in OCaml. This
library was presented at the OCaml Users and Developers Workshop in 2016
<ref xlink:href="#gallium-2017-bid26" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>; an extended version of this paper has
been submitted <ref xlink:href="#gallium-2017-bid27" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>. He also implemented a
type-checker which, when given a type and a memory graph, checks whether the
former could be the type of the latter. In 2017, Florent Balestrieri
implemented a prototype type-checker for OCaml bytecode.</p>
      </subsection>
      <subsection id="uid105" level="2">
        <bodyTitle>Visitors</bodyTitle>
        <participants>
          <person key="gallium-2014-idp67496">
            <firstname>François</firstname>
            <lastname>Pottier</lastname>
          </person>
        </participants>
        <p>Traversing and transforming abstract syntax trees that involve name binding is
notoriously difficult to do in a correct, concise, modular, customizable
manner. In 2017, François Pottier addressed this problem in the setting of
OCaml by proposing visitor classes as partial, composable descriptions of the
operations that one wishes to perform on abstract syntax trees. By combining
auto-generated visitor classes (which have no knowledge of binding) and
hand-written visitor classes (each of which knows about a specific binding
construct, a specific representation of names, and/or a specific operation on
abstract syntax trees), a wide range of operations can be defined. A syntax
extension for OCaml has been released under the name <tt>visitors</tt> and
this work has been presented at the conference ICFP
2017 <ref xlink:href="#gallium-2017-bid28" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.</p>
      </subsection>
      <subsection id="uid106" level="2">
        <bodyTitle>Improvements in Menhir</bodyTitle>
        <participants>
          <person key="gallium-2014-idp67496">
            <firstname>François</firstname>
            <lastname>Pottier</lastname>
          </person>
        </participants>
        <p>In 2017, François Pottier incorporated several improvements, proposed by
Frédéric Bour, to the Menhir parser generator. Many functions were added to
Menhir's incremental API, which (at runtime) allows inspecting and updating
the parser's state from the outside. A new library, <span class="smallcap" align="left">MenhirSdk</span>, was
introduced, which (at compile-time) allows inspecting the grammar and the
automaton constructed by Menhir. Together, these improvements allow new
features to be programmed outside of Menhir; the advanced error recovery mode
implemented in the Merlin IDE is an example.</p>
        <p>François Pottier also improved the termination test that takes place before
parameterized symbols are expanded away. The new test, it is hoped, should
reject the grammar if and only if expansion would not terminate. This improves
the expressive power of the grammar description language.</p>
      </subsection>
    </subsection>
    <subsection id="uid107" level="1">
      <bodyTitle>Software specification and verification</bodyTitle>
      <subsection id="uid108" level="2">
        <bodyTitle>Formal reasoning about asymptotic complexity</bodyTitle>
        <participants>
          <person key="gallium-2015-idp84952">
            <firstname>Armaël</firstname>
            <lastname>Guéneau</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Arthur</firstname>
            <lastname>Charguéraud</lastname>
          </person>
          <person key="gallium-2014-idp67496">
            <firstname>François</firstname>
            <lastname>Pottier</lastname>
          </person>
          <p>.</p>
        </participants>
        <p>For several years, Arthur Charguéraud and François Pottier have been
investigating the use of Separation Logic, extended with Time Credits, as an
approach to the formal verification of the time complexity of OCaml programs.
An extended version of their work on the UnionFind algorithm has appeared in
the <i>Journal of Automated Reasoning</i> <ref xlink:href="#gallium-2017-bid29" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.
In this work, the complexity bounds that are established involve explicit
constants: for instance, the complexity of <i>find</i> is <formula type="inline"><math xmlns="http://www.w3.org/1998/Math/MathML" overflow="scroll"><mrow><mn>2</mn><mi>α</mi><mo>(</mo><mi>n</mi><mo>)</mo><mo>+</mo><mn>4</mn></mrow></math></formula>.</p>
        <p>Armaël Guéneau, who is supervised by Arthur Charguéraud and François Pottier,
is working on relaxing this approach so as to use asymptotic bounds: e.g., the
advertised complexity of <i>find</i> should be <formula type="inline"><math xmlns="http://www.w3.org/1998/Math/MathML" overflow="scroll"><mrow><mi>O</mi><mo>(</mo><mi>α</mi><mo>(</mo><mi>n</mi><mo>)</mo><mo>)</mo></mrow></math></formula>. The challenge
is to give a formal account of the <formula type="inline"><math xmlns="http://www.w3.org/1998/Math/MathML" overflow="scroll"><mi>O</mi></math></formula> notation and of its properties and to
develop techniques that make asymptotic reasoning as convenient in Coq as it
seemingly is on paper.</p>
        <p>For that purpose, this year, Armaël Guéneau developed two Coq libraries. A
first library gives a formal definition of the <formula type="inline"><math xmlns="http://www.w3.org/1998/Math/MathML" overflow="scroll"><mi>O</mi></math></formula> notation, provides proofs
for many commonly used lemmas, as well as a number of tactics that automate
the application of these lemmas. A second library implements a simple yet very
useful mechanism, allowing the user to delay and collect proof obligations in
Coq scripts. Using these libraries, Armaël extended the CFML tool with support
for making asymptotic time complexity claims as part of specifications. He
developed tactics that perform (guided) inference and resolution of recursive
equations for the cost of recursive programs.</p>
        <p>Armaël evaluated this framework on several small-scale case studies, namely
simple algorithms such as binary search, selection sort, and the Bellman-Ford
algorithm. This work has been accepted for publication at the conference ESOP
2018.</p>
      </subsection>
      <subsection id="uid109" level="2">
        <bodyTitle>Revisiting the CPS transformation and its implementation</bodyTitle>
        <participants>
          <person key="gallium-2014-idp67496">
            <firstname>François</firstname>
            <lastname>Pottier</lastname>
          </person>
        </participants>
        <p>While preparing an MPRI lecture on the CPS transformation, François Pottier
did a machine-checked proof of semantic correctness for Danvy and Filinski's
properly tail-recursive, one-pass, call-by-value CPS transformation.</p>
        <p>He proposed a new first-order, one-pass, compositional formulation of the
transformation.
He pointed out that Danvy and Filinski's simulation diagram does not hold in
the presence of <tt>let</tt> and proved a slightly more complex diagram, which
involves parallel reduction.
He suggested representing variables as de Bruijn indices and showed that,
thanks to state-of-the-art libraries such as Autosubst, this does not
represent a significant impediment to formalization.
Finally, he noted that, given this representation of terms,
it is not obvious how to efficiently implement the transformation.
To address this issue, he proposed a novel higher-order formulation of
the CPS transformation, proved that it is correct,
and informally argued that it runs in time <formula type="inline"><math xmlns="http://www.w3.org/1998/Math/MathML" overflow="scroll"><mrow><mi>O</mi><mo>(</mo><mi>n</mi><mo form="prefix">log</mo><mi>n</mi><mo>)</mo></mrow></math></formula>.</p>
        <p>This work has been submitted for publication in a journal.</p>
      </subsection>
      <subsection id="uid110" level="2">
        <bodyTitle>Zenon</bodyTitle>
        <participants>
          <person key="gallium-2014-idm26976">
            <firstname>Damien</firstname>
            <lastname>Doligez</lastname>
          </person>
        </participants>
        <p>This year, Damien Doligez did maintenance work on Zenon: updating to the
latest version of OCaml and fixing a few bugs. He also started work on adding
a few minor features, such as inductive proofs for mutually inductive types.</p>
      </subsection>
      <subsection id="uid111" level="2">
        <bodyTitle>TLA+</bodyTitle>
        <participants>
          <person key="gallium-2014-idm26976">
            <firstname>Damien</firstname>
            <lastname>Doligez</lastname>
          </person>
          <person key="PASUSERID">
            <firstname>Leslie</firstname>
            <lastname>Lamport</lastname>
            <moreinfo>Microsoft Research</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Martin</firstname>
            <lastname>Riener</lastname>
            <moreinfo>team VeriDis</moreinfo>
          </person>
          <person key="PASUSERID">
            <firstname>Stephan</firstname>
            <lastname>Merz</lastname>
            <moreinfo>team VeriDis</moreinfo>
          </person>
        </participants>
        <p>Damien Doligez is head of the “Tools for Proofs” team in the
Microsoft-Inria Joint Centre. The aim of this project is to
extend the TLA+ language with a formal language for hierarchical
proofs, formalizing Lamport's ideas <ref xlink:href="#gallium-2017-bid30" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>, and to
build tools for writing TLA+ specifications and mechanically
checking the proofs.</p>
        <p>Damien is still working on a new version of TLAPS and has started writing a
formal description of the semantics of TLA+.</p>
      </subsection>
    </subsection>
  </resultats>
  <contrats id="uid112">
    <bodyTitle>Bilateral Contracts and Grants with Industry</bodyTitle>
    <subsection id="uid113" level="1">
      <bodyTitle>Bilateral Contracts with Industry</bodyTitle>
      <subsection id="uid114" level="2">
        <bodyTitle>The Caml Consortium</bodyTitle>
        <participants>
          <person key="gallium-2014-idm29528">
            <firstname>Xavier</firstname>
            <lastname>Leroy</lastname>
            <moreinfo>
              <b>contact</b>
            </moreinfo>
          </person>
          <person key="gallium-2014-idm26976">
            <firstname>Damien</firstname>
            <lastname>Doligez</lastname>
          </person>
          <person key="gallium-2016-idp121360">
            <firstname>Michel</firstname>
            <lastname>Mauny</lastname>
          </person>
          <person key="gallium-2014-idp70256">
            <firstname>Didier</firstname>
            <lastname>Rémy</lastname>
          </person>
        </participants>
        <p>The Caml Consortium is a formal structure where industrial and
academic users of OCaml can support the development of the language and
associated tools, express their specific needs, and contribute to the
long-term stability of Caml. Membership fees are used to fund
specific developments targeted towards industrial users. Members of
the Consortium automatically benefit from very liberal licensing
conditions on the OCaml system, allowing for instance the OCaml
compiler to be embedded within proprietary applications.</p>
        <p>The Consortium currently has 16 member companies:</p>
        <simplelist>
          <li id="uid115">
            <p noindent="true">Aesthetic Integration</p>
          </li>
          <li id="uid116">
            <p noindent="true">Ahrefs</p>
          </li>
          <li id="uid117">
            <p noindent="true">Be Sport</p>
          </li>
          <li id="uid118">
            <p noindent="true">Bloomberg</p>
          </li>
          <li id="uid119">
            <p noindent="true">CEA</p>
          </li>
          <li id="uid120">
            <p noindent="true">Citrix</p>
          </li>
          <li id="uid121">
            <p noindent="true">Dassault Aviation</p>
          </li>
          <li id="uid122">
            <p noindent="true">Docker</p>
          </li>
          <li id="uid123">
            <p noindent="true">Esterel Technologies</p>
          </li>
          <li id="uid124">
            <p noindent="true">Facebook</p>
          </li>
          <li id="uid125">
            <p noindent="true">Jane Street</p>
          </li>
          <li id="uid126">
            <p noindent="true">Kernelyze LLC</p>
          </li>
          <li id="uid127">
            <p noindent="true">LexiFi</p>
          </li>
          <li id="uid128">
            <p noindent="true">Microsoft</p>
          </li>
          <li id="uid129">
            <p noindent="true">OCamlPro</p>
          </li>
          <li id="uid130">
            <p noindent="true">SimCorp</p>
          </li>
        </simplelist>
        <p>For a complete description of this
structure, refer to <ref xlink:href="http://caml.inria.fr/consortium/" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>caml.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>consortium/</ref>.
Xavier Leroy chairs the scientific committee of the Consortium.</p>
      </subsection>
      <subsection id="uid131" level="2">
        <bodyTitle>The OCaml Foundation</bodyTitle>
        <participants>
          <person key="gallium-2016-idp121360">
            <firstname>Michel</firstname>
            <lastname>Mauny</lastname>
          </person>
        </participants>
        <p>Throughout 2017, Michel Mauny has been preparing the project of an OCaml
Foundation, which should support OCaml in a more efficient way than the
existing Caml Consortium could do, thanks to the facilities and flexibility
provided by the recently created Inria Foundation. The goal is to raise enough
funds to effectively support the development and evolution of OCaml, and to
animate and grow its user and teaching communities.</p>
      </subsection>
      <subsection id="uid132" level="2">
        <bodyTitle>Scientific Advisory for OCamlPro</bodyTitle>
        <participants>
          <person key="gallium-2014-idm25696">
            <firstname>Fabrice</firstname>
            <lastname>Le Fessant</lastname>
          </person>
        </participants>
        <p>OCamlPro is a startup company founded in 2011 by Fabrice Le Fessant to
promote the use of OCaml in the industry, by providing support,
services and tools for OCaml to software companies. OCamlPro performs
a lot of research and development, in close partnership with academic
institutions such as IRILL, Inria and Univ. Paris Sud, and is involved
in several collaborative projects with Gallium, such as the Bware ANR,
the Vocal ANR and the Secur-OCaml FUI.</p>
        <p>Since 2011, Fabrice Le Fessant has been a scientific advisor at OCamlPro, as
part of a collaboration contract for Inria, to transfer his knowledge on the
internals of the OCaml runtime and the OCaml compilers. Fabrice has left Inria
in October 2017 to join OCamlPro on a full-time position.</p>
      </subsection>
    </subsection>
  </contrats>
  <partenariat id="uid133">
    <bodyTitle>Partnerships and Cooperations</bodyTitle>
    <subsection id="uid134" level="1">
      <bodyTitle>National Initiatives</bodyTitle>
      <subsection id="uid135" level="2">
        <bodyTitle>ANR projects</bodyTitle>
        <subsection id="uid136" level="3">
          <bodyTitle>Vocal</bodyTitle>
          <participants>
            <person key="gallium-2015-idp84952">
              <firstname>Armaël</firstname>
              <lastname>Guéneau</lastname>
            </person>
            <person key="gallium-2014-idm29528">
              <firstname>Xavier</firstname>
              <lastname>Leroy</lastname>
            </person>
            <person key="gallium-2014-idp67496">
              <firstname>François</firstname>
              <lastname>Pottier</lastname>
            </person>
            <person key="gallium-2017-idp156416">
              <firstname>Naomi</firstname>
              <lastname>Testard</lastname>
            </person>
            <p>.</p>
          </participants>
          <p>The “Vocal” project (2015–2020) aims at developing the first mechanically
verified library of efficient general-purpose data structures and algorithms.
It is funded by <i>Agence Nationale de la Recherche</i> under its “appel à
projets générique 2015”.</p>
          <p>The library will be made available to all OCaml programmers and will
be of particular interest to implementors of safety-critical OCaml programs,
such as Coq, Astrée, Frama-C, CompCert, Alt-Ergo, as well as new projects. By
offering verified program components, our work will provide the essential
building blocks that are needed to significantly decrease the cost of
developing new formally verified programs.</p>
        </subsection>
      </subsection>
      <subsection id="uid137" level="2">
        <bodyTitle>FUI Projects</bodyTitle>
        <subsection id="uid138" level="3">
          <bodyTitle>Secur-OCaml</bodyTitle>
          <participants>
            <person key="gallium-2014-idm26976">
              <firstname>Damien</firstname>
              <lastname>Doligez</lastname>
            </person>
            <person key="gallium-2014-idm25696">
              <firstname>Fabrice</firstname>
              <lastname>Le Fessant</lastname>
            </person>
            <p>.</p>
          </participants>
          <p>The “Secur-OCaml” project (2015–2018) is coordinated by the
OCamlPro company, with a consortium focusing on the use of OCaml in
security-critical contexts, while OCaml is currently mostly used in
safety-critical contexts. Gallium is invoved in this project to
integrate security features in the OCaml language, to build a new
independant interpreter for the language, and to update the
recommendations for developers issued by the former LaFoSec project of
ANSSI.</p>
        </subsection>
      </subsection>
    </subsection>
    <subsection id="uid139" level="1">
      <bodyTitle>European Initiatives</bodyTitle>
      <subsection id="uid140" level="2">
        <bodyTitle>FP7 &amp; H2020 Projects</bodyTitle>
        <subsection id="uid141" level="3">
          <bodyTitle>Deepsea</bodyTitle>
          <participants>
            <person key="gallium-2014-idm28256">
              <firstname>Umut</firstname>
              <lastname>Acar</lastname>
            </person>
            <person key="gallium-2015-idp72464">
              <firstname>Vitalii</firstname>
              <lastname>Aksenov</lastname>
            </person>
            <person key="PASUSERID">
              <firstname>Arthur</firstname>
              <lastname>Charguéraud</lastname>
            </person>
            <person key="parkas-2014-idp142896">
              <firstname>Adrien</firstname>
              <lastname>Guatto</lastname>
            </person>
            <person key="gallium-2016-idp126752">
              <firstname>Michael</firstname>
              <lastname>Rainey</lastname>
            </person>
            <p>.</p>
          </participants>
          <p>The Deepsea project (2013–2018) is coordinated by Umut Acar and funded by FP7
as an ERC Starting Grant.
Its objective is to develop abstractions, algorithms and languages for
parallelism and dynamic parallelism, with applications to problems on large
data sets.</p>
        </subsection>
      </subsection>
      <subsection id="uid142" level="2">
        <bodyTitle>ITEA3 Projects</bodyTitle>
        <subsection id="uid143" level="3">
          <bodyTitle>Assume</bodyTitle>
          <participants>
            <person key="gallium-2014-idm29528">
              <firstname>Xavier</firstname>
              <lastname>Leroy</lastname>
            </person>
            <person key="gallium-2014-idp66296">
              <firstname>Luc</firstname>
              <lastname>Maranget</lastname>
            </person>
            <p>.</p>
          </participants>
          <p>ASSUME (2015–2018) is an ITEA3 project involving France, Germany,
Netherlands, Turkey and Sweden. The French participants are
coordinated by Jean Souyris (Airbus) and include Airbus, Kalray,
Sagem, ENS Paris, and Inria Paris. The goal of the project is to
investigate the usability of multicore and manycore processors for
critical embedded systems. Our involvement in this project focuses on
the formalisation and verification of memory models and of automatic
code generators from reactive languages.</p>
        </subsection>
      </subsection>
    </subsection>
    <subsection id="uid144" level="1">
      <bodyTitle>International Initiatives</bodyTitle>
      <subsection id="uid145" level="2">
        <bodyTitle>Informal International Partners</bodyTitle>
        <simplelist>
          <li id="uid146">
            <p noindent="true">Princeton University: interactions between
the CompCert verified C compiler and the Verified Software Toolchain
developed at Princeton.</p>
          </li>
          <li id="uid147">
            <p noindent="true">Cambridge University and Microsoft Research Cambridge:
formal modeling and testing of weak memory models.</p>
          </li>
        </simplelist>
      </subsection>
    </subsection>
  </partenariat>
  <diffusion id="uid148">
    <bodyTitle>Dissemination</bodyTitle>
    <subsection id="uid149" level="1">
      <bodyTitle>Promoting Scientific Activities</bodyTitle>
      <subsection id="uid150" level="2">
        <bodyTitle>Scientific Events Selection</bodyTitle>
        <subsection id="uid151" level="3">
          <bodyTitle>Member of the Conference Program Committees</bodyTitle>
          <p>Xavier Leroy participated in the program committee of the ACM
symposium on Principles of Programming Languages (POPL 2018),
of the European Symposium on Programming (ESOP 2018),
and of the second Principles of Secure Compilation workshop (PRISC 2018).</p>
          <p>Jean-Marie Madiot was a member of the program committee of the
Interaction and Concurrency Experience Workshop (ICE 2017).</p>
          <p>Michel Mauny was a member of the program committee for
Trends in Functional Programming in Education (TFPIE 2017).</p>
          <p>François Pottier was program chair of the ACM SIGPLAN Workshop on
Higher-Order Programming with Effects (HOPE 2017) and a member of
the program committee of the Journées Françaises des Langages
Applicatifs (JFLA 2018).</p>
          <p>Mike Rainey was a member of the program committee for the IEEE International
Parallel and Distributed Processing Symposium (IPDPS 2018).</p>
          <p>Didier Rémy was a member of the program commitee of the International
Symposium on Functional and Logic Programming (FLOPS 2018).</p>
        </subsection>
      </subsection>
      <subsection id="uid152" level="2">
        <bodyTitle>Journal</bodyTitle>
        <subsection id="uid153" level="3">
          <bodyTitle>Member of the Editorial Boards</bodyTitle>
          <p>Xavier Leroy is area editor (programming languages) for Journal of the
ACM. He is a member of the editorial board of Journal of Automated
Reasoning. Until June 2017, he was on the editorial board for the
Research Highlights column of Communications of the ACM.</p>
          <p>Michel Mauny is a member of the steering committee of the OCaml workshop.</p>
          <p>François Pottier is a member of the ICFP steering committee and a member of
the editorial boards of the Journal of Functional Programming and the
Proceedings of the ACM on Programming Languages.</p>
          <p>Didier Rémy is a member of the steering committee of the ML Family workshop.</p>
        </subsection>
      </subsection>
      <subsection id="uid154" level="2">
        <bodyTitle>Research Administration</bodyTitle>
        <p>Until September 2017, Xavier Leroy was an appointed member of Inria's
<i>Commission d'Évaluation</i>. He participated in the following Inria
hiring committees: <i>jury d'admissibilité DR2</i>
and <i>jury d'admissibilité CR1</i>.</p>
        <p>François Pottier is a member of Inria Paris' <i>Commission de Développement
Technologique</i> and the president of Inria Paris' <i>Comité de Suivi
Doctoral</i>.</p>
        <p>Didier Rémy is <i>Deputy Scientific Director</i> (ADS) in charge of
<i>Algorithmics, Programming, Software and Architecture</i>.</p>
      </subsection>
    </subsection>
    <subsection id="uid155" level="1">
      <bodyTitle>Teaching - Supervision - Juries</bodyTitle>
      <subsection id="uid156" level="2">
        <bodyTitle>Teaching</bodyTitle>
        <p>Didier Rémy is Inria's delegate in the pedagogical team of the MPRI
(<i>Master Parisien de Recherche en Informatique</i>).</p>
        <sanspuceslist>
          <li id="uid157">
            <p noindent="true">Master:
Luc Maranget,
“Semantics, languages and algorithms for multi-core programming”,
18 HETD,
M2 (MPRI),
Université Paris Diderot,
France.</p>
          </li>
          <li id="uid158">
            <p noindent="true">Master:
Michel Mauny,
“Principles of Programming Languages”,
32 HETD,
M1,
ENSTA-ParisTech,
France.</p>
          </li>
          <li id="uid159">
            <p noindent="true">Master:
François Pottier and Didier Rémy,
“Functional programming and type systems”,
18 + 18 HETD,
M2 (MPRI),
Université Paris Diderot,
France.</p>
          </li>
          <li id="uid160">
            <p noindent="true">Licence:
Armaël Guéneau,
“Initiation à la programmation” (TP),
“Projet informatique” (TP),
“Concepts informatiques” (TD),
“Langages et automates” (TD),
64 HETD,
L1 and L2,
Université Paris Diderot,
France.</p>
          </li>
          <li id="uid161">
            <p noindent="true">Licence:
Thomas Williams,
“Projet informatique” (TD),
“Programation orientée objet et interfaces graphiques” (TD/TP),
64 HETD,
L2,
Université Paris Diderot,
France.</p>
          </li>
        </sanspuceslist>
      </subsection>
      <subsection id="uid162" level="2">
        <bodyTitle>Supervision</bodyTitle>
        <sanspuceslist>
          <li id="uid163">
            <p noindent="true">M1:
Danny Willems,
Université de Mons,
supervised by François Pottier.</p>
          </li>
          <li id="uid164">
            <p noindent="true">PhD in progress:
Vitalii Aksenov,
“Parallel Dynamic Algorithms”,
Université Paris Diderot,
since September 2015,
supervised by Umut Acar
(co-advised with Anatoly Shalyto, ITMO University of Saint Petersburg, Russia).</p>
          </li>
          <li id="uid165">
            <p noindent="true">PhD in progress: Pierrick Couderc (ENSTA-ParisTech &amp; OCamlPro),
“Typage modulaire du langage intermédiaire du compilateur OCaml,”
Université Paris-Saclay,
since December 2014,
supervised by Michel Mauny, Grégoire Henry (OCamlPro) and Fabrice Le Fessant.</p>
          </li>
          <li id="uid166">
            <p noindent="true">PhD in progress: Albin Coquereau (ENSTA-ParisTech),
“Amélioration de performances pour le solveur SMT Alt-Ergo: conception d'outils
d'analyse, optimisations et structures de données efficaces pour OCaml,”
Université Paris-Saclay,
since October 2015,
supervised by Michel Mauny, Sylvain Conchon (LRI, Université Paris-Sud) and Fabrice Le Fessant.</p>
          </li>
          <li id="uid167">
            <p noindent="true">PhD in progress:
Armaël Guéneau,
“Towards Machine-Checked Time Complexity Analyses”,
Université Paris Diderot,
since September 2016,
supervised by Arthur Charguéraud and François Pottier.</p>
          </li>
          <li id="uid168">
            <p noindent="true">PhD in progress:
Naomi Testard,
“Reasoning about Effect Handlers and Cooperative Concurrency”,
Université Paris Diderot,
since January 2017,
supervised by François Pottier.</p>
          </li>
          <li id="uid169">
            <p noindent="true">PhD in progress:
Thomas Williams,
“Putting Ornaments into practice”,
Université Paris Diderot,
since September 2014,
supervised by Didier Rémy.</p>
          </li>
        </sanspuceslist>
      </subsection>
      <subsection id="uid170" level="2">
        <bodyTitle>Juries</bodyTitle>
        <p>Xavier Leroy was on the Ph.D. committees of Quentin Carbonneaux (Yale
University, August 2017) and of Gabriel Radanne (University
Paris Diderot, November 2017).</p>
        <p>François Pottier was a reviewer for the Ph.D. thesis of
Sandro Stucki (École Polytechnique Fédérale de Lausanne,
September 2017). He was a member of the jury for the GDR
GPL dissertation award (<i>prix de thèse du GDR GPL</i>).</p>
      </subsection>
    </subsection>
    <subsection id="uid171" level="1">
      <bodyTitle>Popularization</bodyTitle>
      <p>Xavier Leroy wrote a popularization article describing the hunt for a
hardware bug in Intel processors, which was published by the Web news
site <i>The Next Web</i> <ref xlink:href="#gallium-2017-bid31" location="biblio" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest"/>.</p>
    </subsection>
  </diffusion>
  <biblio id="bibliography" html="bibliography" numero="10" titre="Bibliography">
    
    <biblStruct id="gallium-2017-bid46" type="article" rend="refer" n="refercite:2014-Alglave-Maranget-Tautschnig">
      <identifiant type="doi" value="10.1145/2627752"/>
      <analytic>
        <title level="a">Herding cats: modelling, simulation, testing, and data-mining for weak memory</title>
        <author>
          <persName>
            <foreName>Jade</foreName>
            <surname>Alglave</surname>
            <initial>J.</initial>
          </persName>
          <persName key="gallium-2014-idp66296">
            <foreName>Luc</foreName>
            <surname>Maranget</surname>
            <initial>L.</initial>
          </persName>
          <persName>
            <foreName>Michael</foreName>
            <surname>Tautschnig</surname>
            <initial>M.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="j">ACM Transactions on Programming Languages and Systems</title>
        <imprint>
          <biblScope type="volume">36</biblScope>
          <biblScope type="number">2</biblScope>
          <dateStruct>
            <year>2014</year>
          </dateStruct>
          <biblScope type="pages">article no 7</biblScope>
          <ref xlink:href="http://dx.doi.org/10.1145/2627752" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>dx.<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1145/<allowbreak/>2627752</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid48" type="article" rend="refer" n="refercite:2016-Balabonski-Pottier-Protzenko">
      <identifiant type="doi" value="10.1145/2837022"/>
      <analytic>
        <title level="a">The design and formalization of Mezzo, a permission-based programming language</title>
        <author>
          <persName key="gallium-2014-idp73048">
            <foreName>Thibaut</foreName>
            <surname>Balabonski</surname>
            <initial>T.</initial>
          </persName>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
          <persName key="gallium-2014-idp83264">
            <foreName>Jonathan</foreName>
            <surname>Protzenko</surname>
            <initial>J.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="j">ACM Transactions on Programming Languages and Systems</title>
        <imprint>
          <biblScope type="volume">38</biblScope>
          <biblScope type="number">4</biblScope>
          <dateStruct>
            <year>2016</year>
          </dateStruct>
          <biblScope type="pages">14:1–14:94</biblScope>
          <ref xlink:href="http://doi.acm.org/10.1145/2837022" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>doi.<allowbreak/>acm.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1145/<allowbreak/>2837022</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid49" type="article" rend="refer" n="refercite:chargueraud:hal-01652785">
      <identifiant type="doi" value="10.1007/s10817-017-9431-7"/>
      <identifiant type="hal" value="hal-01652785"/>
      <analytic>
        <title level="a">Verifying the Correctness and Amortized Complexity of a Union-Find Implementation in Separation Logic with Time Credits</title>
        <author>
          <persName key="toccata-2014-idp68328">
            <foreName>Arthur</foreName>
            <surname>Charguéraud</surname>
            <initial>A.</initial>
          </persName>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="j">Journal of Automated Reasoning</title>
        <imprint>
          <dateStruct>
            <month>September</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01652785" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01652785</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid44" type="inproceedings" rend="refer" n="refercite:2010-Doligez-TLA+">
      <identifiant type="doi" value="10.1007/978-3-642-14203-1_12"/>
      <analytic>
        <title level="a">Verifying Safety Properties With the TLA+ Proof System</title>
        <author>
          <persName key="parsifal-2014-idp62456">
            <foreName>Kaustuv</foreName>
            <surname>Chaudhuri</surname>
            <initial>K.</initial>
          </persName>
          <persName key="gallium-2014-idm26976">
            <foreName>Damien</foreName>
            <surname>Doligez</surname>
            <initial>D.</initial>
          </persName>
          <persName>
            <foreName>Leslie</foreName>
            <surname>Lamport</surname>
            <initial>L.</initial>
          </persName>
          <persName key="veridis-2014-idm26664">
            <foreName>Stephan</foreName>
            <surname>Merz</surname>
            <initial>S.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-international-audience="yes" x-proceedings="yes">
        <title level="m">Automated Reasoning, 5th International Joint Conference, IJCAR 2010</title>
        <title level="s">Lecture Notes in Computer Science</title>
        <imprint>
          <biblScope type="volume">6173</biblScope>
          <publisher>
            <orgName>Springer</orgName>
          </publisher>
          <dateStruct>
            <year>2010</year>
          </dateStruct>
          <biblScope type="pages">142–148</biblScope>
          <ref xlink:href="http://dx.doi.org/10.1007/978-3-642-14203-1_12" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>dx.<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1007/<allowbreak/>978-3-642-14203-1_12</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid6" type="inproceedings" rend="refer" n="refercite:2014-Cretin-Remy">
      <identifiant type="doi" value="10.1145/2603088.2603128"/>
      <analytic>
        <title level="a">System F with Coercion Constraints</title>
        <author>
          <persName key="gallium-2014-idp79456">
            <foreName>Julien</foreName>
            <surname>Cretin</surname>
            <initial>J.</initial>
          </persName>
          <persName key="gallium-2014-idp70256">
            <foreName>Didier</foreName>
            <surname>Rémy</surname>
            <initial>D.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="m">CSL-LICS 2014: Computer Science Logic / Logic In Computer Science</title>
        <imprint>
          <publisher>
            <orgName>ACM</orgName>
          </publisher>
          <dateStruct>
            <year>2014</year>
          </dateStruct>
          <biblScope type="pages">article no 34</biblScope>
          <ref xlink:href="http://dx.doi.org/10.1145/2603088.2603128" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>dx.<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1145/<allowbreak/>2603088.<allowbreak/>2603128</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid47" type="inproceedings" rend="refer" n="refercite:jourdan:hal-01078386">
      <identifiant type="doi" value="10.1145/2676726.2676966"/>
      <analytic>
        <title level="a">A Formally-Verified C Static Analyzer</title>
        <author>
          <persName key="gallium-2014-idp82000">
            <foreName>Jacques-Henri</foreName>
            <surname>Jourdan</surname>
            <initial>J.-H.</initial>
          </persName>
          <persName key="celtique-2014-idp85344">
            <foreName>Vincent</foreName>
            <surname>Laporte</surname>
            <initial>V.</initial>
          </persName>
          <persName key="celtique-2014-idp67080">
            <foreName>Sandrine</foreName>
            <surname>Blazy</surname>
            <initial>S.</initial>
          </persName>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
          <persName key="celtique-2014-idp73952">
            <foreName>David</foreName>
            <surname>Pichardie</surname>
            <initial>D.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="m">POPL'15: 42nd ACM Symposium on Principles of Programming Languages</title>
        <imprint>
          <publisher>
            <orgName>ACM Press</orgName>
          </publisher>
          <dateStruct>
            <month>January</month>
            <year>2015</year>
          </dateStruct>
          <biblScope type="pages">247-259</biblScope>
          <ref xlink:href="http://dx.doi.org/10.1145/2676726.2676966" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>dx.<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1145/<allowbreak/>2676726.<allowbreak/>2676966</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid43" type="article" rend="refer" n="refercite:2009-LeBotlan-Remy-recasting-mlf">
      <identifiant type="doi" value="10.1016/j.ic.2008.12.006"/>
      <analytic>
        <title level="a">Recasting MLF</title>
        <author>
          <persName>
            <foreName>Didier</foreName>
            <surname>Le Botlan</surname>
            <initial>D.</initial>
          </persName>
          <persName key="gallium-2014-idp70256">
            <foreName>Didier</foreName>
            <surname>Rémy</surname>
            <initial>D.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-editorial-board="yes" x-international-audience="yes">
        <title level="j">Information and Computation</title>
        <imprint>
          <biblScope type="volume">207</biblScope>
          <biblScope type="number">6</biblScope>
          <dateStruct>
            <year>2009</year>
          </dateStruct>
          <biblScope type="pages">726–785</biblScope>
          <ref xlink:href="http://dx.doi.org/10.1016/j.ic.2008.12.006" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>dx.<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1016/<allowbreak/>j.<allowbreak/>ic.<allowbreak/>2008.<allowbreak/>12.<allowbreak/>006</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid10" type="article" rend="refer" n="refercite:2009-Leroy-Compcert-backend">
      <identifiant type="doi" value="10.1007/s10817-009-9155-4"/>
      <analytic>
        <title level="a">A formally verified compiler back-end</title>
        <author>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-editorial-board="yes" x-international-audience="yes">
        <title level="j">Journal of Automated Reasoning</title>
        <imprint>
          <biblScope type="volume">43</biblScope>
          <biblScope type="number">4</biblScope>
          <dateStruct>
            <year>2009</year>
          </dateStruct>
          <biblScope type="pages">363–446</biblScope>
          <ref xlink:href="http://dx.doi.org/10.1007/s10817-009-9155-4" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>dx.<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1007/<allowbreak/>s10817-009-9155-4</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid9" type="article" rend="refer" n="refercite:2009-Leroy-Compcert-CACM">
      <identifiant type="doi" value="10.1145/1538788.1538814"/>
      <analytic>
        <title level="a">Formal verification of a realistic compiler</title>
        <author>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-editorial-board="yes" x-international-audience="yes">
        <title level="j">Communications of the ACM</title>
        <imprint>
          <biblScope type="volume">52</biblScope>
          <biblScope type="number">7</biblScope>
          <dateStruct>
            <year>2009</year>
          </dateStruct>
          <biblScope type="pages">107–115</biblScope>
          <ref xlink:href="http://doi.acm.org/10.1145/1538788.1538814" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>doi.<allowbreak/>acm.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1145/<allowbreak/>1538788.<allowbreak/>1538814</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid45" type="article" rend="refer" n="refercite:2012-Pouillard-Pottier">
      <identifiant type="doi" value="10.1017/S0956796812000251"/>
      <analytic>
        <title level="a">A unified treatment of syntax with binders</title>
        <author>
          <persName>
            <foreName>Nicolas</foreName>
            <surname>Pouillard</surname>
            <initial>N.</initial>
          </persName>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-editorial-board="yes" x-international-audience="yes">
        <title level="j">Journal of Functional Programming</title>
        <imprint>
          <biblScope type="volume">22</biblScope>
          <biblScope type="number">4–5</biblScope>
          <dateStruct>
            <year>2012</year>
          </dateStruct>
          <biblScope type="pages">614–704</biblScope>
          <ref xlink:href="http://dx.doi.org/10.1017/S0956796812000251" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>dx.<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1017/<allowbreak/>S0956796812000251</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid29" type="article" rend="year" n="cite:chargueraud:hal-01652785">
      <identifiant type="doi" value="10.1007/s10817-017-9431-7"/>
      <identifiant type="hal" value="hal-01652785"/>
      <analytic>
        <title level="a">Verifying the Correctness and Amortized Complexity of a Union-Find Implementation in Separation Logic with Time Credits</title>
        <author>
          <persName key="toccata-2014-idp68328">
            <foreName>Arthur</foreName>
            <surname>Charguéraud</surname>
            <initial>A.</initial>
          </persName>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-editorial-board="yes" x-international-audience="yes" id="rid01057">
        <idno type="issn">0168-7433</idno>
        <title level="j">Journal of Automated Reasoning</title>
        <imprint>
          <dateStruct>
            <month>September</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01652785" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01652785</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid36" type="article" rend="year" n="cite:jourdan:hal-01633123">
      <identifiant type="doi" value="10.1145/3064848"/>
      <identifiant type="hal" value="hal-01633123"/>
      <analytic>
        <title level="a">A Simple, Possibly Correct LR Parser for C11</title>
        <author>
          <persName key="gallium-2014-idp82000">
            <foreName>Jacques-Henri</foreName>
            <surname>Jourdan</surname>
            <initial>J.-H.</initial>
          </persName>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-editorial-board="yes" x-international-audience="yes" id="rid00032">
        <idno type="issn">0164-0925</idno>
        <title level="j">ACM Transactions on Programming Languages and Systems (TOPLAS)</title>
        <imprint>
          <biblScope type="volume">39</biblScope>
          <biblScope type="number">4</biblScope>
          <dateStruct>
            <month>September</month>
            <year>2017</year>
          </dateStruct>
          <biblScope type="pages">1 - 36</biblScope>
          <ref xlink:href="https://hal.archives-ouvertes.fr/hal-01633123" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>archives-ouvertes.<allowbreak/>fr/<allowbreak/>hal-01633123</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid28" type="article" rend="year" n="cite:pottier:hal-01670735">
      <identifiant type="doi" value="10.1145/3110272"/>
      <identifiant type="hal" value="hal-01670735"/>
      <analytic>
        <title level="a">Visitors unchained</title>
        <author>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-editorial-board="yes" x-international-audience="yes" id="rid03212">
        <idno type="issn">2475-1421</idno>
        <title level="j">Proceedings of the ACM on Programming Languages</title>
        <imprint>
          <biblScope type="volume">1</biblScope>
          <biblScope type="number">ICFP</biblScope>
          <dateStruct>
            <month>August</month>
            <year>2017</year>
          </dateStruct>
          <biblScope type="pages">1 - 28</biblScope>
          <ref xlink:href="https://hal.inria.fr/hal-01670735" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01670735</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid15" type="article" rend="year" n="cite:williams:hal-01666104">
      <identifiant type="doi" value="10.1145/3158109"/>
      <identifiant type="hal" value="hal-01666104"/>
      <analytic>
        <title level="a">A Principled Approach to Ornamentation in ML</title>
        <author>
          <persName key="gallium-2014-idp85776">
            <foreName>Thomas</foreName>
            <surname>Williams</surname>
            <initial>T.</initial>
          </persName>
          <persName key="gallium-2014-idp70256">
            <foreName>Didier</foreName>
            <surname>Rémy</surname>
            <initial>D.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-editorial-board="yes" x-international-audience="yes" id="rid03212">
        <idno type="issn">2475-1421</idno>
        <title level="j">Proceedings of the ACM on Programming Languages</title>
        <imprint>
          <dateStruct>
            <month>January</month>
            <year>2018</year>
          </dateStruct>
          <biblScope type="pages">1-30</biblScope>
          <ref xlink:href="https://hal.inria.fr/hal-01666104" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01666104</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid24" type="inproceedings" rend="year" n="cite:acar:hal-01664903">
      <identifiant type="doi" value="10.1145/3087556.3087595"/>
      <identifiant type="hal" value="hal-01664903"/>
      <analytic>
        <title level="a">Brief Announcement: Parallel Dynamic Tree Contraction via Self-Adjusting Computation</title>
        <author>
          <persName key="gallium-2014-idm28256">
            <foreName>Umut A.</foreName>
            <surname>Acar</surname>
            <initial>U. A.</initial>
          </persName>
          <persName key="gallium-2015-idp72464">
            <foreName>Vitalii</foreName>
            <surname>Aksenov</surname>
            <initial>V.</initial>
          </persName>
          <persName>
            <foreName>Sam</foreName>
            <surname>Westrick</surname>
            <initial>S.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">The 29th Annual ACM Symposium on Parallelism in Algorithms and Architectures (SPAA '17)</title>
        <loc>Washington, United States</loc>
        <imprint>
          <dateStruct>
            <month>July</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01664903" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01664903</ref>
        </imprint>
        <meeting id="cid24479">
          <title>ACM Symposium on Parallelism in Algorithms and Architectures</title>
          <num>29</num>
          <abbr type="sigle">SPAA</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid21" type="inproceedings" rend="year" n="cite:acar:hal-01416531">
      <identifiant type="doi" value="10.1145/3018743.3018762"/>
      <identifiant type="hal" value="hal-01416531"/>
      <analytic>
        <title level="a">Contention in Structured Concurrency: Provably Efficient Dynamic Non-Zero Indicators for Nested Parallelism</title>
        <author>
          <persName key="gallium-2014-idm28256">
            <foreName>Umut A</foreName>
            <surname>Acar</surname>
            <initial>U. A.</initial>
          </persName>
          <persName>
            <foreName>Naama</foreName>
            <surname>Ben-David</surname>
            <initial>N.</initial>
          </persName>
          <persName key="gallium-2014-idp68976">
            <foreName>Mike</foreName>
            <surname>Rainey</surname>
            <initial>M.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">22nd ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming</title>
        <loc>Austin, United States</loc>
        <imprint>
          <dateStruct>
            <month>February</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01416531" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01416531</ref>
        </imprint>
        <meeting id="cid22344">
          <title>ACM SIGPLAN SIGACT Symposium on Principles of Programming Languages</title>
          <num>44</num>
          <abbr type="sigle">POPL</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid25" type="inproceedings" rend="year" n="cite:aksenov:hal-01664898">
      <identifiant type="hal" value="hal-01664898"/>
      <analytic>
        <title level="a">A Concurrency-Optimal Binary Search Tree</title>
        <author>
          <persName key="gallium-2015-idp72464">
            <foreName>Vitalii</foreName>
            <surname>Aksenov</surname>
            <initial>V.</initial>
          </persName>
          <persName>
            <foreName>Vincent</foreName>
            <surname>Gramoli</surname>
            <initial>V.</initial>
          </persName>
          <persName>
            <foreName>Petr</foreName>
            <surname>Kuznetsov</surname>
            <initial>P.</initial>
          </persName>
          <persName>
            <foreName>Anna</foreName>
            <surname>Malova</surname>
            <initial>A.</initial>
          </persName>
          <persName>
            <foreName>Srivatsan</foreName>
            <surname>Ravi</surname>
            <initial>S.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">23rd International European Conference on Parallel and Distributed Computing - Euro-Par 2017</title>
        <loc>Santiago de Compostella, Spain</loc>
        <imprint>
          <dateStruct>
            <month>August</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01664898" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01664898</ref>
        </imprint>
        <meeting id="cid306382">
          <title>International Euro-Par Conference on Parallel Processing</title>
          <num>23</num>
          <abbr type="sigle">Euro-Par</abbr>
        </meeting>
      </monogr>
      <note type="bnote">
        <ref xlink:href="https://arxiv.org/abs/1702.04441" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>arxiv.<allowbreak/>org/<allowbreak/>abs/<allowbreak/>1702.<allowbreak/>04441</ref>
      </note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid41" type="inproceedings" rend="year" n="cite:balabonski:hal-01549942">
      <identifiant type="doi" value="10.1007/978-3-319-67113-0_11"/>
      <identifiant type="hal" value="hal-01549942"/>
      <analytic>
        <title level="a">Certified Gathering of Oblivious Mobile Robots: survey of recent results and open problems</title>
        <author>
          <persName key="gallium-2014-idp73048">
            <foreName>Thibaut</foreName>
            <surname>Balabonski</surname>
            <initial>T.</initial>
          </persName>
          <persName key="gallium-2014-idp71704">
            <foreName>Pierre</foreName>
            <surname>Courtieu</surname>
            <initial>P.</initial>
          </persName>
          <persName>
            <foreName>Lionel</foreName>
            <surname>Rieg</surname>
            <initial>L.</initial>
          </persName>
          <persName>
            <foreName>Sébastien</foreName>
            <surname>Tixeuil</surname>
            <initial>S.</initial>
          </persName>
          <persName key="toccata-2014-idp104368">
            <foreName>Xavier</foreName>
            <surname>Urbain</surname>
            <initial>X.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">Formal Methods for Industrial Critical Systems and Automated Verification of Critical Systems (FMICS/AVOCS)</title>
        <loc>Turin, Italy</loc>
        <title level="s">Lecture Notes in Computer Science</title>
        <imprint>
          <biblScope type="volume">10471</biblScope>
          <publisher>
            <orgName>Springer</orgName>
          </publisher>
          <dateStruct>
            <month>September</month>
            <year>2017</year>
          </dateStruct>
          <biblScope type="pages">165-181</biblScope>
          <ref xlink:href="http://hal.upmc.fr/hal-01549942" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>hal.<allowbreak/>upmc.<allowbreak/>fr/<allowbreak/>hal-01549942</ref>
        </imprint>
        <meeting id="cid625592">
          <title>Formal Methods for Industrial Critical Systems and Automated Verification of Critical Systems</title>
          <num>2017</num>
          <abbr type="sigle">FMICS/AVOCS</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid34" type="inproceedings" rend="year" n="cite:barany:hal-01658653">
      <identifiant type="doi" value="10.1007/978-3-319-61467-0_2"/>
      <identifiant type="hal" value="hal-01658653"/>
      <analytic>
        <title level="a">Hybrid Information Flow Analysis for Real-World C Code</title>
        <author>
          <persName key="gallium-2017-idp146592">
            <foreName>Gergö</foreName>
            <surname>Barany</surname>
            <initial>G.</initial>
          </persName>
          <persName>
            <foreName>Julien</foreName>
            <surname>Signoles</surname>
            <initial>J.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">TAP 2017 - 11th International Conference on Tests &amp; Proofs</title>
        <loc>Marburg, Germany</loc>
        <imprint>
          <biblScope type="volume">10375</biblScope>
          <publisher>
            <orgName>Springer</orgName>
          </publisher>
          <dateStruct>
            <month>July</month>
            <year>2017</year>
          </dateStruct>
          <biblScope type="pages">23-40</biblScope>
          <ref xlink:href="https://hal.inria.fr/hal-01658653" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01658653</ref>
        </imprint>
        <meeting id="cid302532">
          <title>International Conference on Tests and Proofs</title>
          <num>11</num>
          <abbr type="sigle">TAP</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid14" type="inproceedings" rend="year" n="cite:bourke:hal-01512286">
      <identifiant type="hal" value="hal-01512286"/>
      <analytic>
        <title level="a">A Formally Verified Compiler for Lustre</title>
        <author>
          <persName key="parkas-2014-idp14504">
            <foreName>Timothy</foreName>
            <surname>Bourke</surname>
            <initial>T.</initial>
          </persName>
          <persName key="parkas-2016-idp47792">
            <foreName>Lélio</foreName>
            <surname>Brun</surname>
            <initial>L.</initial>
          </persName>
          <persName key="gallium-2014-idp75592">
            <foreName>Pierre-Evariste</foreName>
            <surname>Dagand</surname>
            <initial>P.-E.</initial>
          </persName>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
          <persName key="parkas-2014-idp13232">
            <foreName>Marc</foreName>
            <surname>Pouzet</surname>
            <initial>M.</initial>
          </persName>
          <persName>
            <foreName>Lionel</foreName>
            <surname>Rieg</surname>
            <initial>L.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">PLDI 2017 - 38th ACM SIGPLAN Conference on Programming Language Design and Implementation</title>
        <loc>Barcelone, Spain</loc>
        <imprint>
          <publisher>
            <orgName type="organisation">ACM</orgName>
          </publisher>
          <dateStruct>
            <month>June</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01512286" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01512286</ref>
        </imprint>
        <meeting id="cid24912">
          <title>ACM Symposium on Programming Languages Design and Implementation</title>
          <num>38</num>
          <abbr type="sigle">PLDI</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid42" type="inproceedings" rend="year" n="cite:chargueraud:hal-01408657">
      <identifiant type="hal" value="hal-01408657"/>
      <analytic>
        <title level="a">Temporary Read-Only Permissions for Separation Logic</title>
        <author>
          <persName key="toccata-2014-idp68328">
            <foreName>Arthur</foreName>
            <surname>Charguéraud</surname>
            <initial>A.</initial>
          </persName>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">Proceedings of the 26th European Symposium on Programming (ESOP 2017)</title>
        <loc>Uppsala, Sweden</loc>
        <imprint>
          <dateStruct>
            <month>April</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01408657" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01408657</ref>
        </imprint>
        <meeting id="cid71137">
          <title>European Symposium on Programming and Systems</title>
          <num>26</num>
          <abbr type="sigle">ESOP</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid18" type="inproceedings" rend="year" n="cite:flur:hal-01413221">
      <identifiant type="hal" value="hal-01413221"/>
      <analytic>
        <title level="a">Mixed-size Concurrency: ARM, POWER, C/C++11, and SC</title>
        <author>
          <persName>
            <foreName>Shaked</foreName>
            <surname>Flur</surname>
            <initial>S.</initial>
          </persName>
          <persName>
            <foreName>Susmit</foreName>
            <surname>Sarkar</surname>
            <initial>S.</initial>
          </persName>
          <persName>
            <foreName>Christopher</foreName>
            <surname>Pulte</surname>
            <initial>C.</initial>
          </persName>
          <persName>
            <foreName>Kyndylan</foreName>
            <surname>Nienhuis</surname>
            <initial>K.</initial>
          </persName>
          <persName key="gallium-2014-idp66296">
            <foreName>Luc</foreName>
            <surname>Maranget</surname>
            <initial>L.</initial>
          </persName>
          <persName>
            <foreName>Kathryn E.</foreName>
            <surname>Gray</surname>
            <initial>K. E.</initial>
          </persName>
          <persName>
            <foreName>Ali</foreName>
            <surname>Sezgin</surname>
            <initial>A.</initial>
          </persName>
          <persName>
            <foreName>Mark</foreName>
            <surname>Batty</surname>
            <initial>M.</initial>
          </persName>
          <persName>
            <foreName>Peter</foreName>
            <surname>Sewell</surname>
            <initial>P.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">44th ACM SIGPLAN Symposium on Principles of Programming Languages (POPL 2017)</title>
        <loc>Paris, France</loc>
        <imprint>
          <publisher>
            <orgName type="organisation">ACM</orgName>
          </publisher>
          <dateStruct>
            <month>January</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01413221" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01413221</ref>
        </imprint>
        <meeting id="cid22344">
          <title>ACM SIGPLAN SIGACT Symposium on Principles of Programming Languages</title>
          <num>44</num>
          <abbr type="sigle">POPL</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid12" type="inproceedings" rend="year" n="cite:kastner:hal-01643290">
      <identifiant type="hal" value="hal-01643290"/>
      <analytic>
        <title level="a">CompCert: Practical Experience on Integrating and Qualifying a Formally Verified Optimizing Compiler</title>
        <author>
          <persName>
            <foreName>Daniel</foreName>
            <surname>Kästner</surname>
            <initial>D.</initial>
          </persName>
          <persName>
            <foreName>Jörg</foreName>
            <surname>Barrho</surname>
            <initial>J.</initial>
          </persName>
          <persName>
            <foreName>Ulrich</foreName>
            <surname>Wünsche</surname>
            <initial>U.</initial>
          </persName>
          <persName>
            <foreName>Marc</foreName>
            <surname>Schlickling</surname>
            <initial>M.</initial>
          </persName>
          <persName>
            <foreName>Bernhard</foreName>
            <surname>Schommer</surname>
            <initial>B.</initial>
          </persName>
          <persName>
            <foreName>Michael</foreName>
            <surname>Schmidt</surname>
            <initial>M.</initial>
          </persName>
          <persName>
            <foreName>Christian</foreName>
            <surname>Ferdinand</surname>
            <initial>C.</initial>
          </persName>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
          <persName key="celtique-2014-idp67080">
            <foreName>Sandrine</foreName>
            <surname>Blazy</surname>
            <initial>S.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">ERTS2 2018 - Embedded Real Time Software and Systems</title>
        <loc>Toulouse, France</loc>
        <imprint>
          <publisher>
            <orgName type="organisation">3AF, SEE, SIE</orgName>
          </publisher>
          <dateStruct>
            <month>January</month>
            <year>2018</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01643290" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01643290</ref>
        </imprint>
        <meeting id="cid68744">
          <title>European Congress on Embedded Real Time Software</title>
          <num>2018</num>
          <abbr type="sigle">ERTS</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid11" type="inproceedings" rend="year" n="cite:kastner:hal-01399482">
      <identifiant type="hal" value="hal-01399482"/>
      <analytic>
        <title level="a">Closing the Gap – The Formally Verified Optimizing Compiler CompCert</title>
        <author>
          <persName>
            <foreName>Daniel</foreName>
            <surname>Kästner</surname>
            <initial>D.</initial>
          </persName>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
          <persName key="celtique-2014-idp67080">
            <foreName>Sandrine</foreName>
            <surname>Blazy</surname>
            <initial>S.</initial>
          </persName>
          <persName>
            <foreName>Bernhard</foreName>
            <surname>Schommer</surname>
            <initial>B.</initial>
          </persName>
          <persName>
            <foreName>Michael</foreName>
            <surname>Schmidt</surname>
            <initial>M.</initial>
          </persName>
          <persName>
            <foreName>Christian</foreName>
            <surname>Ferdinand</surname>
            <initial>C.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">SSS'17: Safety-critical Systems Symposium 2017</title>
        <loc>Bristol, United Kingdom</loc>
        <title level="s">Developments in System Safety Engineering: Proceedings of the Twenty-fifth Safety-critical Systems Symposium</title>
        <imprint>
          <publisher>
            <orgName>CreateSpace</orgName>
          </publisher>
          <dateStruct>
            <month>February</month>
            <year>2017</year>
          </dateStruct>
          <biblScope type="pages">163-180</biblScope>
          <ref xlink:href="https://hal.inria.fr/hal-01399482" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01399482</ref>
        </imprint>
        <meeting id="cid625443">
          <title>Safety-critical Systems Symposium</title>
          <num>2017</num>
          <abbr type="sigle">SSS</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid38" type="inproceedings" rend="year" n="cite:pottier:hal-01417102">
      <identifiant type="hal" value="hal-01417102"/>
      <analytic>
        <title level="a">Verifying a Hash Table and Its Iterators in Higher-Order Separation Logic</title>
        <author>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">Certified Programs and Proofs</title>
        <loc>Paris, France</loc>
        <title level="s">Proceedings of the 6th ACM SIGPLAN Conference on Certified Programs and Proofs (CPP 2017)</title>
        <imprint>
          <dateStruct>
            <month>January</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01417102" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01417102</ref>
        </imprint>
        <meeting id="cid196878">
          <title>International Conference on Certified Programs and Proofs</title>
          <num>1</num>
          <abbr type="sigle">CPP</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid33" type="inproceedings" rend="year" n="cite:raab:hal-01658595">
      <identifiant type="doi" value="10.1007/978-3-319-57735-7_11"/>
      <identifiant type="hal" value="hal-01658595"/>
      <analytic>
        <title level="a">Challenges in Validating FLOSS Conguration</title>
        <author>
          <persName>
            <foreName>Markus</foreName>
            <surname>Raab</surname>
            <initial>M.</initial>
          </persName>
          <persName key="gallium-2017-idp146592">
            <foreName>Gergö</foreName>
            <surname>Barany</surname>
            <initial>G.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">OSS 2017 - The 13th International Conference on Open Source Systems</title>
        <loc>Buenos Aires, Argentina</loc>
        <title level="s">OSS 2017: Open Source Systems: Towards Robust Practices</title>
        <imprint>
          <biblScope type="volume">496</biblScope>
          <publisher>
            <orgName>Springer</orgName>
          </publisher>
          <dateStruct>
            <month>May</month>
            <year>2017</year>
          </dateStruct>
          <biblScope type="pages">101-114</biblScope>
          <ref xlink:href="https://hal.inria.fr/hal-01658595" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01658595</ref>
        </imprint>
        <meeting id="cid294361">
          <title>International Conference on Open Source Systems</title>
          <num>13</num>
          <abbr type="sigle">OSS</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid32" type="inproceedings" rend="year" n="cite:raab:hal-01658620">
      <identifiant type="hal" value="hal-01658620"/>
      <analytic>
        <title level="a">Introducing Context Awareness in Unmodified, Context-unaware Software</title>
        <author>
          <persName>
            <foreName>Markus</foreName>
            <surname>Raab</surname>
            <initial>M.</initial>
          </persName>
          <persName key="gallium-2017-idp146592">
            <foreName>Gergö</foreName>
            <surname>Barany</surname>
            <initial>G.</initial>
          </persName>
        </author>
      </analytic>
      <monogr x-scientific-popularization="no" x-international-audience="yes" x-proceedings="yes" x-invited-conference="no" x-editorial-board="yes">
        <title level="m">ENASE 2017 - 12th International Conference on Evaluation of Novel Approaches to Software Engineering</title>
        <loc>Porto, Portugal</loc>
        <imprint>
          <dateStruct>
            <month>April</month>
            <year>2017</year>
          </dateStruct>
          <biblScope type="pages">1-8</biblScope>
          <ref xlink:href="https://hal.inria.fr/hal-01658620" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01658620</ref>
        </imprint>
        <meeting id="cid625591">
          <title>International Conference on Evaluation of Novel Approaches to Software Engineering</title>
          <num>12</num>
          <abbr type="sigle">ENASE</abbr>
        </meeting>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid35" type="techreport" rend="year" n="cite:leroy:hal-00930213">
      <identifiant type="hal" value="hal-00930213"/>
      <monogr>
        <title level="m">The OCaml system release 4.06: Documentation and user's manual</title>
        <author>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
          <persName key="gallium-2014-idm26976">
            <foreName>Damien</foreName>
            <surname>Doligez</surname>
            <initial>D.</initial>
          </persName>
          <persName>
            <foreName>Alain</foreName>
            <surname>Frisch</surname>
            <initial>A.</initial>
          </persName>
          <persName>
            <foreName>Jacques</foreName>
            <surname>Garrigue</surname>
            <initial>J.</initial>
          </persName>
          <persName key="gallium-2014-idp70256">
            <foreName>Didier</foreName>
            <surname>Rémy</surname>
            <initial>D.</initial>
          </persName>
          <persName>
            <foreName>Jérôme</foreName>
            <surname>Vouillon</surname>
            <initial>J.</initial>
          </persName>
        </author>
        <imprint>
          <publisher>
            <orgName type="institution">Inria</orgName>
          </publisher>
          <dateStruct>
            <month>November</month>
            <year>2017</year>
          </dateStruct>
          <biblScope type="pages">1-726</biblScope>
          <ref xlink:href="https://hal.inria.fr/hal-00930213" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-00930213</ref>
        </imprint>
      </monogr>
      <note type="typdoc">Intern report</note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid37" type="techreport" rend="year" n="cite:leroy:hal-01091802">
      <identifiant type="hal" value="hal-01091802"/>
      <monogr>
        <title level="m">The CompCert C verified compiler: Documentation and user’s manual: Version 3.1</title>
        <author>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
        </author>
        <imprint>
          <publisher>
            <orgName type="institution">Inria</orgName>
          </publisher>
          <dateStruct>
            <month>August</month>
            <year>2017</year>
          </dateStruct>
          <biblScope type="pages">1-68</biblScope>
          <ref xlink:href="https://hal.inria.fr/hal-01091802" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01091802</ref>
        </imprint>
      </monogr>
      <note type="typdoc">Intern report</note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid16" type="techreport" rend="year" n="cite:williams:hal-01628060">
      <identifiant type="hal" value="hal-01628060"/>
      <monogr>
        <title level="m">A Principled Approach to Ornamentation in ML</title>
        <author>
          <persName key="gallium-2014-idp85776">
            <foreName>Thomas</foreName>
            <surname>Williams</surname>
            <initial>T.</initial>
          </persName>
          <persName key="gallium-2014-idp70256">
            <foreName>Didier</foreName>
            <surname>Rémy</surname>
            <initial>D.</initial>
          </persName>
        </author>
        <imprint>
          <publisher>
            <orgName type="institution">Inria</orgName>
          </publisher>
          <dateStruct>
            <month>November</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01628060" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01628060</ref>
        </imprint>
      </monogr>
      <note type="typdoc">Research Report</note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid17" type="misc" rend="year" n="cite:alglave:hal-01668178">
      <identifiant type="hal" value="hal-01668178"/>
      <monogr x-scientific-popularization="yes">
        <title level="m">A formal kernel memory-ordering model (Part 1 and 2)</title>
        <author>
          <persName>
            <foreName>Jade</foreName>
            <surname>Alglave</surname>
            <initial>J.</initial>
          </persName>
          <persName key="gallium-2014-idp66296">
            <foreName>Luc</foreName>
            <surname>Maranget</surname>
            <initial>L.</initial>
          </persName>
          <persName>
            <foreName>Paul</foreName>
            <surname>McKenney</surname>
            <initial>P.</initial>
          </persName>
          <persName>
            <foreName>Alan</foreName>
            <surname>Stern</surname>
            <initial>A.</initial>
          </persName>
          <persName key="gallium-2016-idp159328">
            <foreName>Andrea</foreName>
            <surname>Parri</surname>
            <initial>A.</initial>
          </persName>
        </author>
        <imprint>
          <dateStruct>
            <month>April</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01668178" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01668178</ref>
        </imprint>
      </monogr>
      <note type="bnote">Article published in the online magazine "Linux Weekly News" (LWN), available on the web at <ref xlink:href="https://lwn.net/Articles/718628" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>lwn.<allowbreak/>net/<allowbreak/>Articles/<allowbreak/>718628</ref> and <ref xlink:href="https://lwn.net/Articles/720550" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>lwn.<allowbreak/>net/<allowbreak/>Articles/<allowbreak/>720550</ref></note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid27" type="unpublished" rend="year" n="cite:balestrieri:hal-01664286">
      <identifiant type="hal" value="hal-01664286"/>
      <monogr>
        <title level="m">Generic Programming in OCAML</title>
        <author>
          <persName>
            <foreName>Florent</foreName>
            <surname>Balestrieri</surname>
            <initial>F.</initial>
          </persName>
          <persName key="gallium-2016-idp121360">
            <foreName>Michel</foreName>
            <surname>Mauny</surname>
            <initial>M.</initial>
          </persName>
        </author>
        <imprint>
          <dateStruct>
            <month>March</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01664286" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01664286</ref>
        </imprint>
      </monogr>
      <note type="bnote">working paper or preprint</note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid13" type="unpublished" rend="year" n="cite:barany:hal-01658563">
      <identifiant type="arXiv" value="1708.07854)"/>
      <identifiant type="hal" value="hal-01658563"/>
      <monogr>
        <title level="m">Liveness-Driven Random Program Generation</title>
        <author>
          <persName key="gallium-2017-idp146592">
            <foreName>Gergö</foreName>
            <surname>Barany</surname>
            <initial>G.</initial>
          </persName>
        </author>
        <imprint>
          <dateStruct>
            <month>December</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01658563" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01658563</ref>
        </imprint>
      </monogr>
      <note type="bnote"><ref xlink:href="https://arxiv.org/abs/1709.04421" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>arxiv.<allowbreak/>org/<allowbreak/>abs/<allowbreak/>1709.<allowbreak/>04421</ref> - Pre-proceedings paper presented at the 27th International Symposium on Logic-Based Program Synthesis and Transformation (LOPSTR 2017), Namur, Belgium, 10-12 October 2017 (arXiv:1708.07854)</note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid40" type="misc" rend="year" n="cite:chargueraud:hal-01561094">
      <identifiant type="hal" value="hal-01561094"/>
      <monogr x-scientific-popularization="no">
        <title level="m">VOCAL – A Verified OCAml Library</title>
        <author>
          <persName key="toccata-2014-idp68328">
            <foreName>Arthur</foreName>
            <surname>Charguéraud</surname>
            <initial>A.</initial>
          </persName>
          <persName key="toccata-2014-idp71016">
            <foreName>Jean-Christophe</foreName>
            <surname>Filliâtre</surname>
            <initial>J.-C.</initial>
          </persName>
          <persName key="toccata-2017-idp149456">
            <foreName>Mário</foreName>
            <surname>Pereira</surname>
            <initial>M.</initial>
          </persName>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
        </author>
        <imprint>
          <dateStruct>
            <month>September</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01561094" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01561094</ref>
        </imprint>
      </monogr>
      <note type="bnote">ML Family Workshop 2017</note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid23" type="misc" rend="year" n="cite:chargueraud:hal-01669407">
      <identifiant type="hal" value="hal-01669407"/>
      <monogr x-scientific-popularization="no" x-editorial-board="yes" x-international-audience="yes" x-proceedings="no" x-invited-conference="no">
        <title level="m">Efficient Representations for Large Dynamic Sequences in ML</title>
        <author>
          <persName key="toccata-2014-idp68328">
            <foreName>Arthur</foreName>
            <surname>Charguéraud</surname>
            <initial>A.</initial>
          </persName>
          <persName key="gallium-2014-idp68976">
            <foreName>Mike</foreName>
            <surname>Rainey</surname>
            <initial>M.</initial>
          </persName>
        </author>
        <imprint>
          <dateStruct>
            <month>September</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01669407" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01669407</ref>
        </imprint>
      </monogr>
      <note type="howpublished">ML Family Workshop</note>
      <note type="bnote">Poster</note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid31" type="misc" rend="year" n="cite:leroy:hal-01620870">
      <identifiant type="hal" value="hal-01620870"/>
      <monogr x-scientific-popularization="yes">
        <title level="m">How I found a crash bug with hyperthreading in Intel's Skylake processors</title>
        <author>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
        </author>
        <imprint>
          <dateStruct>
            <month>July</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01620870" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01620870</ref>
        </imprint>
      </monogr>
      <note type="bnote">News article at The Next Web (<ref xlink:href="https://tnw.to/2tJ08uM" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>tnw.<allowbreak/>to/<allowbreak/>2tJ08uM</ref>)</note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid39" type="unpublished" rend="year" n="cite:raab:hal-01658638">
      <identifiant type="hal" value="hal-01658638"/>
      <monogr>
        <title level="m">Introducing Context Awareness in Unmodified, Context-unaware Software</title>
        <author>
          <persName>
            <foreName>Markus</foreName>
            <surname>Raab</surname>
            <initial>M.</initial>
          </persName>
          <persName key="gallium-2017-idp146592">
            <foreName>Gergö</foreName>
            <surname>Barany</surname>
            <initial>G.</initial>
          </persName>
        </author>
        <imprint>
          <dateStruct>
            <month>December</month>
            <year>2017</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01658638" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01658638</ref>
        </imprint>
      </monogr>
      <note type="bnote"><ref xlink:href="https://arxiv.org/abs/1702.06806" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>arxiv.<allowbreak/>org/<allowbreak/>abs/<allowbreak/>1702.<allowbreak/>06806</ref> - working paper or preprint</note>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid22" type="inbook" rend="foot" n="footcite:Acar2014">
      <identifiant type="doi" value="10.1007/978-3-662-44777-2_3"/>
      <analytic>
        <author>
          <persName key="gallium-2014-idm28256">
            <foreName>Umut A.</foreName>
            <surname>Acar</surname>
            <initial>U. A.</initial>
          </persName>
          <persName key="toccata-2014-idp68328">
            <foreName>Arthur</foreName>
            <surname>Charguéraud</surname>
            <initial>A.</initial>
          </persName>
          <persName key="gallium-2014-idp68976">
            <foreName>Mike</foreName>
            <surname>Rainey</surname>
            <initial>M.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="m">Theory and Practice of Chunked Sequences</title>
        <editor role="editor">
          <persName>
            <foreName>Andreas S.</foreName>
            <surname>Schulz</surname>
            <initial>A. S.</initial>
          </persName>
          <persName>
            <foreName>Dorothea</foreName>
            <surname>Wagner</surname>
            <initial>D.</initial>
          </persName>
        </editor>
        <imprint>
          <publisher>
            <orgName>Springer Berlin Heidelberg<address><addrLine>Berlin, Heidelberg</addrLine></address></orgName>
          </publisher>
          <dateStruct>
            <year>2014</year>
          </dateStruct>
          <biblScope type="pages">25–36</biblScope>
          <ref xlink:href="https://doi.org/10.1007/978-3-662-44777-2_3" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1007/<allowbreak/>978-3-662-44777-2_3</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid19" type="article" rend="foot" n="footcite:acar:hal-01409069">
      <identifiant type="doi" value="10.1017/S0956796816000101"/>
      <identifiant type="hal" value="hal-01409069"/>
      <analytic>
        <title level="a">Oracle-Guided Scheduling for Controlling Granularity in Implicitly Parallel Languages</title>
        <author>
          <persName key="gallium-2014-idm28256">
            <foreName>Umut A</foreName>
            <surname>Acar</surname>
            <initial>U. A.</initial>
          </persName>
          <persName key="toccata-2014-idp68328">
            <foreName>Arthur</foreName>
            <surname>Charguéraud</surname>
            <initial>A.</initial>
          </persName>
          <persName key="gallium-2014-idp68976">
            <foreName>Mike</foreName>
            <surname>Rainey</surname>
            <initial>M.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="j">Journal of Functional Programming</title>
        <imprint>
          <biblScope type="volume">26</biblScope>
          <dateStruct>
            <month>November</month>
            <year>2016</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01409069" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01409069</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid26" type="inproceedings" rend="foot" n="footcite:balestrieri:hal-01413061">
      <identifiant type="hal" value="hal-01413061"/>
      <analytic>
        <title level="a">Generic Programming in OCaml</title>
        <author>
          <persName>
            <foreName>Florent</foreName>
            <surname>Balestrieri</surname>
            <initial>F.</initial>
          </persName>
          <persName key="gallium-2016-idp121360">
            <foreName>Michel</foreName>
            <surname>Mauny</surname>
            <initial>M.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="m">OCaml 2016 - The OCaml Users and Developers Workshop</title>
        <loc>Nara, Japan</loc>
        <imprint>
          <dateStruct>
            <month>September</month>
            <year>2016</year>
          </dateStruct>
          <ref xlink:href="https://hal.inria.fr/hal-01413061" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>hal.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>hal-01413061</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid3" type="inproceedings" rend="foot" n="footcite:2003-CDuce">
      <analytic>
        <title level="a">CDuce: an XML-centric general-purpose language</title>
        <author>
          <persName>
            <foreName>Véronique</foreName>
            <surname>Benzaken</surname>
            <initial>V.</initial>
          </persName>
          <persName>
            <foreName>Giuseppe</foreName>
            <surname>Castagna</surname>
            <initial>G.</initial>
          </persName>
          <persName>
            <foreName>Alain</foreName>
            <surname>Frisch</surname>
            <initial>A.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <editor role="editor">
          <persName>
            <foreName>Colin</foreName>
            <surname>Runciman</surname>
            <initial>C.</initial>
          </persName>
          <persName>
            <foreName>Olin</foreName>
            <surname>Shivers</surname>
            <initial>O.</initial>
          </persName>
        </editor>
        <title level="m">Proceedings of the Eighth ACM SIGPLAN International Conference on Functional Programming</title>
        <imprint>
          <publisher>
            <orgName>ACM</orgName>
          </publisher>
          <dateStruct>
            <year>2003</year>
          </dateStruct>
          <biblScope type="pages">51–63</biblScope>
          <ref xlink:href="https://www.lri.fr/~benzaken/papers/icfp03.ps" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">https://<allowbreak/>www.<allowbreak/>lri.<allowbreak/>fr/<allowbreak/>~benzaken/<allowbreak/>papers/<allowbreak/>icfp03.<allowbreak/>ps</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid20" type="inproceedings" rend="foot" n="footcite:ellm07-snzi">
      <analytic>
        <title level="a">SNZI: Scalable NonZero Indicators</title>
        <author>
          <persName>
            <foreName>Faith</foreName>
            <surname>Ellen</surname>
            <initial>F.</initial>
          </persName>
          <persName>
            <foreName>Yossi</foreName>
            <surname>Lev</surname>
            <initial>Y.</initial>
          </persName>
          <persName>
            <foreName>Victor</foreName>
            <surname>Luchangco</surname>
            <initial>V.</initial>
          </persName>
          <persName>
            <foreName>Mark</foreName>
            <surname>Moir</surname>
            <initial>M.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="m">Proceedings of the Twenty-sixth Annual ACM Symposium on Principles of Distributed Computing</title>
        <title level="s">PODC '07</title>
        <imprint>
          <dateStruct>
            <year>2007</year>
          </dateStruct>
          <biblScope type="pages">13–22</biblScope>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid2" type="article" rend="foot" n="footcite:2003-Hosoya-Pierce">
      <identifiant type="doi" value="10.1145/767193.767195"/>
      <analytic>
        <title level="a">XDuce: A Statically Typed XML Processing Language</title>
        <author>
          <persName>
            <foreName>Haruo</foreName>
            <surname>Hosoya</surname>
            <initial>H.</initial>
          </persName>
          <persName>
            <foreName>Benjamin C.</foreName>
            <surname>Pierce</surname>
            <initial>B. C.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="j">ACM Transactions on Internet Technology</title>
        <imprint>
          <biblScope type="volume">3</biblScope>
          <biblScope type="number">2</biblScope>
          <dateStruct>
            <year>2003</year>
          </dateStruct>
          <biblScope type="pages">117–148</biblScope>
          <ref xlink:href="http://doi.acm.org/10.1145/767193.767195" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>doi.<allowbreak/>acm.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1145/<allowbreak/>767193.<allowbreak/>767195</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid30" type="article" rend="foot" n="footcite:2012-lamport-proof">
      <identifiant type="doi" value="10.1007/s11784-012-0071-6"/>
      <analytic>
        <title level="a">How to write a 21st century proof</title>
        <author>
          <persName>
            <foreName>Leslie</foreName>
            <surname>Lamport</surname>
            <initial>L.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="j">Journal of Fixed Point Theory and Applications</title>
        <imprint>
          <biblScope type="volume">11</biblScope>
          <dateStruct>
            <year>2012</year>
          </dateStruct>
          <biblScope type="pages">43–63</biblScope>
          <ref xlink:href="http://dx.doi.org/10.1007/s11784-012-0071-6" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>dx.<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1007/<allowbreak/>s11784-012-0071-6</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid0" type="manual" rend="foot" n="footcite:0000-Ocaml-manual">
      <monogr>
        <title level="m">The Objective Caml system, documentation and user's manual – release 4.02</title>
        <author>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
          <persName key="gallium-2014-idm26976">
            <foreName>Damien</foreName>
            <surname>Doligez</surname>
            <initial>D.</initial>
          </persName>
          <persName>
            <foreName>Jacques</foreName>
            <surname>Garrigue</surname>
            <initial>J.</initial>
          </persName>
          <persName key="gallium-2014-idp70256">
            <foreName>Didier</foreName>
            <surname>Rémy</surname>
            <initial>D.</initial>
          </persName>
          <persName>
            <foreName>Jérôme</foreName>
            <surname>Vouillon</surname>
            <initial>J.</initial>
          </persName>
        </author>
        <imprint>
          <publisher>
            <orgName type="organisation">Inria</orgName>
          </publisher>
          <dateStruct>
            <month>August</month>
            <year>2014</year>
          </dateStruct>
          <ref xlink:href="http://caml.inria.fr/pub/docs/manual-ocaml-4.02/" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>caml.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>pub/<allowbreak/>docs/<allowbreak/>manual-ocaml-4.<allowbreak/>02/</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid7" type="article" rend="foot" n="footcite:2003-Leroy-JAR">
      <identifiant type="doi" value="10.1023/A:1025055424017"/>
      <analytic>
        <title level="a">Java bytecode verification: algorithms and formalizations</title>
        <author>
          <persName key="gallium-2014-idm29528">
            <foreName>Xavier</foreName>
            <surname>Leroy</surname>
            <initial>X.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="j">Journal of Automated Reasoning</title>
        <imprint>
          <biblScope type="volume">30</biblScope>
          <biblScope type="number">3–4</biblScope>
          <dateStruct>
            <year>2003</year>
          </dateStruct>
          <biblScope type="pages">235–269</biblScope>
          <ref xlink:href="http://dx.doi.org/10.1023/A:1025055424017" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>dx.<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1023/<allowbreak/>A:1025055424017</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid1" type="book" rend="foot" n="footcite:TAPL">
      <monogr>
        <title level="m">Types and Programming Languages</title>
        <author>
          <persName>
            <foreName>Benjamin C.</foreName>
            <surname>Pierce</surname>
            <initial>B. C.</initial>
          </persName>
        </author>
        <imprint>
          <publisher>
            <orgName>MIT Press</orgName>
          </publisher>
          <dateStruct>
            <year>2002</year>
          </dateStruct>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid5" type="article" rend="foot" n="footcite:2001-Pottier-IC">
      <analytic>
        <title level="a">Simplifying subtyping constraints: a theory</title>
        <author>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="j">Information and Computation</title>
        <imprint>
          <biblScope type="volume">170</biblScope>
          <biblScope type="number">2</biblScope>
          <dateStruct>
            <year>2001</year>
          </dateStruct>
          <biblScope type="pages">153–183</biblScope>
          <ref xlink:href="http://gallium.inria.fr/~fpottier/publis/fpottier-ic01.ps.gz" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>gallium.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>~fpottier/<allowbreak/>publis/<allowbreak/>fpottier-ic01.<allowbreak/>ps.<allowbreak/>gz</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid8" type="article" rend="foot" n="footcite:2003-Pottier-Simonet-TOPLAS">
      <identifiant type="doi" value="10.1145/596980.596983"/>
      <analytic>
        <title level="a">Information Flow Inference for ML</title>
        <author>
          <persName key="gallium-2014-idp67496">
            <foreName>François</foreName>
            <surname>Pottier</surname>
            <initial>F.</initial>
          </persName>
          <persName>
            <foreName>Vincent</foreName>
            <surname>Simonet</surname>
            <initial>V.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="j">ACM Transactions on Programming Languages and Systems</title>
        <imprint>
          <biblScope type="volume">25</biblScope>
          <biblScope type="number">1</biblScope>
          <dateStruct>
            <month>January</month>
            <year>2003</year>
          </dateStruct>
          <biblScope type="pages">117–158</biblScope>
          <ref xlink:href="http://dx.doi.org/10.1145/596980.596983" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>dx.<allowbreak/>doi.<allowbreak/>org/<allowbreak/>10.<allowbreak/>1145/<allowbreak/>596980.<allowbreak/>596983</ref>
        </imprint>
      </monogr>
    </biblStruct>
    
    <biblStruct id="gallium-2017-bid4" type="inproceedings" rend="foot" n="footcite:1997-Remy-Vouillon">
      <analytic>
        <title level="a">Objective ML: A simple object-oriented extension to ML</title>
        <author>
          <persName key="gallium-2014-idp70256">
            <foreName>Didier</foreName>
            <surname>Rémy</surname>
            <initial>D.</initial>
          </persName>
          <persName>
            <foreName>Jérôme</foreName>
            <surname>Vouillon</surname>
            <initial>J.</initial>
          </persName>
        </author>
      </analytic>
      <monogr>
        <title level="m">24th ACM Conference on Principles of Programming Languages</title>
        <imprint>
          <publisher>
            <orgName>ACM Press</orgName>
          </publisher>
          <dateStruct>
            <year>1997</year>
          </dateStruct>
          <biblScope type="pages">40–53</biblScope>
          <ref xlink:href="http://gallium.inria.fr/~remy/ftp/objective-ml!popl97.pdf" location="extern" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://<allowbreak/>gallium.<allowbreak/>inria.<allowbreak/>fr/<allowbreak/>~remy/<allowbreak/>ftp/<allowbreak/>objective-ml!popl97.<allowbreak/>pdf</ref>
        </imprint>
      </monogr>
    </biblStruct>
  </biblio>
</raweb>
