Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 14293|Svare: 2

[C] C-språket er så kraftig, hvilket språk er det skrevet på?

[Kopier lenke]
Publisert på 28.09.2019 16:51:21 | | |
"Hvilket språk er C skrevet på?"

Fra et annet perspektiv er det slik: før C-språket kjører, må det kompileres, så hvor kommer C-språkets kompilator fra? På hvilket språk er den skrevet? Hvis det er skrevet i C selv, er det et egg eller en høne først?

1

La oss anta at det ikke finnes noen kompilatorer i verden, la oss starte med maskinspråk og se hvordan.

Maskinspråk kan kjøres direkte av CPU-en uten behov for kompilator.

Så finnes assembler, selv om assembler kun er en huskeregel for maskinspråk, men det må også kompileres til maskinspråk for å kjøres, så det er ikke noe annet valg enn å bruke maskinspråk for å skrive denne første kompilatoren (som ikke brukes i fremtiden).

Problemet med assembler er løst, og det er et stort steg fremover; på dette tidspunktet er det mulig å bruke assembler for å skrive C-kompilatoren, som vi sier er forløperen til C-kompilatoren.

Med denne forløperen kan du kompilere hvilket som helst C-språkprogram, så kan du skrive en kompilator i C-språket selv? Bare kompiler det med forfedrene.

OK, etter et slikt lag fikk jeg endelig en kompilator skrevet i C, noe som er veldig vanskelig.

På dette tidspunktet kan C-kompilatoren skrevet av forrige pakke forlates.

Selvfølgelig, hvis det fantes andre høynivåspråk før C, som Pascal, kunne Pascal brukes til å skrive en C-kompilator.

Kompilatoren av den første Pascal sies å ha blitt skrevet i Fortran. Som det første høynivåspråket bør Fortrans kompilator skrives i assembler.

2

Her er en interessant legende om kompilatoren:

Legenden sier at Ken Thompson, en av oppfinnerne av Unix, gikk selvsikkert til hvilken som helst Unix-maskin hos Bell Labs, tastet inn brukernavn og passord, og kunne logge inn via root-metoden!

Bell Labs er fullt av talent, og noen andre store bulls lovet å finne denne sårbarheten, de leste gjennom C-kildekoden til Unix, og fant til slutt innloggingsbakdøren, og etter å ha renset bakdøren, kompilerte de Unix og kjørte den, men Thompson klarte fortsatt å logge inn.

Noen tror at det kan være et problem med kompilatoren, og at en bakdør ble implantert ved kompilering av Unix, så de skrev om en kompilator i C og kompilerte Unix på nytt med en ny kompilator.

Men det fungerer fortsatt ikke, Thompson kan fortsatt logge inn med root, noe som er virkelig ødeleggende!

Senere låste Thompson selv opp hemmeligheten, det var den første C-kompilatoren som hadde et problem, denne kompilatoren vil selvfølgelig bli implantert i bakdøren når man kompilerer Unix-kildekode, dette er ikke nok, det som er enda bedre, hvis du skriver en ny kompilator i C-språket, må du definitivt kompilere den til binær kode, hva skal du kompilere, bruk bare den første kompilatoren skrevet av Thompson til å kompilere, ok, kompilatoren du skrev vil bli forurenset, kompilatoren din vil kompilere Unix på nytt, Skal også implantere en bakdør :-)

Når vi først snakker om det, blir jeg minnet om XcodeGhost-hendelsen for noen år siden, som rett og slett betyr at en trojansk hest ble implantert i Xcode (lastet ned fra uoffisielle kanaler), slik at iOS-appene kompilert av XCode ble forurenset, og disse appene kunne brukes av hackere til ulovlige formål.

Selv om denne XCodeGhost er langt fra Thompsons, minner den oss om at når du laster ned programvare, bør du bruke formelle kanaler, laste ned fra den offisielle nettsiden, se etter nettstedets HTTPS-standard, og til og med verifisere sjekksummen.

3

Noen vil kanskje spørre: Jeg bruker Hui til å skrive et Hello World-avsnitt, men noen kan bruke det til å skrive en kompleks kompilator? Er dette mulig?

Selvfølgelig, da første generasjon Unix ble utviklet, fantes det ikke noe C-språk, og Ken Thompson og Dennis Ritchie skrev Unix med samlebånd.   Den første versjonen av WPS ble skrevet av Qiu Bojun i Hui, og kompilatoren av Turbo Pascal ble også skrevet av Anders i Hui, og gudenes evner er utenkelige for vanlige folk.

For kompilatorer er det også mulig å utvikle på en "snøball"-måte:

Fortsatt med C-språket som eksempel, kan den første versjonen velge et delsett av C-språket, for eksempel kun støtte grunnleggende datatyper, prosesskontrollsetninger og funksjonskall...... Vi kaller denne delmengden C0.

Deretter skriver du en kompilator i assembler, og får bare en delmengde av dette språket C0, slik at det blir mye enklere å skrive.

C0-språket fungerer, og så utvider vi dette delsettet ved å legge til strukturer, pekere, ......, og kalle det nye språket C1.

Hvem skriver kompilatoren for C1-språket?   Naturligvis er det C0.

Når C1 fungerer, utvid språkfunksjonene igjen, skriv kompilatoren med C1, og hent C2.

Så er det C3, C4......  Til slutt får du hele C-språket.

Denne prosessen kalles bootstrapping, og på kinesisk kalles den bootstrapping.





Foregående:De nye .NET Core-funksjonene frigjør en enkeltfil-kjørbar fil
Neste:Hvorfor jobber programmerere uendelig overtid?
Publisert på 29.09.2019 09:27:54 |
Hvilket språk er C selv skrevet på?
Publisert på 01.10.2019 23:54:34 |
Hvilket språk er C selv skrevet på?
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com