10 releases

Uses new Rust 2021

0.2.0 Feb 2, 2022
0.1.8 Feb 25, 2022
0.1.7 Jan 6, 2022
0.1.6 Oct 14, 2021
0.1.4 Sep 29, 2021

#393 in Development tools

BSD-2-Clause-Patent

350KB
7.5K SLoC

Mijit

An experimental JIT compiler generator.

Mijit consists of the following components:

  • A domain-specific language ("Mijit code") that is particularly amenable to optimising, and barely expressive enough for writing interpreters.
  • A back-end that lowers Mijit code to machine code (in RAM) and executes it.
  • A profile-guided optimizer that reads and writes Mijit code.

Use

Suppose you are writing a high-level programming language. It compiles to some kind of virtual code, which runs on an interpreter, written in C, say. You want it to go faster.

You write a Rust program that uses crate mijit. You implement trait Machine, porting the performance- critical parts of your interpreter to Mijit code. Mijit provides you with an equivalent JIT compiler. You wrap it in an ergonomic Rust API that is specific to your language. You write C bindings for your Rust API. You drop it in as a replacement for your interpreter, reusing the existing non-performance- critical parts.

Examples

The best example of using Mijit is Beetle. Pass the "--with-mijit" flag to its "./configure" to enable the Mijit backend. A cut-down version of Beetle is included in Mijit as a unit test.

Status

Working, but unfinished. The specification of Mijit code is in flux. There are two back-ends, for x86_64 and AArch64. Other 64-bit targets are planned. Mijit can run some programs, but the generated code is poor, and it only runs at about 40% of the speed of compiled C. A rough outline of the optimizer has been written written, but is not yet enabled, and so far it doesn't know many optimizations. The profiler is not written yet.

Versions

Versions 0.1.x will remain compatible with v0.1.6, but won't necessarily benefit from future improvements to the rest of Mijit. Versions 0.2.0 onwards will improve the API and the internals in backwards-incompatible ways. As long as the version number begins with a "0" we reserve the right to change the design arbitrarily.

Building

    $ cargo build --release

Running

Mijit is primarily a library. However, it does provide some executable tests.

    $ cargo test

Dependencies

~500–670KB
~12K SLoC