• Stars
    star
    210
  • Rank 181,583 (Top 4 %)
  • Language
    Python
  • Created over 6 years ago
  • Updated about 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A basic x86-64 JIT compiler written from scratch in stock Python

MiniJIT

Contains code for the posts

You need a UNIX/POSIX system and an x86-64 compatible CPU. I've tested this on Linux and macOS, using Python 2.7 and 3+

The ~500 lines of code relies only on standard Python libraries and contains a Python bytecode converter, peephole optimizer and x86-64 machine code assembler. The code is meant to be simple to understand and pedagogical.

Finally, there is a decorator that automatically swaps out Python functions with native code:

>>> from jitcompiler import jit, disassemble
>>> @jit
... def foo(a, b): return a + b
... 
--- Installing JIT for <function foo at 0x10bc48c08>
>>> foo(10, -2)
--- JIT-compiling <function foo at 0x10bc48c08>
8
>>> print(disassemble(foo))
0x10bb3c000 48 89 fb       mov rbx, rdi
0x10bb3c003 48 89 f0       mov rax, rsi
0x10bb3c006 48 01 d8       add rax, rbx
0x10bb3c009 c3             ret 

How to run tests

The first one patches up some machine code and runs it at runtime

$ python mj.py

The second one JIT compiles Python bytecode to machine code at runtime

$ python tests.py

If you have the capstone module installed, it will display an in-memory disassembly as well.

You can also run the decorator test. It defines a function like this

import jitcompiler

#...

@jitcompiler.jit
def foo(a, b):
    return a*a - b*b

On the first call to foo, it will be compiled to native code and swap out the original Python function. It treats all arguments as signed 64-bit integers. If you have the Capstone module installed, it will also print a disassembly. To run:

$ python test-decorator.py
Definition point of foo

Installing JIT for <function foo at 0x1f855f0>

Calling foo

JIT-compiling <function foo at 0x1f855f0>
Installed native code for <function foo at 0x1f855f0>
Calling function <CFunctionType object at 0x7f867642b600>
foo(1, 2) => -3
Calling function <CFunctionType object at 0x7f867642b600>
foo(2, 3) => -5

Disassembly of foo

0x7f86765f9000 48 89 fb       mov rbx, rdi
0x7f86765f9003 48 89 f8       mov rax, rdi
0x7f86765f9006 48 0f af c3    imul rax, rbx
0x7f86765f900a 50             push rax
0x7f86765f900b 48 89 f3       mov rbx, rsi
0x7f86765f900e 48 89 f0       mov rax, rsi
0x7f86765f9011 48 0f af c3    imul rax, rbx
0x7f86765f9015 48 89 c3       mov rbx, rax
0x7f86765f9018 58             pop rax
0x7f86765f9019 48 29 d8       sub rax, rbx
0x7f86765f901c c3             ret

If you want to get serious about this

References

License

Put in the public domain in 2017 by the author Christian Stigen Larsen

More Repositories

1

jp2a

Converts jpg images to ASCII
HTML
608
star
2

mandelbrot-js

Fast rendering of the Mandelbrot set in HTML5 canvas using JavaScript
JavaScript
344
star
3

wpm

Typeracer-like console app for measuring your WPM
Python
318
star
4

stack-machine

A simple stack-based virtual machine in C++ with a Forth like programming language
C++
162
star
5

python-simple-vm

A simple virtual machine w/constant folding implemented in Python
Python
117
star
6

arv

A fast 23andMe DNA parser and inferrer for Python
C++
114
star
7

mersenne-twister

This Mersenne Twister is a fast pseudo-random number generator (PRNG) in C++
C++
83
star
8

dna-traits

A fast 23andMe genome text file parser, now superseded by arv
Python
65
star
9

mickey-scheme

Mickey Scheme is an interpreter for R7RS Scheme written in pure C++
C++
62
star
10

crianza

A stack machine VM, interpreter and genetic programming library
Python
47
star
11

miller-rabin

The Miller-Rabin probabilistic primality test in C++ w/GMP
C++
30
star
12

libunwind-examples

A few libunwind examples
C++
27
star
13

lua-cpp

Tutorial code for Lua and C++ integration
C++
20
star
14

luajit-cpp

Example C++ shared library loaded in LuaJIT through FFI
C++
19
star
15

brainfuck-jit

Brainfuck JIT VMs
Python
17
star
16

c64-examples

Simple C64 programs compiled from the command line
Assembly
15
star
17

lyn

Python bindings for GNU Lightning
Python
9
star
18

vimp

Command line plugin manager for vim
Python
8
star
19

busy-beaver

Calculates the uncomputable Busy Beaver Ξ£-function
Python
7
star
20

gameboy

A Gameboy emulator in Python
Python
7
star
21

eulers-totient-function

A fast implementation of Euler's totient function phi(n) in C++
C++
7
star
22

skall

SKALL is a minimal, experimental UNIX shell
C
6
star
23

cellular-automaton

Cellular automaton using the HTML5 canvas.
6
star
24

nash-cipher

John Nash's encryption scheme from his 1955 letter to the NSA in C++.
C++
5
star
25

chicken-play

Chicken Scheme HTML5 rendering library
Scheme
3
star
26

poseur

Simple presentation tool
Python
3
star
27

vev

Simple HTTP server request routing in Python
Python
3
star
28

mickey-scheme-historic

Mickey Scheme is an interpreter for R7RS Scheme written in C++
C++
3
star
29

rosalind

Solutions to the Rosalind.info puzzles
C++
2
star
30

impute-me

This is the code behind the www.impute.me site. It contains algorithms for imputing personal genomes, as well as a range of custom-made analysis for genetics-based disease and health.
R
2
star
31

elv

Parses bank CSV files
Python
1
star
32

q

Prints C/C++ definitions from current directory
Python
1
star
33

latex-template

A small LaTeX template to get you started
TeX
1
star
34

presentation-vm

The presentation "How to make a simple virtual machine"
Brainfuck
1
star
35

project-euler

My Project Euler solutions
C++
1
star
36

dotfiles

Collection of my personal dot-files
Shell
1
star
37

armstrong-notes

Notes for M.A. Armstrong's Groups and Symmetry
TeX
1
star
38

py-html-generator

A quick-and-dirty HTML document generator and renderer
Python
1
star
39

callcc-c

Experimental undelimited continuations in C via x86-64 assembly
C
1
star