"Millä kielellä C itsessään on kirjoitettu?"
Toisesta näkökulmasta se on: ennen kuin C-kieli käynnistyy, se täytyy kääntää, joten mistä C-kielen kääntäjä tulee? Millä kielellä se on kirjoitettu? Jos se on kirjoitettu itse C:llä, onko ensin muna vai kana?
1
Oletetaan, ettei maailmassa ole kääntäjiä, aloitetaan konekielestä ja katsotaan miten.
Konekieli voidaan suorittaa suoraan prosessorilla ilman kääntäjää.
Sitten on assembler-kieli, vaikka assembler-kieli on vain konekielen muisti, mutta se täytyy myös kääntää konekieleksi suorittaa varten, joten ei ole muuta vaihtoehtoa kuin käyttää konekieltä tämän ensimmäisen kääntäjän kirjoittamiseen (jota ei käytetä tulevaisuudessa).
Assembly-kielen ongelma on ratkaistu, ja se on suuri askel eteenpäin; tällä hetkellä on mahdollista käyttää assembler-kieltä C-kielen kääntäjän kirjoittamiseen, jonka sanomme olevan C-kääntäjän edeltäjä.
Tämän esi-isän avulla voit kääntää minkä tahansa C-kielen ohjelman, joten voitko kirjoittaa kääntäjän itse C-kielellä? Kokoa se vain esi-isien kanssa.
Okei, tällaisen kerroksen jälkeen sain vihdoin C-kielellä kirjoitetun kääntäjän, mikä on todella hankalaa.
Tässä vaiheessa edellisen paketin kirjoittama C-kääntäjä voidaan hylätä.
Tietenkin, jos ennen C:tä oli muita korkean tason kieliä, kuten Pascal, niin Pascalia voitiin käyttää C-kääntäjän kirjoittamiseen.
Ensimmäisen Pascalin kokoajan sanotaan olevan kirjoitettu Fortranilla. Ensimmäisenä korkean tason kielenä Fortranin kääntäjä tulisi kirjoittaa assembler-kielellä.
2
Tässä mielenkiintoinen legenda kääntäjästä:
Legendan mukaan Ken Thompson, yksi Unixin keksijöistä, käveli mihin tahansa Unix-koneeseen Bell Labsissa, syötti käyttäjätunnuksensa ja salasanansa ja pystyi kirjautumaan sisään juuritavalla!
Bell Labs on täynnä lahjakkuutta, ja jotkut muut isot härkät vannoivat löytävänsä tämän haavoittuvuuden, he lukivat Unixin C-lähdekoodin ja löysivät lopulta kirjautumistakaportin, ja puhdistettuaan takaportin he käänsivät Unixin ja suorittivat sen, mutta Thompson pystyi silti kirjautumaan sisään.
Jotkut ajattelevat, että kääntäjässä saattaa olla ongelma, ja Unixin kääntämiseen asennettiin takaportti, joten he kirjoittivat kääntäjän uudelleen C-kielellä ja käänsivät Unixin uudelleen uudella kääntäjällä.
Mutta se ei silti toimi, Thompson voi silti kirjautua rootilla, mikä on todella musertavaa!
Myöhemmin Thompson itse avasi salaisuuden, se oli ensimmäinen C-kääntäjä, jolla oli ongelma, tämä kääntäjä istutetaan tietenkin takaoveen Unix-lähdekoodin kääntämisen yhteydessä, se ei riitä, mikä vielä parempaa, jos kirjoitat uuden kääntäjän C-kielellä, sinun täytyy ehdottomasti kääntää binäärikoodiksi, mitä kääntää, käytä vain ensimmäistä Thompsonin kirjoittamaa kääntäjää, okei, kirjoittamasi kääntäjä on saastunut, kääntäjäsi kääntää Unixin uudelleen, Asennan myös takaoven :-)
Puhuen siitä, minulle tulee mieleen muutama vuosi sitten tapahtunut XcodeGhost-tapaus, joka tarkoittaa yksinkertaisesti sitä, että Xcodeen istutettiin Troijan hevonen (ladattu epävirallisista kanavista), jotta XCoden kokoamat iOS-sovellukset saastuivat, ja näitä sovelluksia voitiin käyttää hakkereille.
Vaikka tämä XCodeGhost on kaukana Thompsonista, se muistuttaa meitä siitä, että ohjelmistoa ladatessa kannattaa käyttää virallisia kanavia, ladata viralliselta verkkosivustolta, etsiä sivuston HTTPS-standardi ja jopa tarkistaa tarkistussumma.
3
Jotkut saattavat kysyä: Käytän Hui:ta kirjoittaakseni Hello World -kappaleen, mutta joku voi käyttää sitä monimutkaisen kääntäjän kirjoittamiseen? Onko tämä mahdollista?
Tietenkin, kun ensimmäisen sukupolven Unix kehitettiin, C-kieltä ei ollut, ja Ken Thompson sekä Dennis Ritchie kirjoittivat Unixin kokoonpanolinjoilla. WPS:n ensimmäisen version kirjoitti Qiu Bojun Hui-kielellä, ja Turbo Pascalin kääntäjä oli myös Andersin kirjoittama Hui-kielellä, eikä jumalten kyvyt ole tavallisille ihmisille käsittämättömiä.
Kääntäjille on myös mahdollista kehittyä "lumipallolla":
Ottaen edelleen C-kielen esimerkkinä, ensimmäinen versio voi valita osan C-kielestä, kuten tukea vain perustietotyyppejä, prosessinohjauslauseita ja funktiokutsuja...... Tätä alajoukkoa kutsutaan C0:ksi.
Sitten kirjoita kääntäjä assembler-kielellä ja saat vain osan tästä kielestä C0, jolloin kirjoittaminen on paljon helpompaa.
C0-kieli toimii, ja laajennamme tätä osajoukkoa lisäämällä rakenteita, osoittimia, ...... ja kutsumalla uutta kieltä C1:ksi.
Kuka kirjoittaa kääntäjän C1-kielelle? Luonnollisesti se on C0.
Kun C1 toimii, laajenna kielen ominaisuuksia uudelleen, kirjoita kääntäjä C1:llä ja saat C2.
Sitten on C3, C4...... Lopuksi saat täyden C-kielen.
Tätä prosessia kutsutaan bootstrappingiksi, ja kiinaksi bootstrappingiksi.
|