[Powered by Google Translate] ROB Bowden: Parunāsim par kompilatoru.
Līdz šajā punktā, jūs esat tikko ierakstījāt savu avota kodu
daži faili, sūtīja viņus pa šo lielo melno kasti, kas ir
Šķindoņa, un ārā nāk savu izpildāmo failu, kas dara
tieši to, ko jūs rakstījāt jūsu avota kodu.
As burvju kā ir bijis, mēs spēsim veikt tuvāk
apskatīt to, kas patiesībā notiek
kad mēs apkopotu failu.
Tātad, ko tas nozīmē, lai apkopotu kaut ko?
>> Nu, visvairāk vispārējā nozīmē, tas tikai nozīmē,
pārveidojot kods rakstīts vienā
programmēšanas valodas uz otru.
Bet parasti, kad cilvēki saka, viņi sastādīt kaut ko, viņi
domāju viņi lieto to no augstāka līmeņa plānošanas
valoda zemāka līmeņa programmēšanas valodu.
Tās var šķist ļoti subjektīviem nosacījumiem.
Piemēram, jūs, iespējams, nav jādomā par C, kā augsts
līmeņa programmēšanas valoda, bet jūs salīdzināšanu.
Bet tas viss ir relatīvs.
Kā mēs redzēsim, montāža kodu un beidzot mašīna
kods, kas mēs apkopotu uz leju, ir nenoliedzami zemāka līmeņa
kā C.
Kaut arī mēs būsim, izmantojot šķindēt mūsdienu demonstrācijas,
Daudz no idejām šeit pārnest uz citām apkopotājiem.
>> Par šķindēt, ir četri galvenie soļi kopējā
apkopošanas.
Tie ir viens, preprocessing izdarīt apstrādātāju, divi,
kompilācija darīts ar kompilatoru, trīs, montāža
darīts ar montētājs, un četri,
saistot darīts ar linker.
To var būt mulsinoši, ka viens no kopējās substeps
Šķindēt sastādītāji sauc sastādītājs, bet
mēs nokļūt, ka.
Mēs būsim, izmantojot vienkāršu Hello World programmu mūsu piemērs
visā šajā video.
Pieņemsim to apskatīt.
>> Pirmais solis ir preprocessing.
Ko apstrādātāju darīt?
Diezgan daudz ik C programmu esat kādreiz lasīt vai rakstisku,
Jūs esat izmantojis rindas kodu, kas sākas ar hash.
Es aicinu to hash, bet jūs varat arī zvanīt to mārciņas, skaits
parakstīt, vai asas.
Jebkura šāda līnija ir apstrādātāju direktīva.
Jūs, iespējams, redzējuši # definētu un # ietvert agrāk, taču tur
Ir vēl citas, ka apstrādātāju atzīst.
Pieņemsim pievienot # define mūsu sveiki pasaules piemērs.
Tagad palaist tikai preprocessor ar šo lietu.
Nokārtojot clage the-E karogu, jūs uzdodot to palaist
tikai apstrādātāju.
Paskatīsimies, kas notiek.
Izskatās šķindēt vienkārši atklepo viss
pie komandrindas.
Lai saglabātu visu šo produkciju uz jaunu failu ar nosaukumu
hello2.c, mēs pievienot> hello2.c mūsu komandu.
Tagad pieņemsim apskatīt mūsu preprocessed failu.
>> Paga, kas notika ar mūsu īso maz programmu?
Ja mēs iet visu ceļu uz leju šo failu, mēs redzēsim
daži kodu, ka mēs faktiski wrote.
Ievērojiet, ka # define ir aizgājuši un visu vārda gadījumi
ir aizstāti ar tieši to, ko mēs noteikti
# define līniju.
Tātad, kādi ir visi šie typedefs un funkciju deklarācijas
augšpusē failu?
Ievērojiet, ka # define nebija vienīgais apstrādātāju
direktīva, mēs noteikti.
Mēs arī esam # ietvert stdio.h.
Tātad visi traks līnijas ir faktiski tikai stdio.h kopēti
un ielīmēt augšpusē šo failu.
Tieši tāpēc header faili ir tik noderīgi funkcijas
deklarācijas.
Tā vietā, lai nepieciešamības kopēt un ielīmēt visu funkciju
deklarācijas jūs plānojat izmantot augšpusē jūsu failu,
apstrādātāju kopēt un ielīmēt tos no galvenes
fails jums.
>> Tagad, ka mēs esam darīts preprocessing, mēs virzāmies uz
apkopošanas.
Iemesls, kāpēc mēs saucam šo soli kompilāciju ir, jo tas ir
solis kad šķindēt faktiski nav tās apkopojot no C līdz
montāža kodu.
Lai būtu šķindēt veido lietu līdz montāžu, bet
turpināt vairs nav, nodot to the-S karogs
pie komandrindas.
Pieņemsim to apskatīt montāžas
failu, ko bija izvadīt.
Tas izskatās diezgan citā valodā.
Montāža kods ir ļoti procesors specifiska.
Šajā gadījumā, jo CS50 ierīce darbojas
virtuālā x86 procesoru, tas ir x86 montāža kodu.
Ļoti maz cilvēku rakstīt tieši montāžas kodu šajās dienās,
bet katru C programma jūs kādreiz uzrakstīt izpaužas pārveidots leju
uz pulcēšanās.
Atkal, mēs saucam šo soli apkopojot C uz pulcēšanās
jo mēs ejam no augstāka līmeņa uz zemāku līmeni
programmēšanas valodu.
>> Kas padara montāža zemāku līmeni, nekā C?
Nu, montāžu, mēs esam ļoti ierobežota, ko mēs varam darīt.
Nav IF, bet s, par s, vai cilpas nekādu.
Bet jūs varat paveikt pašas lietas, kas šiem kontroles
struktūras piedāvā izmantojot ierobežotos operācijas,
montāža tas sniedz.
Bet, lai redzētu, cik zems līmenis montāža patiešām ir, iesim
vienu soli tālāk mūsu apkopošanā, montāža.
Tas ir montētājam darbs, lai pārveidotu montāžas kodu
uz objektu vai mašīnu kodu.
Atcerieties, ka montētājs nav izejas montāžu;
drīzāk, tas aizņem montāžā un izvadi mašīnu kodu.
Mašīnu kods ir faktiskā 1 devēja un 0, ka CPU var
saprotu, kaut gan mums vēl ir niecīga darba bit atlicis
Pirms mēs varam vadīt mūsu programmu.
Pieņemsim apkopot mūsu montāžas kodu, izejot
Šķindēt-c karogu.
Tagad pieņemsim redzēt, kas samontētajā failā.
>> Nu, tas nepalīdz mums ļoti daudz.
Atcerieties, ka mašīna kods ir tie, un nullītes ka
dators var saprast.
Tas nenozīmē, ka tas ir viegli, lai mēs saprastu.
Tātad, kā tieši zems līmenis ir montāža?
Tas ir gandrīz identisks objekta kodu.
Iet no montāžas līdz objekta kodu ir daudz vairāk
tulkojums nekā transformācija, kas ir iemesls, kāpēc
varētu neuzskata montētājam, lai
darīt kaut faktisko sagatavošanu.
Faktiski, tas ir diezgan viegli, lai manuāli tulkot no
montāža uz mašīnu kodu.
Raugoties uz Bloks galvenā funkcija, kas pirmā līnija
notiek, lai atbilstu heksadecimālo 0x55.
Binārā, ka ir 1.010.101.
Otrajā rindā notiek, lai atbilstu heksadecimālo 0x895.
Un nākamais, 0x56.
Ņemot vērā samērā vienkārši galda, jūs varētu tulkot
montāža uz kodu ka mašīnas var saprast arī.
>> Tātad tur ir viens atlikušais posms
kompilācija, kas savieno.
Savieno apvieno ķekars objektu failus vienā lielā failā
ka jūs faktiski var izpildīt.
Saistot ir ļoti sistēma atkarīgi.
Tāpēc vienkāršākais veids, kā iegūt šķindēt lai tikai saite objektu
failus kopā ir aicināt šķindēt par visiem failiem, kas
vēlaties saistīt kopā.
Ja jūs norādiet. O failus, tad tas nav nepieciešams pārstrādāt,
apkopot, un apkopot visu jūsu avota kodu.
Pieņemsim mest math funkcijas mūsu failu, tāpēc mums ir
kaut saistīt iekšā
Tagad pieņemsim sastādīt to atpakaļ uz leju, lai objekta kodu un
aicināt šķindēt par to.
Hmm.
Tā mēs iekļāvām math funkcijas, mums saiti
math bibliotēka ar-LM.
>> Ja mēs vēlējāmies, lai savienotu ķekars. O failus, kas mums
rakstīja par mūsu pašu, mēs gribētu vienkārši norādiet tos visus
komandrindas.
Ierobežojums ir tas, ka tikai viens no šiem failiem jābūt
faktiski norādīt galveno funkciju, vai arī
rezultātā izpildāmā nezinu, kur sākt
rādīt savu kodu.
Kāda ir atšķirība starp norādot failu saistīt ar atšķirību
ar-l un vienkārši norādot failu tieši?
Nekas.
Tas ir tikai, ka šķindēt notiek precīzi zināt, ko failu
kaut kā-LM notiek atsaukties uz.
Ja jūs zinātu, ka failu sevi, jūs varētu norādīt to
skaidri.
Tikai atceraties, ka viss-l karogiem ir jānāk beigās
Jūsu klienta pieprasījuma.
>> Un tas viss notiek ar to.
Kad jūs vienkārši palaist šķindēt par dažiem failiem, tas ir, kas tas ir
faktiski dara.
Mans vārds ir Rob Bowden, un tas ir CS50.