
TinyVM – A small and easy to understand virtual machine in C - jxub
https://github.com/jakogut/tinyvm/
======
userbinator
After seeing C4[1], everything else doesn't seem tiny at all... and maybe it's
just me, but this is another one of those projects where I found the directory
layout rather confusing, especially for something that claims to be "small and
easy to understand." bin/ is empty, there's only a single nearly-empty file in
src/, lib/ is also empty, include/tvm is two levels but one is empty, and all
the interesting stuff actually appears to be in libtvm/ .

More importantly, even after going through all the files in libtvm/ , I still
haven't managed to find the main instruction execution loop nor the decoding
switch. Sorry, but I don't think "small and easy to understand" applies, and
I've had experience with VMs and interpreters and the like for many years.
Compare with this, for example:

[https://github.com/tjmerritt/z80](https://github.com/tjmerritt/z80)

A rule-of-thumb when investigating the source code of a project for the first
time: if I have to go more than 2 directories deep to get to the "meat" of the
code, my desire to explore further drops significantly.

[1]
[https://news.ycombinator.com/item?id=8558822](https://news.ycombinator.com/item?id=8558822)

~~~
acqq
I’ve found that switch fast, in a few clicks, reading this on my phone:

[https://github.com/jakogut/tinyvm/blob/master/include/tvm/tv...](https://github.com/jakogut/tinyvm/blob/master/include/tvm/tvm.h)

I’ve used the info you provided as the start, of course.

~~~
ben_bai
In a .h file?

Have to agree with userbinator.

------
giancarlostoro
Another good simple one is NekoVM (though not sure how they compare size wise)
which is one of the target platforms that Haxe compiles to:

[https://github.com/HaxeFoundation/neko](https://github.com/HaxeFoundation/neko)

Being interested in wanting to write my own languages (though never finding
the time with other pet projects) I always wanted to write something that
would ultimately be usable with NekoVM as one of my side goals for a language.
Neko also has a module for Apache.

------
classichasclass
I like an elegant VM, but the ones I find the most interesting are the ones
you can actually employ as a compilation target.

For example, there's a C-like language for SUBLEQ machines:
[http://mazonka.com/subleq/hsq.html](http://mazonka.com/subleq/hsq.html)

------
peterkelly
Here's the switch statement, if you're looking for it:
[https://github.com/jakogut/tinyvm/blob/master/include/tvm/tv...](https://github.com/jakogut/tinyvm/blob/master/include/tvm/tvm.h)

------
mar77i
rather recently I remembered [0], which I then rebuilt in C using the same
memory layout and tried to approximate the functionality of the original thing
[1]...

[0]
[https://www.randelshofer.ch/fhw/gri/holzi.html](https://www.randelshofer.ch/fhw/gri/holzi.html)

[1]
[https://gist.github.com/mar77i/46bd25504dd9e81d0ca7778efcee4...](https://gist.github.com/mar77i/46bd25504dd9e81d0ca7778efcee497f)

------
joe_the_user
Hmm,

Scanning the syntax, is there an operation for addressing memory? I see an
operation for moving one value to another and that's it. I don't see any
method of addressing a variable position in memory (or a variable position in
an array if one wants to be more managed about it).

I suppose you could handle all operations from the stack.

But I think a lot of things require memory reads and writes, at least to do
efficiently.

~~~
int0x80
I was also looking for it and couldn't find it. You can't do much with the
stack if you can't load/store.

------
d33
I'm kind of worried about usage of strcmp here:

[https://github.com/jakogut/tinyvm/search?q=strcmp](https://github.com/jakogut/tinyvm/search?q=strcmp)

It's also very easy to crash the thing, either with a malformed input file or
afl-fuzz. Are you sure C was the right choice here?

~~~
spc476
For the actual emulation, I would say C is okay. For the assembler? I can
think of half a dozen other languages better suited for that.

------
kondor6c
There is also the Java based "PC emulator":

[https://github.com/ianopolous/JPC](https://github.com/ianopolous/JPC)

However, development seems to have slowed down drastically.

------
_RPM
Great work. After scanning the source tree with my eyes, I have yet to find
the implementation of the instruction set. Therefore, I wouldn't say this is
small.

~~~
userbinator
Because it has been hidden in a .h file:
[https://news.ycombinator.com/item?id=16608174](https://news.ycombinator.com/item?id=16608174)

