So You Want to Build a Language VM - Part 17 - Basic Threads
Adds executing a program in separate OS threads
Intro
Hey everyone! In this tutorial, we’re going to start adding in multithreading to the Iridium VM. Please make sure you are starting from this point in the code: https://gitlab.com/subnetzero/iridium/tags/0.0.16. Going forward, I’m going to make a tag per tutorial so that everyone starts from a common point. === A Note on Assumed Knowledge I write these tutorials target towards more advanced users. I sometimes skip small steps, such as "add in this line to file X".
So You Want to Build a Language VM - Part 16 - String Constants And More
Two-pass assembler, using and printing string constants, and other loose ends
Home Stretch
This is going to be a longer post. In it, we’ll wrap up our two-pass assembler, add a PRTS
opcode for printing, and tie up some other loose ends. At the end, we should have an interpreter with a good amount of functionality and a simple assembly language. We are, of course, far from done with the project. I want to work on a different tutorial series for a bit, then we’ll continue with Iridium.
=== Quick Change
Add the following dependencies in your Cargo.toml. We’ll need them later:
So You Want to Build a Language VM - Part 15 - Assembler CLI Improvements
Makes the CLI interface a bit more robust and useful
CLI Improvements
Having to start the interpreter, then type .load_file
, etc is cumbersome. Let’s change it so that the VM tries to execute the file given to it as an argument. There’s a super handy-dandy crate called clap
in Rust that will make this trivial. The behavior we want is:
If the user types
iridium
and nothing else, they will go directly to aREPL
If the user types
iridium /path/to/valid/*.iasm
, that is, they want to execute a file of code directly, it should do that then exitNoteSo You Want to Build a Language VM - Part 14 - Symbol Tables
Adds in a symbol table to our VM
Assembler Struct
Welcome back! When we last left our intrepid readers, we were about to write an assembler struct.
But why? What does it do?
What does it all mean?! Why don’t more people love interrobangs?! Ahem.
So You Want to Build a Language VM - Part 13 - Labels
Adds in labels to our VM
Intro
So You Want to Build a Language VM - Interlude 02
Adds in strings to our VM
Hello!
So You Want to Build a Language VM - Part 12 - Strings
Adds in strings to our VM
What are Strings?
This may shock you, but they are a bit more complicated than they might seem. Since a computer cares about bytes, it has no concept of the letter
s
,!
or any other letter. These having meaning to us humans. But we want our users to be able to give input and read output without having to do it all in hex. The solution is to use some sort of character encoding. This maps a particular character to a number. You’ll hear two common encodings mentioned these days: ASCII and UTF. I’m not going to go into an exhaustive history of them; for that, check out this article for ASCII and this article for UTF-8. I will cover enough for us to put in support for strings, though.So You Want to Build a Language VM - Part 11 - Memory
Adds in heap memory to our VM
Intro
So You Want to Build a Language VM - Part 10 - Assembler 3: Assemble Harder
Teaches our assembler to recognize more instruction forms
Improving the Assembler
Our assembler right now can recognize one opcode,
load
. We need to teach it to recognize all the rest. There’s a couple ways we can do that:We can write a parser for each opcode
We can write a parser that recognizes the letters
a-z
and then check if they are a valid Opcode.
Let’s go with option #2, since it will require much less copy-paste. It also gives us an excuse to implement
From<CompleteStr<_>>
for our opcodes! == TheFrom<&str>
Trait Ininstruction.rs
, below the block where we implementedFrom<u8>
, put this:So You Want to Build a Language VM - Interlude 01
Goes back and adds docs, tests and other improvements