Agreed -- an operating system built on this design isn't going to maintain compatibility with existing applications. It's too radically different in many regards. Compatibility layers can be built on top of it, perhaps, but generally these will turn out to be virtual machines... so compatibility with a virtual machine isn't necessarily a priority!
Anyway, I'm working on such a system, although singularity wasn't my inspiration - I first heard about this concept in connection with JX, a system based on Java. My system is somewhat different:
* My language is a subset of C and/or C++. Other languages supported by GCC could also be used with only a little extra work.
* I'm using
LLVM as the intermediate representation. LLVM isn't typesafe or memory safe by default, so I'm having to implement extensions to allow it to be, which is turning out to be hard work.
* I haven't done any proofs yet, but I don't see the big deal in preventing additional modules being loaded into a running program. Yes, you have to do a type-safety proof per module permutation, but in most cases modules will be loaded in the same order on each run, so you only have to do it once, after installation.
* I haven't seen any systems of this kind that don't use garbage collection (and, I'm afraid, reference counting is just a form of garbage collection, it might work differently but it has its own drawbacks). Garbage collection and real-time systems are mostly incompatible, which I consider unacceptable. I plan to attack this problem using the approach developed by the
Safecode project, which allocates each object its own page in the page table (although they still share a physical memory page) so that when the object is deleted and its memory reused, its page can be deallocated and any reference to the dead object can be caught. Unfortunately, this uses up PTEs pretty quickly, so a 64-bit processor is a must, really.
Anyway, anyone thinking of taking this approach should be reading this paper, which is a summary of the original ideas behind the movement, and what it hopes to achieve.
http://www.cs.cmu.edu/~rwh/papers/langsec/dagstuhl.pdf
What I hope to achieve is a C++ microkernel that can perform IPC in not a lot more time than a C++ method call takes.