Many dynamic languages such as Ruby, Python and Perl offer some kind of functionality for writing parts of applications in a lowerlevel language such as C. These C extension modules are usually written against the API of an interpreter, which provides access to the higher-level language’s internal data structures. Alternative implementations of the high-level languages often do not support such C extensions because implementing the same API as in the original implementations is complicated and limits performance. In this paper we describe a novel approach for modular composition of languages that allows dynamic languages to support C extensions through interpretation. We propose a flexible and reusable cross-language mechanism that allows composing multiple language interpreters, which run on the same VM and share form of intermediate representation – in this case abstract syntax trees. This mechanism allows us to efficiently exchange runtime data across different interpreters a...