"V katerem jeziku je napisan sam C?"
Z drugega vidika je tako: preden se jezik C zažene, ga je treba prevesti, od kod torej prihaja prevajalnik jezika C? V katerem jeziku je napisana? Če je napisano v samem C, ali je najprej jajce ali piščanec?
1
Predpostavimo, da na svetu ni prevajalnikov, začnimo z strojnim jezikom in poglejmo, kako.
Strojni jezik lahko procesor izvaja neposredno brez potrebe po prevajalniku.
Potem je tu asembler, čeprav je asembler le mnemotehnika za strojni jezik, vendar ga je treba prav tako prevesti v strojni jezik za izvajanje, zato ni druge izbire kot uporabiti strojni jezik za pisanje tega prvega prevajalnika (ki ga v prihodnosti ne bo več uporabljal).
Problem asemblerja je rešen in to je velik korak naprej; v tem času je mogoče uporabiti asembler za pisanje prevajalnika jezika C, za katerega pravimo, da je prednik prevajalnika C.
S tem prednikom lahko prevedeš katerikoli program v jeziku C, torej ali lahko napišeš prevajalnik v samem jeziku C? Preprosto ga združi s predniki.
OK, po takšni plasti sem končno dobil prevajalnik, napisan v C-ju, kar je res nadležno.
V tem trenutku je mogoče C prevajalnik, ki ga je napisal prejšnji paket, opustiti.
Seveda, če so obstajali drugi visokonivojski jeziki pred C, kot je Pascal, bi se Pascal lahko uporabil za pisanje C prevajalnika.
Prevodnik prvega Pascala naj bi bil napisan v Fortranu. Kot prvi visokonivojski jezik bi moral biti Fortranov prevajalnik napisan v asemblerju.
2
Tukaj je zanimiva legenda o prevajalniku:
Legenda pravi, da je Ken Thompson, eden od izumiteljev Unixa, samozavestno prišel do kateregakoli Unix računalnika v Bell Labs, vnesel svoje uporabniško ime in geslo ter se lahko prijavil na root način!
Bell Labs je poln talentov, nekateri veliki strokovnjaki so obljubili, da bodo našli to ranljivost, prebrali so izvorno kodo Unixa v C in končno našli prijavni zadnji vhod, po čiščenju zadnjih vrat pa so prevedli Unix in ga zagnali, a Thompson se je vseeno lahko prijavil.
Nekateri menijo, da je morda težava s prevajalnikom, saj so pri prevajanju Unixa vgradili zadnja vrata, zato so prevajalnik prepisali v C-ju in ponovno prevajali Unix z novim prevajalnikom.
A še vedno ne deluje, Thompson se lahko še vedno prijavi prek roota, kar je res uničujoče!
Kasneje je Thompson sam odklenil skrivnost, bil je prvi prevajalnik v C, ki je imel težavo, ta prevajalnik bo seveda vgrajen v zadnja vrata pri prevajanju izvorne kode Unixa, to ni dovolj, še bolje, če napišeš nov prevajalnik v jeziku C, ga moraš vsekakor prevesti v binarno kodo, kaj prevajati, uporabi samo prvi prevajalnik, ki ga je napisal Thompson, prav, prevajalnik, ki si ga napisal, bo onesnažen, tvoj prevajalnik bo spet prevedel Unix, Vgradil bom tudi zadnja vrata :-)
Ko smo že pri tem, se spomnim incidenta XcodeGhost pred nekaj leti, kar preprosto pomeni, da je bil v Xcode vgrajen trojanski konj (prenesen z neuradnih kanalov), tako da so bile iOS aplikacije, ki jih je XCode prevedel, onesnažene, te aplikacije pa so lahko hekerji uporabljali za nezakonite naloge.
Čeprav je ta XCodeGhost daleč od Thompsonovega, nas opominja, da je treba pri prenosu programske opreme uporabiti formalne kanale, prenesti z uradne spletne strani, poiskati HTTPS standard spletne strani in celo preveriti kontrolno vsoto.
3
Nekateri se morda sprašujejo: Jaz uporabljam Hui za pisanje odstavka Hello World, a nekdo ga lahko uporabi za pisanje kompleksnega prevajalnika? Je to mogoče?
Seveda, ko je bila razvita prva generacija Unixa, ni bilo jezika C, Ken Thompson in Dennis Ritchie pa sta Unix tipkala z montažnimi linijami. Prvo različico WPS je napisal Qiu Bojun v Hui, prevajalnik Turbo Pascala pa je prav tako napisal Anders v Hui, sposobnosti bogov pa si navadni ljudje ne morejo predstavljati.
Pri prevajalnikih je mogoče razvijati tudi na način "snežne kepe":
Če še vedno vzamemo kot primer jezika C, lahko prva različica izbere podmnožico jezika C, na primer podpira le osnovne podatkovne tipe, stavke za nadzor procesov in klice funkcij...... To podmnožico imenujemo C0.
Nato napiši prevajalnik v asemblerju in dobiš le podmnožico tega jezika C0, da je pisanje veliko lažje.
Jezik C0 deluje, nato pa to podmnožico razširimo z dodajanjem struktur, kazalcev, ...... in imenujemo novi jezik C1.
Kdo piše prevajalnik za jezik C1? Seveda je to C0.
Ko C1 deluje, ponovno razširite funkcije jezika, napišite prevajalnik s C1 in pridobite C2.
Potem sta tu še C3, C4...... Na koncu dobiš polni jezik C.
Ta postopek se imenuje bootstrapping, v kitajščini pa bootstrapping.
|