"Hvilket sprog er C selv skrevet på?"
Fra et andet perspektiv er det sådan: før C-sproget kører, skal det kompileres, så hvor kommer C-sprogets kompilator fra? På hvilket sprog er den skrevet? Hvis det er skrevet i C selv, er der så først et æg eller en høne?
1
Lad os antage, at der ikke findes compilere i verden, lad os starte med maskinsprog og se hvordan.
Maskinsprog kan udføres direkte af CPU'en uden behov for en compiler.
Så er der assemblersprog, selvom assembler kun er en huskeregel for maskinsprog, men det skal også kompileres til maskinsprog for at eksekvere, så der er intet andet valg end at bruge maskinsprog til at skrive denne første kompilator (som ikke bruges i fremtiden).
Problemet med assembler er løst, og det er et stort skridt fremad; på nuværende tidspunkt er det muligt at bruge assembler til at skrive C-sprogets kompilator, som vi siger er forfaderen til C-kompilatoren.
Med denne forfader kan du kompilere ethvert C-sprogprogram, så kan du skrive en compiler i C-sproget selv? Kompiler det bare med forfædrene.
OK, efter sådan et lag fik jeg endelig skrevet en compiler i C, hvilket er virkelig besværligt.
På dette tidspunkt kan C-kompilatoren, som den forrige pakke har skrevet, opgives.
Selvfølgelig, hvis der fandtes andre højniveausprog før C, såsom Pascal, kunne Pascal bruges til at skrive en C-compiler.
Kompilatoren af den første Pascal siges at være skrevet i Fortran. Som det første højniveausprog bør Fortrans compiler skrives i assembler.
2
Her er en interessant legende om compileren:
Legenden siger, at Ken Thompson, en af opfinderne af Unix, gik selvsikkert hen til enhver Unix-maskine hos Bell Labs, indtastede sit brugernavn og adgangskode og kunne logge ind via root-systemet!
Bell Labs er fuld af talent, og nogle andre store bulls svor at finde denne sårbarhed, de læste C-kildekoden til Unix igennem og fandt endelig login-bagdøren, og efter at have renset bagdøren, kompilerede de Unix og kørte den, men Thompson kunne stadig logge ind.
Nogle mener, at der kan være et problem med compileren, og at der blev indført en bagdør under kompilering af Unix, så de omskrev en compiler i C og kompilerede Unix igen med en ny compiler.
Men det virker stadig ikke, Thompson kan stadig logge ind med root, hvilket er virkelig ødelæggende!
Senere låste Thompson selv hemmeligheden op, det var den første C-compiler, der havde et problem, denne compiler vil selvfølgelig blive implanteret i bagdøren, når man kompilerer Unix-kildekode, det er ikke nok, hvad der er endnu bedre, hvis du skriver en ny compiler i C-sproget, skal du helt sikkert kompilere den til binær kode, hvad skal kompileres, brug kun den første compiler skrevet af Thompson til at kompilere, okay, compileren du har skrevet vil blive forurenet, din compiler vil kompilere Unix igen, Vil også indsætte en bagdør :-)
Apropos, jeg bliver mindet om XcodeGhost-hændelsen for nogle år siden, som simpelthen betyder, at en trojansk hest blev implanteret i Xcode (downloadet fra uofficielle kanaler), så iOS-apps, der blev kompileret af XCode, blev forurenet, og disse apps kunne bruges af hackere til ulovlige formål.
Selvom denne XCodeGhost er langt fra Thompson's, minder den os om, at når man downloader software, bør man bruge formelle kanaler, downloade fra den officielle hjemmeside, lede efter hjemmesidens HTTPS-standard og endda verificere checksum.
3
Nogle spørger måske: Jeg bruger Hui til at skrive et Hello World-afsnit, men nogen kan bruge det til at skrive en kompleks compiler? Er det muligt?
Selvfølgelig fandtes der ikke noget C-sprog, da første generation af Unix blev udviklet, og Ken Thompson og Dennis Ritchie skrev Unix ud med samlebånd. Den første version af WPS blev skrevet af Qiu Bojun på Hui, og kompilatoren af Turbo Pascal blev også skrevet af Anders i Hui, og gudernes evner er utænkelige for almindelige mennesker.
For compilere er det også muligt at udvikle på en "snowball"-måde:
Tager vi stadig C-sproget som eksempel, kan den første version vælge et delmængde af C-sproget, såsom kun at understøtte grundlæggende datatyper, proceskontrolsætninger og funktionskald...... Vi kalder denne delmængde C0.
Skriv derefter en compiler i assembler, og få kun et delmængde af dette sprog C0, så det er meget nemmere at skrive.
C0-sproget fungerer, og så udvider vi dette delmængde ved at tilføje strukturer, pointere, ...... og kalde det nye sprog C1.
Hvem skriver compileren til C1-sproget? Naturligvis er det C0.
Når C1 fungerer, udvid sprogfunktionerne igen, skriv compileren med C1, og hent C2.
Så er der C3, C4...... Endelig får du det fulde C-sprog.
Denne proces kaldes bootstrapping, og på kinesisk kaldes det bootstrapping.
|