
Yarn – A small embeddable VM with a custom instruction set - WetDesertRock
https://github.com/WetDesertRock/Yarn
======
vmorgulis
Very cool and promising!

It reminds the Moxie processor:

[http://moxielogic.org/blog/](http://moxielogic.org/blog/)

[https://github.com/atgreen/moxiedev](https://github.com/atgreen/moxiedev)

The author even wrote a backend for GCC.

Your demo from Twitter should compile to JS with emscripten.

~~~
WetDesertRock
Oh interesting, I'll look more into that.

Yeah, it should compile to JS, I'll probably look into doing that at a later
point in time.

~~~
vmorgulis
It's simple once the emscripten SDK is installed ("emcc main.c -o
main.js/html").

[https://kripken.github.io/emscripten-
site/docs/tools_referen...](https://kripken.github.io/emscripten-
site/docs/tools_reference/emcc.html)

------
makapuf
Nice ! Seems interesting to consider it for my diy game console
(bitboxconsole.blogspot.com) and allowing on-console game dev !

~~~
WetDesertRock
Yeah, an idea like this would work well for console development!

------
andrewflnr
I find this strangely fascinating, but have no idea what I could use it for.
Is it intended to be useful, or just a neat experiment?

~~~
kittiepryde
It looks like a neat experiment (definitely cool though), but I imagine you
could (eventually?) implement a scripting language like lua in it, and
register your program's external commands the scripting language needs access
to.

~~~
WetDesertRock
Yeah, I have some specific goals to it. One is making it into a game platform.
See a video of the start of that project:
[https://twitter.com/WetDesertRock/status/703300191512715264](https://twitter.com/WetDesertRock/status/703300191512715264)

~~~
strangecasts
What sort of graphics/audio interface do you expose to the program?

(The project is very cool! The instruction set reminds me a bit of the MIPS
subset usually implemented in uni courses.)

~~~
WetDesertRock
Oh, and I forgot to answer your question.

I haven't decided on audio. It might be a set of sys calls that manipulate
oscillators. The graphics interface is quite literally just manipulating the
program memory. You can see the registers in the lower left corner of the
video I linked.

------
norswap
Pretty cool. I'd like to know more about the design decisions. Why registers?
Why those specifically? And more.

~~~
WetDesertRock
Alright. Even though its not really needed, and complicates things more, I was
oddly attracted to the variable length instructions. I realize this would be a
bit less attractive if it wasn't _my_ project, but I wanted to anyways. My
basic design was one byte for the instruction (could be divided into two
nibbles, one for the type, one for the actual instruction), and one byte for
the registers. This allowed me 255 instructions max, and max 16 registers.

I then just started listing off the registers I needed. I could try to make up
my own method of keeping track of the stack, base and instruction pointers,
but I didn't really care enough. I also liked the _cdecl method of function
calling in assembly, so I kept with that design as well. This meant a return
register. The rest were split between caller and callee save registers, and I
tried to give them a decently easy to remember mnemonic. Compare that to x86!
I also realized I needed a null register which would indicate no register was
used for operations (ie a `mov *(0x0), %ret` where there is no register for
the first argument). I think I'll enforce this convention to make %null a
little more useful. Unless the user tries really hard, I'll prevent anything
from changing the contents of null from 0, making it useful for comparisons,
and popping unwanted data.

------
cyrillevincey
Fyi Yarn is also the name of the resource manager of Hadoop v2 => might be a
bit confusing. [http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-
yar...](http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-
site/YARN.html)

~~~
WetDesertRock
Ah, yeah. Its super hard to name anything anymore!

I think I'm okay with this name collision, but if there are any confusions I
frequently refer to mine as YarnVM.

