  Instead of a monolithic programming language trying to cover all features of
interest, some programming systems are designed by combining together simpler
languages that cooperate to cover the same feature space. This can improve
usability by making each part simpler than the whole, but there is a risk of
abstraction leaks from one language to another that would break expectations of
the users familiar with only one or some of the involved languages.
  We propose a formal specification for what it means for a given language in a
multi-language system to be usable without leaks: it should embed into the
multi-language in a fully abstract way, that is, its contextual equivalence
should be unchanged in the larger system.
  To demonstrate our proposed design principle and formal specification
criterion, we design a multi-language programming system that combines an
ML-like statically typed functional language and another language with linear
types and linear state. Our goal is to cover a good part of the expressiveness
of languages that mix functional programming and linear state (ownership), at
only a fraction of the complexity. We prove that the embedding of ML into the
multi-language system is fully abstract: functional programmers should not fear
abstraction leaks. We show examples of combined programs demonstrating in-place
memory updates and safe resource handling, and an implementation extending
OCaml with our linear language.
