rubyx/lib/risc
Torsten Rüger e61c5d4a55 Simplify Parfait booting
Since some weeks, Parfait uses instance variables instead of generated attribute getters (that needed type)
This makes it possible to simplify the boot process, getting rid of separate boot Space and class versions.
It is still quite order dependent, but all "normal" ruby code, (less magic) so easier to understand.

Also moved all code that can never run at runtime into the adapter. This included Space and Object new, space as the space will only ever be created at compile time and object, since that is quite different at run-time (which is where i am working towards)
2019-09-22 19:10:47 +03:00
..
instructions tests for mom check instructions 2019-09-15 19:57:15 +03:00
position Fixed almost all but Interpreter 2019-08-13 00:13:29 +03:00
assembler.rb generalize assemblers to use callables 2018-07-30 10:23:42 +03:00
binary_writer.rb jump was written off the end of binary code, fixed 2018-05-28 11:45:04 +03:00
block_compiler.rb Remove dead code 2019-08-18 10:19:52 +03:00
builder.rb generalize get_main and get_init to get_method 2019-09-15 12:58:43 +03:00
callable_compiler.rb generalize get_main and get_init to get_method 2019-09-15 12:58:43 +03:00
collector.rb fixes #26 2019-07-28 16:42:40 +03:00
fake_memory.rb cache index resolution 2018-08-12 13:09:34 +03:00
instruction.rb tests for mom check instructions 2019-09-15 19:57:15 +03:00
interpreter_platform.rb fix platform derivation and some tests 2018-07-01 21:27:27 +03:00
interpreter.rb get method name out from method_missing 2019-09-17 20:18:00 +03:00
linker.rb add a statistics command to compiler 2019-09-05 13:25:40 +03:00
method_compiler.rb Remove dead code 2019-08-18 10:19:52 +03:00
parfait_adapter.rb Simplify Parfait booting 2019-09-22 19:10:47 +03:00
parfait_boot.rb Simplify Parfait booting 2019-09-22 19:10:47 +03:00
platform.rb platform helper 2018-07-02 09:36:29 +03:00
README.md litte bit of docs 2018-08-24 18:49:44 +03:00
register_value.rb Changing the call setup and return to be more efficient 2019-08-23 15:30:27 +03:00
risc_collection.rb cache booted functions 2019-09-07 17:56:06 +03:00
text_writer.rb add a statistics command to compiler 2019-09-05 13:25:40 +03:00

Risc Machine

The Risc Machine, is an abstract machine with registers. Think of it as an arm machine with normal instruction names. It is not however an abstraction of existing hardware, but only of that subset that we need.

Our primary objective is to compile typed code to this level, so the register machine has:

  • object access instructions
  • object load
  • object oriented call semantics
  • extended (and extensible) branching
  • normal integer operators

All data is in objects.

The register machine is aware of Parfait objects, and specifically uses Message and Frame to express call semantics.

Calls and syscalls

The Risc Machine only uses 1 fixed register, the currently worked on Message. (and assumes a program counter and flags, neither of which are directly manipulated)

There is no stack, rather messages form a linked list, and preparing to call, the data is pre-filled into the next message. Calling then means moving the new message to the current one and jumping to the address of the method. Returning is the somewhat reverse process.

Syscalls are implemented by one Syscall instruction. The Risc machine does not specify/limit the meaning or number of syscalls. This is implemented by the level below, eg the arm/interpreter.

Interpreter

There is an interpreter that can interpret programs compiled to the risc instruction set. This is very handy for debugging (and nothing else).

Even more handy is the graphical interface for the interpreter, which is in it's own repository: rubyx-debugger.

Arm / Elf

There is also a (very straightforward) transformation to arm instructions. Together with the also quite minimal elf module, arm binaries can be produced.

These binaries have no external dependencies and in fact can not even call c at the moment (only syscalls :-)).