[Powered by Google Translate] ROB Bowden: Puhutaanpa kerääjiä. Tähän saakka, olet juuri kirjoittanut oman lähdekoodia tiedostoja, lähetti ne läpi tämä iso musta laatikko, joka on Kalahtaa, ja ulos tulee sinun suoritettava tiedosto, joka ei mitä kirjoitit lähdekoodia. Niin maaginen kuin on ollut, aiomme ottaa tarkemmin katsoa, ​​mitä todella tapahtuu kun me koota tiedostoa. Joten mitä se tarkoittaa kerätä jotain? No, yleisin mielessä, se vain tarkoittaa muuttaa koodia kirjoitettu jollakin ohjelmointikieli toiseen. Mutta yleensä kun ihmiset sanovat kääntää jotain, he Tarkoittaako he ottavat sen korkeamman tason ohjelmointi kieli alemman tason ohjelmointikieli. Nämä voivat tuntua hyvin subjektiivisia ehdot. Esimerkiksi et todennäköisesti ajattele C korkea tason ohjelmointikieli, mutta et kääntää sen. Mutta se kaikki on suhteellista. Kuten näemme, kokoonpano koodi ja lopulta kone koodin että meidän kääntää alas on kiistatta pienempi kuin C. Vaikka Käytämme clang nykypäivän esittelyn, Paljon ideoita siirtää muihin kerääjiä. Sillä clang on neljä päävaihetta yleisessä kokoelma. Nämä ovat yksi, esikäsittely tehdään esikäsittelijän, kaksi, kokoelma tehdä kääntäjän, kolme, kokoonpano tapahtuu kokoajan ja neljä, yhdistää tekemä linkkeri. Se voi olla hämmentävä, että yksi alivaiheet yleisen Clang kääntäjät kutsutaan kääntäjä, mutta saamme siihen. Käytämme yksinkertaista hello world ohjelman esimerkkielokuvaksi koko tämän videon. Katsotaanpa katsomaan. Ensimmäinen askel on esikäsittely. Mitä esikäsittelijä tehdä? Melko paljon joka C-ohjelma olet koskaan lukenut tai kirjoittanut, olet käyttänyt riviä koodia, jotka alkavat hash. Soitan sitä hash, mutta voit myös soittaa sitä kiloa, määrä allekirjoittaa tai teräviä. Tällainen linja on esikäsittelijä direktiivi. Olet varmasti nähnyt # define ja # include ennen, mutta useita yli esikäsittelijä tunnistaa. Katsotaanpa lisätä # define meidän Moikka maailma esimerkki. Nyt ajaa vain esikäsittelijän tämän tiedoston. Johtamalla clage-E lippua, et käskee sen toimimaan vain esikäsittelijä. Katsotaan mitä tapahtuu. Näyttää siltä clang vain sylkee kaiken komentoriviltä. Jotta säästää kaikki tämä lähtö uuden tiedoston nimeltä hello2.c, me liittää> hello2.c meidän komentoa. Nyt katsomaan meidän esikäsiteltyjä tiedosto. Hei, mitä tapahtui meidän lyhyt pikku ohjelma? Jos menemme aina pohjaan tämän tiedoston, näemme joitakin koodin että me todella kirjoitti. Huomaa, että # define on mennyt ja kaikki esiintymät nimi on korvattu mitä me määritetty # define linjaa. Joten mitä ovat nämä typedefs ja toiminta ilmoitukset yläreunassa tiedoston? Huomaa, että # define ollut ainoa esikäsittelijä direktiivi, jota määritetty. Olemme myös # include stdio.h. Joten kaikki hulluja linjat ovat oikeastaan ​​vain stdio.h kopioitu ja liittää tämän tiedoston. Siksi header-tiedostot ovat niin hyödyllisiä toiminto ilmoituksia. Sen sijaan tarvitse kopioida ja liittää kaikki funktion ilmoitukset aiot käyttää yläreunassa tiedoston, esikäsittelijään kopioi ja liitä ne header tiedoston sinulle. Nyt olemme tehneet esikäsittely, siirrymme päälle kokoelma. Syy me kutsumme tätä vaihetta kokoelma, koska tämä on vaihe, jossa clang todellisuudessa ei sen kokoamiseen C: stä kokoonpano koodi. Jotta clang kokoamaan tiedosto alas kokoonpanoon, mutta jatkaa enää, vie se-S lippua komentoriviltä. Katsotaanpa katsomaan kokoonpano tiedostoa ei ulos. Se näyttää aivan eri kieltä. Assembly-koodi on hyvin prosessori erityinen. Tässä tapauksessa, koska CS50 laite on käynnissä virtuaalinen x86-prosessori, tämä on x86 kokoonpano koodi. Hyvin harvat ihmiset kirjoittavat suoraan assembly näinä päivinä, mutta jokainen C ohjelma ikinä kirjoittaa saa muuntaa alas osaksi kokoonpanoon. Jälleen me kutsumme tätä vaihetta kokoamiseen C osaksi kokoonpanoon koska olemme menee korkeamman tason alemmalle tasolle ohjelmointikieli. Mikä tekee kokoonpano alhaisempi kuin C? No, kokoonpano, olemme hyvin rajalliset, mitä voimme tehdä. Ei ole olemassa, jos: n, kun taas on varten on, tai silmukoita tahansa. Mutta voit toteuttaa samoja asioita näiden valvontajärjestelmien rakenteet tarjoavat käyttäen rajoitettua toimintaa, että kokoonpano ei tarjota. Mutta nähdä miten vähäinen kokoonpano on todella mennään yksi askel eteenpäin meidän kokoelma, kokoonpano. Se kokoonpanotyöntekijän työ muuttaa assembly osaksi esine tai konekielelle. Muista, että kokoajan ei tuotos kokoonpano; vaan se vie kokoonpanossa ja lähdöt konekielelle. Machine koodi on todellinen 1: n ja 0: n että CPU ymmärtää, vaikka meillä on vielä pikkuisen työtä jäljellä ennen kuin voimme ajaa ohjelmaamme. Katsotaanpa koota meidän kokoonpano koodi ajamalla Clang-c lippua. Nyt katsotaanpas mitä on koottuna tiedostoon. No, se ei auta meitä paljon. Muista, että kone koodi on ykkösiä ja nollia, että tietokone voi ymmärtää. Tämä ei tarkoita sitä helppo ymmärtää. Joten miten alhainen taso on kokoonpano? Se on melkein identtinen kohdekoodilla. Menee edustajakokouksen kohdekoodit paljon enemmän kääntäminen kuin muunnos, minkä vuoksi voitaisiin pidä kokoajan tehdä mitään todellisia kootaan. Itse asiassa se on melko helppo manuaalisesti kääntää kokoonpano konekielelle. Tarkasteltaessa kokoonpano päätehtävä, että ensimmäinen rivi tapahtuu vastaavat heksadesimaalinen 0x55. Binary, se on 1010101. Toinen rivi sattuu vastaamaan heksadesimaalinen 0x895. Ja seuraavaksi, 0x56. Koska suhteellisen yksinkertainen taulukko, voit kääntää asentamista koodin että koneet voivat ymmärtää myös. Eli siellä on yksi jäljellä askel kokoelma, joka yhdistää. Linkitys yhdistää joukko esine tiedostoja yhdeksi suureksi tiedostoksi että voit itse suorittaa. Linkittäminen on hyvin riippuu järjestelmästä. Joten helpoin tapa saada clang vain linkittää objektin Tiedostojen yhdessä on soittaa clang kaikista tiedostoista haluat liittää yhteen. Jos määrität. O-tiedostoja, se ei tarvitse jälleenkäsitellä, koota ja koota kaikki lähdekoodia. Katsotaanpa heittää matematiikka funktion meidän tiedostoon, joten meillä on jotain linkittää sisään Nyt kääntää sen takaisin alas kohdekoodin ja kutsua clang sitä. Oho. Koska olemme mukana matematiikka toiminto, meidän linkittämään math kirjasto-lm. Jos haluaisimme liittää yhteen joukko. O tiedostot me kirjoitti oman, olimme vain määrittää ne kaikki komentoriviltä. Rajoitus on se, että vain yksi näistä tiedostoista on itse määritellä päätehtävä, tai muuten Tuloksena executable ei tiedä mistä aloittaa käynnissä koodi. Mitä eroa määrittämällä tiedoston linkittämään with-l ja vain määrittämällä tiedoston suoraan? Mitään. Se on vain, että clang sattuu tietää tarkalleen, mitä tiedosto jotain-LM sattuu viitata. Jos tiesi, että tiedoston itse, voit määrittää sen nimenomaisesti. Muistathan, että kaikki-l liput täytyy tulla lopussa oman asiakkaan kysynnän. Ja se kaikki on sitä. Kun vain ajaa clang joitakin tiedostoja, tämä on mitä se on todella tekee. Nimeni on Rob Bowden, ja tämä on CS50.