Selfie – A tiny RISC-V C compiler, emulator and hypervisor
selfie.cs.uni-salzburg.at
selfie.cs.uni-salzburg.at
> Selfie is implemented in a single (!) file and kept minimal for simplicity. There is also a simple in-memory linker, a RISC-U disassembler, a garbage collector, L1 instruction and data caches, a profiler, and a debugger with replay as well as minimal operating system support in the form of RISC-V system calls built into the emulator and hypervisor. The garbage collector is conservative and even self-collecting. It may operate as library in the same address space as the mutator and/or as part of the emulator in the address space of the kernel.
I was a bit skeptical reading that, but I’m very impressed right now [2] . . .
[1]: https://github.com/cksystemsteaching/selfie/blob/5de675a0f08...
[2]: https://github.com/cksystemsteaching/selfie/blob/5de675a0f08...
That's quite the pedigree! This is a very interesting project to dig into, starting with the book.
> a self-compiling compiler called starc that compiles a tiny but still fast subset of C called C Star (*) to a tiny and easy-to-teach subset of RISC-V called RISC-U,
> a self-executing emulator called mipster that executes RISC-U code including itself when compiled with starc,
> a self-hosting hypervisor called hypster that provides RISC-U virtual machines that can host all of selfie, that is, starc, mipster, and hypster itself, and a tiny C* library called libcstar utilized by selfie.
For what it's worth, the selfie compiler can build RISC-U programs for you. Still a really cool project! I've been meaning to learn more about compiler backend development. I usually spend time on the frontend.
> uint64_t SIZEOFUINT64 = 8; // in bytes
and
> SIZEOFUINT64 = (uint64_t) ((uint64_t*) SELFIE_URL + 1) - (uint64_t) SELFIE_URL;
in init_library() ?
Haven't done C in a long long time, so I may be talking out of my ass.
EDIT: technically 2^63-1 seconds.
Initializing the value and later assigning it a new value runs the risk of having some code that uses the value of one expression and other code that uses the value (presumedly/hopefully identical to the former) of another expression.
That’s not a risk you want to take.
The name also doesn’t give me an indication they considered making the code agnostic as to the size of that variable.
[1]: https://github.com/cksystemsteaching/selfie/blob/5de675a0f08...
const size_t SIZEOFUINT64 = sizeof (uint64_t);[1]: https://github.com/cksystemsteaching/selfie/blob/50b5fec8378...
Oh, well.
https://en.wikipedia.org/wiki/C*
=> "It was developed in 1987 as an alternative language to Lisp and CM-Fortran for the Connection Machine CM-2 and above. The language C* adds to C a "domain" data type and a selection statement for parallel execution in domains. "