"In welke taal is C zelf geschreven?"
Vanuit een ander perspectief is het: voordat de C-taal draait, moet deze gecompileerd zijn, dus waar komt de C-taal compiler vandaan? In welke taal is het geschreven? Als het in C zelf geschreven is, is er dan eerst een ei of een kip?
1
Laten we aannemen dat er geen compilers in de wereld zijn, laten we beginnen met machinetaal en kijken hoe.
Machinetaal kan direct door de CPU worden uitgevoerd zonder dat er een compiler nodig is.
Dan is er assemblertaal, hoewel assembleertaal slechts een ezelsbruggetje is voor machinetaal, maar het moet ook worden gecompileerd naar machinetaal om uit te voeren, dus er is geen andere keuze dan machinetaal te gebruiken om deze eerste compiler te schrijven (die in de toekomst niet meer wordt gebruikt).
Het probleem van assemblytaal is opgelost, en het is een grote stap vooruit; op dit moment is het mogelijk om assemblytaal te gebruiken om de C-taalcompiler te schrijven, waarvan wij zeggen dat die de voorloper is van de C-compiler.
Met deze voorloper kun je elk C-taalprogramma compileren, dus kun je een compiler schrijven in de C-taal zelf? Complimeer het gewoon met de voorouders.
Oké, na zo'n laag heb ik eindelijk een compiler geschreven in C, wat echt lastig is.
Op dit punt kan de C-compiler die door het vorige pakket is geschreven, worden opgegeven.
Natuurlijk, als er andere hoog-niveau talen vóór C waren, zoals Pascal, dan kon Pascal worden gebruikt om een C-compiler te schrijven.
De samensteller van de eerste Pascal zou in Fortran zijn geschreven. Als eerste hoge-niveau taal zou Fortrans compiler in assemblytaal geschreven moeten zijn.
2
Hier is een interessante legende over de compiler:
Volgens de legende liep Ken Thompson, een van de uitvinders van Unix, naar elke Unix-machine bij Bell Labs, voerde zijn gebruikersnaam en wachtwoord in en kon hij via de root-route inloggen!
Bell Labs zit vol talent, en een paar andere grote mensen zwoeren deze kwetsbaarheid te vinden, ze lazen de C-broncode van Unix en vonden uiteindelijk de login-backdeur, en na het schoonmaken van de backdeur compileerden ze Unix en draaiden het, maar Thompson kon nog steeds inloggen.
Sommige mensen denken dat er een probleem kan zijn met de compiler, en dat er een achterdeur is geïmplanteerd bij het compileren van Unix, dus hebben ze een compiler in C herschreven en Unix opnieuw gecompileerd met een nieuwe compiler.
Maar het werkt nog steeds niet, Thompson kan nog steeds inloggen met root, wat echt verwoestend is!
Later ontgrendelde Thompson zelf het geheim, het was de eerste C-compiler met een probleem, deze compiler zal natuurlijk in de achterdeur worden geïmplanteerd bij het compileren van Unix-broncode, dit is niet genoeg, wat nog beter is, als je een nieuwe compiler in de C-taal schrijft, moet je die zeker compileren naar binaire code, wat je moet compileren, gebruik alleen de eerste compiler die Thompson schreef om te compileren, oké, de compiler die je schreef zal vervuild zijn, je compiler zal Unix opnieuw compileren Ik zal ook een achterdeur implanteren :-)
Over gesproken, ik moet denken aan het XcodeGhost-incident een paar jaar geleden, wat simpelweg betekent dat er een Trojaans paard in Xcode is geïmplanteerd (gedownload via onofficiële kanalen), zodat de iOS-apps die door XCode zijn gecompileerd besmet waren, en deze apps door hackers gebruikt konden worden voor illegale doeleinden.
Hoewel deze XCodeGhost ver van Thompson afstaat, herinnert het ons eraan dat je bij het downloaden van software formele kanalen moet gebruiken, van de officiële website moet downloaden, de HTTPS-standaard van de website moet zoeken en zelfs de checksum moet verifiëren.
3
Sommige mensen vragen misschien: Ik gebruik Hui om een Hello World-paragraaf te schrijven, maar iemand anders kan het gebruiken om een complexe compiler te schrijven? Is dit mogelijk?
Natuurlijk was er bij de ontwikkeling van de eerste generatie Unix geen C-taal, en typten Ken Thompson en Dennis Ritchie Unix uit met assemblagelijnen. De eerste versie van WPS werd geschreven door Qiu Bojun in Hui, en de samensteller van Turbo Pascal werd ook geschreven door Anders in Hui, en de vaardigheden van de goden zijn voor gewone mensen ondenkbaar.
Voor compilers is het ook mogelijk om op een "sneeuwbal"-manier te ontwikkelen:
Nog steeds als voorbeeld van de C-taal kan de eerste versie een subset van de C-taal kiezen, zoals alleen het ondersteunen van basisdatatypes, procescontrole-instructies en functieaanroepen...... We noemen deze deelverzameling C0.
Schrijf dan een compiler in assemblytaal, en krijg slechts een deelverzameling van deze taal C0, zodat het veel makkelijker te schrijven is.
De C0-taal werkt, en vervolgens breiden we deze subset uit door structs, pointers, ...... toe te voegen en de nieuwe taal C1 aan te roepen.
Wie schrijft de compiler voor de C1-taal? Natuurlijk is het C0.
Wanneer C1 werkt, breid je de taalfuncties opnieuw uit, schrijf je de compiler met C1 en haal je C2 op.
Dan is er C3, C4...... Tot slot krijg je de volledige C-taal.
Dit proces heet bootstrapping, en in het Chinees wordt het bootstrapping genoemd.
|