[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.