"Kādā valodā ir rakstīts pats C?"
No citas perspektīvas tas ir: pirms C valodas palaišanas tā ir jākompilē, tātad no kurienes nāk C valodas kompilators? Kādā valodā tas ir rakstīts? Ja tas ir rakstīts pašā C, vai vispirms ir ola vai vistas?
1
Pieņemsim, ka pasaulē nav kompilatoru, sāksim ar mašīnvalodu un redzēsim, kā.
Mašīnvalodu var izpildīt tieši CPU bez kompilatora.
Tad ir montāžas valoda, lai gan montāžas valoda ir tikai mašīnvalodas mnemonika, bet tā ir arī jākompilē mašīnvalodā, lai to izpildītu, tāpēc nav citas izvēles, kā izmantot mašīnvalodu, lai uzrakstītu šo pirmo kompilatoru (netiek izmantots nākotnē).
Montāžas valodas problēma ir atrisināta, un tas ir liels solis uz priekšu, šobrīd ir iespējams izmantot montāžas valodu, lai uzrakstītu C valodas kompilatoru, kas, kā mēs sakām, ir C kompilatora priekštecis.
Ar šo senču jūs varat kompilēt jebkuru C valodas programmu, tāpēc vai jūs varat uzrakstīt kompilatoru pašā C valodā? Vienkārši apkopojiet to ar senčiem.
Labi, pēc šāda slāņa es beidzot saņēmu kompilatoru, kas rakstīts C valodā, kas ir patiešām apgrūtinoši.
Šajā brīdī var atteikties no iepriekšējās paketes rakstītā C kompilatora.
Protams, ja pirms C būtu citas augsta līmeņa valodas, piemēram, Pascal, tad Pascal varētu izmantot, lai uzrakstītu C kompilatoru.
Tiek teikts, ka pirmā Paskāla sastādītājs ir uzrakstīts Fortranā. Kā pirmā augsta līmeņa valoda Fortran kompilatoram jābūt rakstītam montāžas valodā.
2
Šeit ir interesanta leģenda par kompilatoru:
Leģenda vēsta, ka Kens Tompsons, viens no Unix izgudrotājiem, pieķērās jebkurai Unix mašīnai Bell Labs, ievadīja savu lietotājvārdu un paroli un varēja pieteikties saknes veidā!
Bell Labs ir pilns ar talantu, un daži citi lieli buļļi solīja atrast šo ievainojamību, viņi izlasīja Unix C avota kodu un beidzot atrada pieteikšanās aizmugurējās durvis, un pēc aizmugurējo durvju tīrīšanas viņi sastādīja Unix un palaida to, bet Tompsons joprojām varēja pieteikties.
Daži cilvēki domā, ka var būt problēma ar kompilatoru, un, kompilējot Unix, tika implantētas aizmugurējās durvis, tāpēc viņi pārrakstīja kompilatoru C un atkal kompilēja Unix ar jaunu kompilatoru.
Bet tas joprojām nedarbojas, Tompsons joprojām var pieteikties ar sakni, kas ir patiešām postoši!
Vēlāk pats Tompsons atbloķēja noslēpumu, tas bija pirmais C kompilators, kuram radās problēma, šis kompilators, protams, tiks implantēts aizmugurējās durvīs, kompilējot Unix avota kodu, ar to nepietiek, kas ir vēl labāk, ja jūs rakstāt jaunu kompilatoru C valodā, jums noteikti tas ir jākompilē binārajā kodā, ko kompilēt, izmantojiet tikai pirmo kompilatoru, ko rakstījis Tompsons, lai kompilētu, labi, jūsu uzrakstītais kompilators tiks piesārņots, jūsu kompilators atkal kompilēs Unix, Implantēs arī aizmugurējās durvis :-)
Runājot par to, man atgādina XcodeGhost incidentu pirms dažiem gadiem, kas vienkārši nozīmē, ka Xcode tika implantēts Trojas zirgs (lejupielādēts no neoficiāliem kanāliem), lai XCode kompilētās ios lietotnes būtu piesārņotas, un hakeri varētu izmantot šīs lietotnes, lai veiktu nelikumīgas lietas.
Lai gan šis XCodeGhost ir tālu no Tompsona, tas mums atgādina, ka, lejupielādējot programmatūru, jums jāizmanto oficiāli kanāli, lejupielādējiet no oficiālās vietnes, meklējiet vietnes HTTPS standartu un pat pārbaudiet kontrolsummu.
3
Daži cilvēki var jautāt: es izmantoju Hui, lai uzrakstītu Hello World rindkopu, bet kāds var to izmantot, lai uzrakstītu sarežģītu kompilatoru? Vai tas ir iespējams?
Protams, kad tika izstrādāta pirmā Unix paaudze, C valodas nebija, un Ken Thompson un Dennis Ritchie ierakstīja Unix ar montāžas līnijām. Pirmo WPS versiju uzrakstīja Qiu Bojun Hui, un Turbo Pascal kompilatoru uzrakstīja arī Anders Hui, un dievu spējas parastajiem cilvēkiem nav iedomājamas.
Kompilatoriem ir iespējams attīstīties arī "sniega bumbas" veidā:
Joprojām ņemot C valodu kā piemēru, pirmajā versijā var izvēlēties C valodas apakškopu, piemēram, atbalstot tikai pamata datu tipus, procesu vadības paziņojumus un funkciju izsaukumus...... Mēs šo apakškopu saucam par C0.
Pēc tam uzrakstiet kompilatoru montāžas valodā un iegūstiet tikai šīs valodas C0 apakškopu, lai to būtu daudz vieglāk rakstīt.
C0 valoda darbojas, un pēc tam mēs paplašinām šo apakškopu, pievienojot struktūras, rādītājus ...... un izsaucot jauno valodu C1.
Kas raksta kompilatoru C1 valodai? Protams, tas ir C0.
Kad C1 darbojas, vēlreiz izvērsiet valodas līdzekļus, uzrakstiet kompilatoru ar C1 un iegūstiet C2.
Tad ir C3, C4...... Visbeidzot, jūs saņemat pilnu C valodu.
Šo procesu sauc par bootstrapping, un ķīniešu valodā to sauc par bootstrapping.
|