The Trazodone project, is a Higher-Order Virtual Machine (HVM) backend for LLVM provides a powerful and efficient way to generate code for virtual machines. It leverages the LLVM infrastructure to optimize and generate high-quality code from a high-level representation. It's a cutting-edge component that enables the generation of optimized code for virtual machines. It seamlessly integrates into the LLVM compiler infrastructure, leveraging its robust optimization and code generation capabilities.
At its core, the HVM backend operates on a high-level representation of code, allowing developers to express complex virtual machine instructions and operations in a concise and intuitive manner. This representation serves as an abstraction layer, shielding developers from low-level details while enabling them to write efficient and expressive code.
The HVM backend takes advantage of LLVM's powerful optimization passes, such as inlining, loop unrolling, and constant propagation, to analyze and transform the high-level representation into highly optimized code. This optimization process improves performance, reduces memory usage, and enhances overall execution efficiency.
Moreover, Trazodone incorporates sophisticated just-in-time (JIT) compilation techniques. This means that virtual machine code can be dynamically compiled and optimized at runtime, leading to improved performance and adaptability. JIT compilation enables efficient execution of dynamically generated code, such as just-in-time bytecode compilers or dynamic language interpreters.
The current command-line interface have the repl
and eval
function, but the repl
currently, doesn't run :/
Usage: trazodone <COMMAND>
Commands:
repl Joins the HVM Repl
eval Compile a file and evaluate in JIT or Evaluation mode to Interaction Nets
help Print this message or the help of the given subcommand(s)
Options:
To eval a file, it's simple to use, just run the following command:
$ trazodone eval -f example.brex
And use
$ trazodone eval -f example.brex --use-eval
To evaluate the program without using the LLVM stuff.
The eval help menu, is the following:
Compile a file and evaluate in JIT or Evaluation mode to Interaction Nets
Usage: trazodone eval [OPTIONS]
Options:
-s, --heap-size <HEAP_SIZE> Set the heap size (in 64-bit nodes) [default: auto]
-t, --thread-ids <THREAD_IDS> Set the number of threads to use [default: auto]
-c, --show-cost Shows the number of graph rewrites performed
-d, --debug Toggles debug mode, showing each reduction step
-e, --use-eval Toggles evaluation mode, which uses the evaluation strategy instead of the JIT
-f, --file <FILE> A "file.hvm" to load
-m, --main <MAIN> The expression to run
-h, --help Print help
-V, --version Print version
- Control-Flow Graph representation
- Different trees between Control-Flow Graph and Imperative code
- Codegen for LLVM
- Simple command-line interface
- Evaluator It's meant to be used when testing the Intermediate Representation.
- Super position and duplication
- Inlining operations like
U60.if
- Transmutation optimization
- Some optimizations in
alloc
and reusing code - JIT interpreter Currently have a segfault issue
- AOT Compiler
- Split the Runtime code of the HVM into
runtime
,cli
andcompiler
Theruntime
crate, should be linked with the target binary
- Split the Runtime code of the HVM into
- Creating an Intermediate Representation Creating an Intermediate Representation is really important for generating code, as it's structure simplifies the code into a code that's an intermediate between Turing Machines and Interaction Nets.
- REPL for HVM
- Unit testing
- Bridge between Rust and LLVM to test eval without having to use an
Arc
- Stop using
PRECOMP
const from HVM project ThePRECOMP
is a global constant that holds all compiled stuff with HVM, but it's not suitable for using it with JIT - Compiling to LLVM properly
- Compile
apply
function code - Compile
visit
function code - Compile
reducer
function code
- Compile