"V jakém jazyce je samotné C napsáno?"
Z jiného pohledu je to tak: než se jazyk C spustí, musí být zkompilován, takže odkud pochází překladač jazyka C? V jakém jazyce je napsáno? Pokud je to napsáno přímo v C, je nejdřív vejce nebo slepice?
1
Předpokládejme, že na světě nejsou žádné kompilátory, začněme strojovým jazykem a uvidíme, jak to půjde.
Strojový jazyk může být přímo vykonán CPU bez potřeby kompilátoru.
Pak je tu assembler, i když assembler je pouze mnemotechnická pomůcka pro strojový jazyk, ale také musí být zkompilován do strojového jazyka pro jeho vykonání, takže není jiná možnost než použít strojový jazyk k napsání tohoto prvního kompilátoru (který v budoucnu nebude použit).
Problém assembleru je vyřešen a je to velký krok vpřed, v této době je možné použít assembler k napsání C jazykového kompilátoru, který považujeme za předchůdce C překladače.
S tímto předkem můžete zkompilovat jakýkoli program v jazyce C, takže můžete napsat kompilátor přímo v jazyce C? Prostě to zkompilujte s předky.
OK, po takové vrstvě jsem konečně dostal kompilátor napsaný v C, což je opravdu problém.
V tomto bodě lze C kompilátor napsaný předchozím balíčkem opustit.
Samozřejmě, pokud existovaly jiné vysoce úrovňové jazyky před C, například Pascal, pak by Pascal mohl být použit k napsání C kompilátoru.
Říká se, že kompilátor prvního Pascalu byl napsán ve Fortranu. Jako první vysokoúrovňový jazyk by měl být kompilátor Fortranu napsán v assembleru.
2
Tady je zajímavá legenda o kompilátoru:
Legenda praví, že Ken Thompson, jeden z vynálezců Unixu, se přiblížil k jakémukoliv unixovému stroji v Bell Labs, zadal své uživatelské jméno a heslo a mohl se přihlásit pomocí rootu!
Bell Labs je plné talentu a někteří další velcí býci slíbili, že tuto zranitelnost najdou, pročetli si zdrojový kód Unixu v C a nakonec našli zadní vrátka pro přihlašování, a po vyčištění zadních vrátek zkompilovali Unix a spustili ho, ale Thompson se stále dokázal přihlásit.
Někteří lidé si myslí, že může být problém s kompilátorem, a při kompilaci Unixu byla implantována zadní vrátka, takže přepsali kompilátor v C a znovu zkompilovali Unix s novým kompilátorem.
Ale pořád to nefunguje, Thompson se může přihlásit přes root, což je opravdu demotivující!
Později Thompson sám odemkl tajemství, byl to první C kompilátor, který měl problém, tento kompilátor bude samozřejmě implantován do zadních vrátek při kompilaci unixového zdrojového kódu, to nestačí, a co je ještě lepší, pokud napíšete nový kompilátor v jazyce C, rozhodně ho musíte zkompilovat do binárního kódu, co kompilovat, použijte jen první kompilátor napsaný Thompsonem, dobře, kompilátor, který jste napsali, bude znečištěný, váš kompilátor znovu zkompiluje Unix, Také implantuju zadní vrátka :-)
Když už o tom mluvíme, připomíná mi incident XcodeGhost před několika lety, což jednoduše znamená, že do Xcode byl implantován trojský kůň (stažený z neoficiálních kanálů), takže iOS aplikace kompilované XCode byly kontaminovány a tyto aplikace mohly být hackery zneužity k nelegálním činnostem.
Ačkoliv je tento XCodeGhost daleko od Thompsonov, připomíná nám, že při stahování softwaru byste měli používat formální kanály, stáhnout z oficiálních webových stránek, hledat HTTPS standard webu a dokonce ověřit kontrolní součet.
3
Někteří lidé se mohou ptát: Používám Hui k napsání odstavce Hello World, ale někdo ho může použít k napsání složitého kompilátoru? Je to možné?
Samozřejmě, když byla vyvíjena první generace Unixu, neexistoval žádný jazyk C a Ken Thompson a Dennis Ritchie psali Unix pomocí assemblerových linií. První verzi WPS napsal Qiu Bojun v Hui a kompilátor Turbo Pascal také napsal Anders v Hui, a schopnosti bohů jsou pro běžné lidi nepředstavitelné.
U kompilátorů je také možné vyvíjet "sněhovou koulí" formou:
Stále jako příklad jazyka C může první verze zvolit podmnožinu jazyka C, například podporovat pouze základní datové typy, příkazy řízení procesů a volání funkcí...... Tuto podmnožinu nazýváme C0.
Pak napište kompilátor v assembleru a získáte pouze podmnožinu tohoto jazyka C0, aby bylo mnohem snazší jej napsat.
Jazyk C0 funguje, a pak tuto podmnožinu rozšiřujeme přidáním struktur, ukazatelů ...... a voláním nového jazyka C1.
Kdo píše kompilátor pro jazyk C1? Samozřejmě je to C0.
Když C1 funguje, znovu rozšířte funkce jazyka, napište kompilátor pomocí C1 a získejte C2.
Pak je tu C3, C4...... Nakonec dostanete plný jazyk C.
Tento proces se nazývá bootstrapping, v čínštině bootstrapping.
|