"Milyen nyelven van írva a C?"
Más nézőpontból ez az: mielőtt a C nyelv futna, le kell fordítani, akkor honnan származik a C nyelv fordítója? Milyen nyelven van írva? Ha maga C-vel van írva, először tojás vagy csirke van?
1
Tegyük fel, hogy a világon nincsenek fordítók, kezdjük a gépi nyelvvel, és nézzük meg, hogyan.
A gépi nyelvet közvetlenül a CPU futtathatja lefordító nélkül.
Aztán ott van az assembly nyelv, bár az assembly nyelv csak egy memória a gépnyelvre, de a végrehajtáshoz gépnyelvre is le kell fordítani, így nincs más választás, mint gépi nyelvet használni az első fordítógép megírásához (amit a jövőben nem használnak).
Az assembly nyelv problémája megoldódott, és ez nagy előrelépés, jelenleg lehetséges az assembly nyelv segítségével megírni a C nyelvű fordítót, amelyet a C fordító elődjének nevezünk.
Ezzel az ősszel bármilyen C nyelvű programot lefordíthatsz, tehát lehet maga C nyelven is fordítót írni? Csak fordítsd össze az ősökkel.
Rendben, egy ilyen réteg után végre egy C nyelvű fordítót írtam, ami nagyon problémás.
Ezen a ponton az előző csomag által írt C fordító el lehet hagyni.
Természetesen, ha léteztek más magas szintű nyelvek a C előtt, például a Pascal, akkor Pascal segítségével C fordítót lehetne írni.
Az első Pascal összeállítóját állítólag Fortranban írták. Mint az első magas szintű nyelv, a Fortran fordítóját assembler nyelven kell írni.
2
Íme egy érdekes legenda a fordításról:
A legenda szerint Ken Thompson, az Unix egyik feltalálója, odasétált bármelyik Unix géphez a Bell Labs-ban, beírta a felhasználónevét és jelszavát, és be tudott jelentkezni a gyökér módon!
A Bell Labs tele van tehetséggel, és néhány más nagy ügy is megfogadta, hogy megtalálja ezt a sebezhetőséget, átolvasták a Unix C forráskódját, végül megtalálták a bejelentkezési hátsó ajtót, majd miután kitakarították a hátsó ajtót, lefordították a Unixot és futtatták, de Thompson még mindig be tudott jelentkezni.
Egyesek úgy gondolják, hogy a fordítóval lehet probléma, és Unix fordítása során egy hátsó ajtót ültettek be, ezért újraírtak egy C-fordítást, és újra egy új fordítóval fordították le Unixot.
De ez még mindig nem működik, Thompson még mindig be tud jelentkezni roottal, ami nagyon összetörő!
Később maga Thompson feloldotta a titkot, ez volt az első C fordító, amivel problémát okozott, ez a fordító természetesen a hátsó ajtóba kerül Unix forráskód fordításakor, ez nem elég, ami még jobb, ha új fordítót írsz C nyelven, mindenképp bináris kódba kell fordítanod, mit kell fordítani, csak az első Thompson által írt fordítót használd a fordításhoz, rendben, a fordítód szennyezett lesz, a fordítód újra Unix-ot fordít, Hátsó ajtót is beültetek :-)
Eszembe jutott az XcodeGhost incidens néhány évvel ezelőtt, ami egyszerűen azt jelenti, hogy egy trójai falót ültettek be az Xcode-ba (nem hivatalos csatornákról letöltötték), így az XCode által összefordított iOS alkalmazások szennyezettek voltak, és ezeket az alkalmazásokat hackerek illegális dolgokra használhatták.
Bár ez az XCodeGhost messze áll a Thompsonétól, emlékeztet minket arra, hogy szoftverletöltéskor hivatalos csatornákat kell használni, letölteni a hivatalos weboldalról, keresni a weboldal HTTPS szabványát, sőt ellenőrizni az ellenőrző összeget is.
3
Néhányan megkérdezhetik: Én Hui-val írok egy Hello World bekezdést, de valaki képes vele összetett fordítót írni? Ez lehetséges?
Természetesen, amikor az első generáció Unixet fejlesztették, nem volt C nyelv, és Ken Thompson és Dennis Ritchie gépeltek Unix-et összeszerelő vonalakkal. A WPS első változatát Qiu Bojun írta Hui-ban, a Turbo Pascal összeállítóját is Anders írta Hui-ban, és az istenek képességei elképzelhetetlenek a hétköznapi emberek számára.
A fordítók esetében "hógolyó" módon is fejleszthetők:
A C nyelvet példaként veszve: az első verzió választhat egy részhalmazt a C nyelvből, például csak az alapvető adattípusok, folyamatvezérlő utasítások és függvényhívások támogatása...... Ezt az alhalmazt C0-nak hívjuk.
Ezután írjunk egy fordítót assembly nyelven, és csak egy részhalmazt kapjunk ebből a nyelvből, C0, így sokkal könnyebb legyen írni.
A C0 nyelv működik, majd ezt az részhalmazt bővítjük structok, mutatók, ...... hozzáadásával, és az új nyelv C1-nek nevezésével.
Ki írja a C1 nyelv fordítóját? Természetesen C0.
Amikor a C1 működik, bővítsd ki újra a nyelvi funkciókat, írd meg a fordítót C1-gyel, és kapd meg a C2-t.
Aztán ott van a C3, C4...... Végül megkapod a teljes C nyelvet.
Ezt a folyamatot bootstrappingnek hívják, kínaiul pedig bootstrappingnek.
|