"Kokia kalba parašyta pati C?"
Žvelgiant iš kitos perspektyvos, tai yra: prieš paleidžiant C kalbą, ji turi būti kompiliuojama, taigi iš kur atsiranda C kalbos kompiliatorius? Kokia kalba jis parašytas? Jei parašyta pačiame C, ar pirmiausia yra kiaušinis ar višta?
1
Tarkime, kad pasaulyje nėra kompiliatorių, pradėkime nuo mašinų kalbos ir pažiūrėkime, kaip.
Mašinos kalba gali būti vykdoma tiesiogiai procesoriaus be kompiliatoriaus.
Tada yra asamblėjos kalba, nors asamblėjos kalba yra tik mašinų kalbos mnemonika, tačiau ją taip pat reikia kompiliuoti į mašininę kalbą, kad būtų galima vykdyti, todėl nėra kito pasirinkimo, kaip tik naudoti mašinų kalbą šiam pirmajam kompiliatoriui parašyti (nenaudojamas ateityje).
Asamblėjos kalbos problema išspręsta, ir tai yra didelis žingsnis į priekį, šiuo metu galima naudoti asamblėjos kalbą rašant C kalbos kompiliatorių, kuris, mūsų teigimu, yra C kompiliatoriaus protėvis.
Su šiuo protėviu galite kompiliuoti bet kurią C kalbos programą, taigi ar galite parašyti kompiliatorių pačia C kalba? Tiesiog sudarykite jį su protėviais.
Gerai, po tokio sluoksnio pagaliau gavau kompiliatorių, parašytą C kalba, o tai tikrai vargina.
Šiuo metu galima atsisakyti ankstesnio paketo parašyto C kompiliatoriaus.
Žinoma, jei prieš C buvo kitų aukšto lygio kalbų, tokių kaip Pascal, tada Pascal galėjo būti naudojamas C kompiliatoriui parašyti.
Teigiama, kad pirmojo Paskalio sudarytojas buvo parašytas Fortrane. Kaip pirmoji aukšto lygio kalba, Fortran kompiliatorius turėtų būti parašytas asamblėjos kalba.
2
Štai įdomi legenda apie kompiliatorių:
Legenda pasakoja, kad Ken Thompson, vienas iš Unix išradėjų, swaggered į bet Unix mašina Bell Labs, įvedė savo vartotojo vardą ir slaptažodį, ir galėjo prisijungti šakniniu būdu!
Bell Labs yra pilnas talentų, ir kai kurie kiti dideli buliai pažadėjo rasti šį pažeidžiamumą, jie perskaitė Unix C šaltinio kodą ir galiausiai rado prisijungimo užpakalines duris, o išvalę užpakalines duris, jie sukompiliavo Unix ir paleido, bet Thompson vis tiek galėjo prisijungti.
Kai kurie žmonės mano, kad gali kilti problemų su kompiliatoriumi, o kompiliuojant Unix buvo implantuotos užpakalinės durys, todėl jie perrašė kompiliatorių C ir vėl kompiliavo Unix su nauju kompiliatoriumi.
Bet jis vis dar neveikia, Thompson vis dar gali prisijungti su root, kuris yra tikrai pražūtingas!
Vėliau pats Thompsonas atrakino paslaptį, tai buvo pirmasis C kompiliatorius, turintis problemų, šis kompiliatorius, žinoma, bus implantuotas į užpakalines duris kompiliuojant Unix šaltinio kodą, to nepakanka, kas dar geriau, jei parašysite naują kompiliatorių C kalba, būtinai turite jį kompiliuoti į dvejetainį kodą, ką kompiliuoti, kompiliuoti naudokite tik pirmąjį Thompsono parašytą kompiliatorių, gerai, jūsų parašytas kompiliatorius bus užterštas, jūsų kompiliatorius vėl sukompiliuos Unix, Taip pat implantuos užpakalines duris :-)
Kalbant apie tai, man primena prieš kelerius metus įvykusį "XcodeGhost" incidentą, o tai tiesiog reiškia, kad "Xcode" buvo implantuotas Trojos arklys (atsisiųstas iš neoficialių kanalų), todėl "XCode" sudarytos "iOS" programos buvo užterštos, o šias programas įsilaužėliai galėjo naudoti neteisėtiems dalykams atlikti.
Nors šis "XCodeGhost" toli gražu nėra "Thompson", jis primena, kad atsisiųsdami programinę įrangą turėtumėte naudoti oficialius kanalus, atsisiųsti iš oficialios svetainės, ieškoti svetainės HTTPS standarto ir net patikrinti kontrolinę sumą.
3
Kai kurie žmonės gali paklausti: aš naudoju Hui parašyti Hello World pastraipą, bet kas nors gali naudoti jį parašyti sudėtingą kompiliatorių? Ar tai įmanoma?
Žinoma, kai buvo sukurta pirmoji Unix karta, C kalbos nebuvo, o Ken Thompson ir Dennis Ritchie spausdino Unix su surinkimo linijomis. Pirmąją WPS versiją parašė Qiu Bojun Hui, o Turbo Pascal kompiliatorių taip pat parašė Andersas Hui, o dievų sugebėjimai paprastiems žmonėms neįsivaizduojami.
Kompiliatoriams taip pat galima vystytis "sniego gniūžtės" būdu:
Vis dėlto imant C kalbą kaip pavyzdį, pirmoji versija gali pasirinkti C kalbos poaibį, pvz., palaiko tik pagrindinius duomenų tipus, proceso valdymo sakinius ir funkcijų iškvietimus...... Šį poaibį vadiname C0.
Tada parašykite kompiliatorių asamblėjos kalba ir gaukite tik šios kalbos C0 poaibį, kad būtų daug lengviau rašyti.
C0 kalba veikia, o tada išplečiame šį poaibį pridėdami struktūras, rodykles ...... ir pavadindami naują kalbą C1.
Kas rašo C1 kalbos kompiliatorių? Natūralu, kad tai yra C0.
Kai C1 veikia, dar kartą išplėskite kalbos funkcijas, parašykite kompiliatorių C1 ir gaukite C2.
Tada yra C3, C4...... Galiausiai gausite visą C kalbą.
Šis procesas vadinamas bootstrapping, o kinų kalba - bootstrapping.
|