In den beginne werd een OS niet eens in assembler geschreven, maar direct in machine-code (dus direct in bytes, niet eens in symbolische commando's).
De volgende stap was het programmeren van het minimale deel van OS (zeg maar even de kernel), + een assembler-programma, in machine-code, en dan de rest in assembler.
Toen er meer processing-power ter beschikking stond, was de volgende stap om na het implementeren van de assembler, een compiler voor een 3e generatie-taal daarin te bouwen, en een volgende schil van het OS daarmee te bouwen.
Tegenwoordig gaat het simpeler. Zodra een processor is ontworpen, wordt een cross-compiler gebouwd op een ander, al bestaande architectuur, die code ophoest die op die nieuwe processor draait (zodra de processor eindelijk bestaat).
Het nadeel van het bouwen van een OS in een 3e generatie-taal is dat, hoe goed tegenwoordig ook de optimizing compilers zijn, de gegenereerde code nooit zo efficient is als machine-code/assembly-language, geschreven door iemand die het kan.
Aan de andere kant zijn zelfs de hedendaagse OS-en vaak zo gecompliceerd dat ze niet meer onderhoudbaar zouden zijn als ze niet in een 3e generatie-taal zijn geschreven.
The number of things that Arthur couldn't believe he was seeing was fairly large