5 ms·
TinyVM – A small and easy to understand virtual machine in C
- classichasclass 9y agoI 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
- mar77i 9y agorather 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/46bd25504dd9e81d0ca7778efcee497f https://gist.github.com/mar77i/46bd25504dd9e81d0ca7778efcee4...
- giancarlostoro 9y agoAnother 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.
- userbinator 9y agoAfter 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 9y agoI’ve found that switch fast, in a few clicks, reading this on my phone: https://github.com/jakogut/tinyvm/blob/master/include/tvm/tvm.h https://github.com/jakogut/tinyvm/blob/master/include/tvm/tv... I’ve used the info you provided as the start, of course.
- dfbrown 9y agoC library public headers are commonly two levels deep to so that projects using them can add the "include" directory to their header search path and in their code have #include "<libname>/header.h". It helps avoid filename clashes.
- tytytytytytytyt 9y agoWhy does he/she have .gitignore files in subdirectories? That seems to make those subdirectories linger for no reason.
- tines 9y agoUsually because a build script depends on their existence or something.
- saagarjha 9y agoThen have the scripts create them?
- coldtea 9y ago>Why does he/she have .gitignore files in subdirectories? That seems to make those subdirectories linger for no reason. He has it precisely to make them linger. And what "no reason"? It's so subsequent scripts can put results there.
- joe_the_user 9y agoHmm, 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 9y agoI was also looking for it and couldn't find it. You can't do much with the stack if you can't load/store.
- _RPM 9y agoGreat 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 9y agoBecause it has been hidden in a .h file: https://news.ycombinator.com/item?id=16608174 https://news.ycombinator.com/item?id=16608174
- kondor6c 9y agoThere 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.
- d33 9y agoI'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 9y agoFor 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.
- peterkelly 9y agoHere's the switch statement, if you're looking for it: https://github.com/jakogut/tinyvm/blob/master/include/tvm/tvm.h https://github.com/jakogut/tinyvm/blob/master/include/tvm/tv...