  Tierless Web programming languages allow programmers to combine client-side
and server-side programming in a single program. Programmers can then define
components with both client and server parts and get flexible, efficient and
typesafe client-server communications. However, the expressive client-server
features found in most tierless languages are not necessarily compatible with
functionalities found in many mainstream languages. In particular, we would
like to benefit from type safety, an efficient execution, static compilation,
modularity and separate compilation.
  In this paper, we propose Eliom, an industrial-strength tierless functional
Web programming language which extends OCaml with support for rich
client/server interactions. It allows to build whole applications as a single
distributed program, in which it is possible to define modular tierless
libraries with both server and client behaviors and combine them effortlessly.
Eliom is the only language that combines type-safe and efficient client/server
communications with a static compilation model that supports separate
compilation and modularity. It also supports excellent integration with OCaml,
allowing to transparently leverage its ecosystem.
  To achieve all these features, Eliom borrows ideas not only from distributed
programming languages, but also from meta-programming and modern module
systems. We present the design of Eliom, how it can be used in practice and its
formalization; including its type system, semantics and compilation scheme. We
show that this compilation scheme preserves typing and semantics, and that it
supports separate compilation.
