"Vilket språk är C själv skrivet på?"
Ur ett annat perspektiv är det så: innan C-språket körs måste det kompileras, så varifrån kommer C-språkets kompilator? På vilket språk är den skriven? Om det är skrivet i C självt, finns det ett ägg eller en höna först?
1
Låt oss anta att det inte finns några kompilatorer i världen, låt oss börja med maskinspråk och se hur.
Maskinspråk kan köras direkt av CPU:n utan behov av kompilator.
Sedan finns assembler, även om assembler bara är en minnesregel för maskinspråk, men det måste också kompileras till maskinspråk för att exekvera, så det finns inget annat val än att använda maskinspråk för att skriva denna första kompilator (som inte används i framtiden).
Problemet med assembler är löst, och det är ett stort steg framåt, just nu är det möjligt att använda assembler för att skriva C-kompilatorn, som vi säger är föregångaren till C-kompilatorn.
Med denna föregångare kan du kompilera vilket C-språkprogram som helst, så kan du skriva en kompilator i C-språket självt? Kompilera bara med förfäderna.
Okej, efter ett sådant lager fick jag äntligen en kompilator skriven i C, vilket är riktigt besvärligt.
Vid denna punkt kan C-kompilatorn som skrivits av det föregående paketet överges.
Naturligtvis, om det fanns andra högnivåspråk före C, som Pascal, kunde Pascal användas för att skriva en C-kompilator.
Kompilatorn av den första Pascal sägs ha skrivits i Fortran. Som det första högnivåspråket bör Fortrans kompilator skrivas i assembler.
2
Här är en intressant legend om kompilatorn:
Enligt legenden gick Ken Thompson, en av uppfinnarna av Unix, med stolthet till vilken Unix-maskin som helst på Bell Labs, skrev in sitt användarnamn och lösenord och kunde logga in via root-systemet!
Bell Labs är fullt av talang, och några andra stora tjurar svor att hitta denna sårbarhet, de läste igenom C-källkoden till Unix och hittade till slut inloggningsbakdörren, och efter att ha rensat bakdörren kompilerade de Unix och körde det, men Thompson kunde ändå logga in.
Vissa tror att det kan vara ett problem med kompilatorn, och att en bakdörr installerades vid Unix-kompilering, så de skrev om en kompilator i C och kompilerade Unix igen med en ny kompilator.
Men det fungerar fortfarande inte, Thompson kan fortfarande logga in med root, vilket är riktigt förödande!
Senare låste Thompson själv upp hemligheten, det var den första C-kompilatorn som hade ett problem, denna kompilator kommer förstås att implanteras i bakdörren när man kompilerar Unix-källkod, det räcker inte, vad som är ännu bättre, om du skriver en ny kompilator i C-språket måste du definitivt kompilera den till binär kod, vad ska kompilera, använd bara den första kompilatorn skriven av Thompson för att kompilera, okej, kompilatorn du skrev kommer att bli förorenad, din kompilator kommer att kompilera Unix igen, Kommer också att implantera en bakdörr :-)
På tal om det påminns jag om XcodeGhost-incidenten för några år sedan, vilket helt enkelt betyder att en trojansk häst implanterades i Xcode (nedladdad från inofficiella kanaler), så att iOS-apparna som kompilerats av XCode blev kontaminerade, och dessa appar kunde användas av hackare för olagliga saker.
Även om denna XCodeGhost är långt ifrån Thompsons, påminner den oss om att när man laddar ner programvara bör man använda formella kanaler, ladda ner från den officiella webbplatsen, leta efter webbplatsens HTTPS-standard och till och med verifiera kontrollsumman.
3
Vissa kanske frågar: Jag använder Hui för att skriva ett Hello World-stycke, men någon kan använda det för att skriva en komplex kompilator? Är detta möjligt?
Naturligtvis, när första generationen av Unix utvecklades, fanns det inget C-språk, och Ken Thompson och Dennis Ritchie skrev ut Unix med monteringslinjer. Den första versionen av WPS skrevs av Qiu Bojun på Hui, och kompilatorn av Turbo Pascal skrevs också av Anders i Hui, och gudarnas förmågor är otänkbara för vanliga människor.
För kompilatorer är det också möjligt att utveckla på ett "snöbolls"-sätt:
Om vi fortfarande tar C-språket som exempel, kan den första versionen välja en delmängd av C-språket, såsom att endast stödja grundläggande datatyper, processkontrolluttalanden och funktionsanrop...... Vi kallar denna delmängd C0.
Skriv sedan en kompilator i assembler och får bara en delmängd av detta språk C0, så att det blir mycket enklare att skriva.
C0-språket fungerar, och sedan utökar vi denna delmängd genom att lägga till structs, pekare, ...... och anropa det nya språket C1.
Vem skriver kompilatorn för C1-språket? Naturligtvis är det C0.
När C1 fungerar, expandera språkfunktionerna igen, skriv kompilatorn med C1 och hämta C2.
Sedan finns det C3, C4...... Slutligen får du hela C-språket.
Denna process kallas bootstrapping, och på kinesiska kallas den bootstrapping.
|