-
Notifications
You must be signed in to change notification settings - Fork 0
Playground for the development of simple compilers, VMs and various experiments.
License
codepr/machines
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Machines - Educational Virtual Machine Project
==============================================
Playground for the development of simple compilers, an educational exploration
of virtual machine architectures and language implementation. This project
demonstrates two distinct VM paradigms with complete compilation toolchains
from high-level languages down to bytecode execution.
NOTE - it's a work in progress, still squashing bugs here and there
* Overview
This repository contains two fully functional virtual machines built from
scratch in C, along with compilers that target them from higher-level
languages. The project showcases the entire compilation pipeline: lexing,
parsing, AST generation, code generation, bytecode serialization, and
execution.
* Virtual Machines
アトム (Atom) - Stack-Based VM
A minimalist stack-based virtual machine inspired by stack machine
architectures and functional programming principles.
Architecture:
- Word Size: 64-bit unsigned integers
- Stack: 256 words
- Memory: 65,535 words
- Execution Model: Push/pop operations on implicit stack
- Instruction Set: 22 operations
Key Features:
- Stack-based arithmetic and control flow
- Function calls with return stack
- Tuple data structures
- Memory-mapped data segment
Instruction Categories:
- Memory Operations: LOAD, STORE, PUSH
- Arithmetic: ADD, SUB, MUL, DIV, INC
- Control Flow: JMP, JEQ, JNE, CALL, RET
- Data Structures: MAKE_TUPLE
- I/O: PRINT
プルート (Pluto) - Register-Based VM
A register-based virtual machine modeled after x86-64 architecture with
simplified instruction encoding and 4 general-purpose registers.
Architecture:
- Word Size: 64-bit signed integers
- Registers: 4 GP registers (AX, BX, CX, DX) + PC, SP, Flags
- Stack: 2,048 words
- Memory: 32KB addressable
- Execution Model: Explicit register manipulation
- Instruction Set: 29 operations
Key Features:
- Multiple addressing modes (register, immediate, memory, indirect)
- Flag register (Zero, Negative, Positive)
- System call interface (read, write, atoi, exit)
- Rich conditional branching
Instruction Categories:
- Data Movement: MOV, PSH, POP
- Arithmetic: ADD, SUB, MUL, DIV, MOD, INC, DEC
- Bitwise: AND, BOR, XOR, NOT, SHL, SHR
- Comparison: CMP
- Control Flow: JMP, JEQ, JNE, JLE, JLT, JGE, JGT, CALL, RET
- System: SYSCALL
* Compilation Pipeline
High-Level Language (LISP/StackLang)
↓ [Ruby Lexer]
Tokens
↓ [Ruby Parser]
Abstract Syntax Tree
↓ [Ruby Compiler]
Assembly (.atom/.pluto)
↓ [C Assembler]
Bytecode (binary format)
↓ [C VM Interpreter]
Execution & Output
* Building
Each VM can be built independently:
make -C atom-vm
make -C pluto-vm
* Running Examples
Pluto VM
./pluto-vm/pluto-vm examples/fact.pluto # Factorial calculation
./pluto-vm/pluto-vm examples/mul.pluto # Interactive multiplication
Key Implementation Details
==========================
Atom VM:
- Bytecode serialization with 8-byte instruction encoding
- PC-addressed assembly with label resolution
- Call stack for function returns
- Separate data and code segments
Pluto VM:
- Flexible operand encoding (register/immediate/address/indirect)
- Flag register for conditional execution
- System call interface for I/O operations
- Data directives: db, dw, dd, dq
Educational Goals
=================
This project demonstrates:
1. Two VM Paradigms: Stack vs. register-based architectures
2. Toolchain: From source code to execution
3. Language Implementation: Lexing, parsing, compilation, and code generation
4. Low-Level Programming: Memory management, bytecode design, instruction encoding
About
Playground for the development of simple compilers, VMs and various experiments.
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published