I hate to be one of these people, but we can’t just keep redefining entire technical disciplines into subsets of software development.
Systems Engineering is a high level engineering discipline focused on the integration and coordination of multiple science and engineering fields to achieve an overall system development outcome.
Software is just one (sometimes small) part of systems engineering.
"Systems engineering" and "systems programming" are different. Systems programming is a specific niche while systems engineering is a vague catch-all term.
> An educational software system of a tiny self-compiling C compiler, a tiny self-executing RISC-V emulator, and a tiny self-hosting RISC-V hypervisor.
But that would be too long for an HN title so I looked to this paragraph:
> The Selfie Project provides an educational platform for teaching undergraduate and graduate students the design and implementation of programming languages and runtime systems. The focus is on the construction of compilers, libraries, operating systems, and virtual machine monitors. The common theme is to identify and resolve self-reference in systems code which is seen as the key challenge when teaching systems engineering, hence the name.
And condensed it to:
> ... educational platform for teaching ... systems engineering ...
>"The common theme is to identify and resolve self-reference in systems code which is seen as the key challenge when teaching systems engineering, hence the name."
Could someone explain what is meant by "self-reference" here and why it is is seen as "the key challenge" in teaching systems engineering?
Just started reading the book and it is wonderful. A kind, generous, and humane intro to computer science. It reminds me of https://www.nand2tetris.org/ but feels more approachable and appealing.
It means that the compiled binary can be used to compile updated versions of its own source code, so you no longer need to keep around a secondary compiler for that purpose.
This is known as "self-hosting"[0], and is typically a desirable property of compilers that target their own runtime environment.
Unfortunately self-hosting breaks the ability to bootstrap solely from source code, so it is usually recommended to keep that secondary compiler working (or included it as part of the build process for your compiler) so you can trust the compiler binaries aren't tampered with.
For the record: C* is a subset of C. Selfie is trivially bootstrapple by any C compiler. Moreover, it's very easy to implement the subset of RISC-V used by Selfie if you don't trust its emulator.
Bootstrapping vs self-hosting is a false dichotomy here.
Good to hear. Usually self-hosting means the maintainers will drop bootstrapping, thanks for being the exception to that rule. If you aren't verifying bootstrapping works in your CI, it might be worth adding that.
Systems Engineering is a high level engineering discipline focused on the integration and coordination of multiple science and engineering fields to achieve an overall system development outcome.
Software is just one (sometimes small) part of systems engineering.