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