1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB Bowden: Pogovorimo se o prevajalniki. 2 00:00:09,100 --> 00:00:11,490 Do te točke, ste pravkar vnesli svoj izvorne kode v 3 00:00:11,490 --> 00:00:14,260 nekatere datoteke, ki jih pošljejo po tej veliki črni skrinjici, ki je 4 00:00:14,260 --> 00:00:16,890 Jek, in iz prihaja vaš izvedljivo datoteko, ki stori 5 00:00:16,890 --> 00:00:19,430 točno to, kar si napisal v svoji izvorni kodi. 6 00:00:19,430 --> 00:00:22,170 Kot čarobno, kot da je že, da bomo lahko približali 7 00:00:22,170 --> 00:00:23,590 poglejte, kaj se pravzaprav dogaja 8 00:00:23,590 --> 00:00:25,220 ko pripravijo dokumentacijo. 9 00:00:25,220 --> 00:00:28,580 Torej, kaj to pomeni za sestavljanje kaj? 10 00:00:28,580 --> 00:00:31,150 >> No, v najbolj splošnem pomenu, to pomeni le, 11 00:00:31,150 --> 00:00:32,580 preoblikovanje kode, napisane v enem 12 00:00:32,580 --> 00:00:34,680 programski jezik za drugo. 13 00:00:34,680 --> 00:00:37,550 Ampak ponavadi, ko ljudje pravijo, da pripravi nekaj, ki jih 14 00:00:37,550 --> 00:00:39,660 pomeni, da si s tem, da z višjega nivoja programiranja 15 00:00:39,660 --> 00:00:42,460 jezika na nižji ravni programskega jezika. 16 00:00:42,460 --> 00:00:44,960 To se lahko zdi kot zelo subjektivnih izrazov. 17 00:00:44,960 --> 00:00:48,090 Na primer, vam verjetno ne misliš C, kakor so visoka 18 00:00:48,090 --> 00:00:51,440 višji programski jezik, vendar vam ga pripravijo. 19 00:00:51,440 --> 00:00:52,730 Ampak to je vse relativno. 20 00:00:52,730 --> 00:00:55,790 Kot bomo videli, je skupščina kodo in na koncu stroj 21 00:00:55,790 --> 00:00:59,270 Koda, ki jih pripravijo do nedvomno nižji ravni 22 00:00:59,270 --> 00:01:00,700 kot C. 23 00:01:00,700 --> 00:01:03,310 Čeprav bomo uporabljali Jek na današnji predstavitvi, 24 00:01:03,310 --> 00:01:06,360 Veliko idej tu prenesejo na druge prevajalniki. 25 00:01:06,360 --> 00:01:09,160 >> Za Jek, obstajajo štiri glavne korake v skupni 26 00:01:09,160 --> 00:01:10,200 kompilacija. 27 00:01:10,200 --> 00:01:15,430 To so eno, predobdelava opravi Preprocessor, 2, 28 00:01:15,430 --> 00:01:19,530 sestavljanje opravi prevajalnik, 3, montaža 29 00:01:19,530 --> 00:01:22,010 opravi monter in 4, 30 00:01:22,010 --> 00:01:24,640 povezovanje opravi povezovalnik. 31 00:01:24,640 --> 00:01:27,600 To je lahko zavajajoče, da je eden od substeps v skupni 32 00:01:27,600 --> 00:01:30,980 Jek prevajalniki se imenuje prevajalnik, vendar 33 00:01:30,980 --> 00:01:32,530 bomo prišli do tega. 34 00:01:32,530 --> 00:01:35,050 Mi bomo z enostavnim Hello World program našem primeru 35 00:01:35,050 --> 00:01:36,270 v tem videu. 36 00:01:36,270 --> 00:01:38,380 Oglejmo si. 37 00:01:38,380 --> 00:01:40,330 >> Prvi korak je predobdelava. 38 00:01:40,330 --> 00:01:42,520 Kaj preprocesor storiti? 39 00:01:42,520 --> 00:01:45,560 V precej vsak C-ste kdaj prebral ali pisno, 40 00:01:45,560 --> 00:01:48,310 ste se uporablja vrstic kode, ki se začnejo z znakom. 41 00:01:48,310 --> 00:01:51,730 Poklical bom pa hašiš, vendar pa lahko tudi rekli funtov, število 42 00:01:51,730 --> 00:01:53,280 podpisati ali oster. 43 00:01:53,280 --> 00:01:56,840 Vsaka taka linija preprocesor direktiva. 44 00:01:56,840 --> 00:02:00,650 Verjetno ste že videli # # define in tudi prej, vendar 45 00:02:00,650 --> 00:02:03,690 Obstaja več bolj zaveda, da je preprocesor. 46 00:02:03,690 --> 00:02:07,340 Naj dodamo # define za naše zdravo primer v svetu. 47 00:02:07,340 --> 00:02:11,690 Zdaj pa deluje ravno Preprocessor o tej zadevi. 48 00:02:11,690 --> 00:02:16,150 S sprejemom clage zastavo-e, ki ste ga poučuje, da deluje 49 00:02:16,150 --> 00:02:17,880 Samo preprocesor. 50 00:02:17,880 --> 00:02:19,130 Poglejmo, kaj se zgodi. 51 00:02:22,250 --> 00:02:24,020 Izgleda Jek samo izpljune vse 52 00:02:24,020 --> 00:02:25,200 v ukazni vrstici. 53 00:02:25,200 --> 00:02:27,800 Da bi prihranili vse te proizvodnje v novo datoteko, imenovano 54 00:02:27,800 --> 00:02:33,850 hello2.c bomo priložiti> hello2.c na naš ukaz. 55 00:02:33,850 --> 00:02:37,800 Zdaj pa si oglejte na naši preprocessed datoteke. 56 00:02:37,800 --> 00:02:40,810 >> Opa, kaj se je zgodilo z našim kratko malo programa? 57 00:02:40,810 --> 00:02:43,890 Če bomo šli vse do dna te datoteke, bomo videli 58 00:02:43,890 --> 00:02:46,070 nekaj kode, ki smo dejansko napisal. 59 00:02:46,070 --> 00:02:49,800 Obvestilo, da je odšla # define in vsi primerki ime 60 00:02:49,800 --> 00:02:51,950 so zamenjali z natanko tisto, kar je določeno v 61 00:02:51,950 --> 00:02:53,590 na # define linijo. 62 00:02:53,590 --> 00:02:56,530 Torej, kaj so vse te typedefs in funkcijske izjave 63 00:02:56,530 --> 00:02:58,140 Na vrhu datoteke? 64 00:02:58,140 --> 00:03:00,820 Obvestilo, da je # define ni bil edini preprocesor 65 00:03:00,820 --> 00:03:02,390 Direktiva, ki smo opredelili. 66 00:03:02,390 --> 00:03:05,280 Imamo tudi # include stdio.h. 67 00:03:05,280 --> 00:03:09,560 Torej, vse nore linije so v resnici le stdio.h kopiranje 68 00:03:09,560 --> 00:03:11,810 in prilepite v vrhu te datoteke. 69 00:03:11,810 --> 00:03:14,110 Zato header datoteke so tako koristne za funkcije 70 00:03:14,110 --> 00:03:15,160 deklaracije. 71 00:03:15,160 --> 00:03:17,740 Namesto da bi morali kopirati in prilepiti vse funkcije 72 00:03:17,740 --> 00:03:21,050 Izjave ste načrt za uporabo na vrhu datoteke, 73 00:03:21,050 --> 00:03:22,990 preprocesor bo kopiranje in jih prilepite iz glave 74 00:03:22,990 --> 00:03:24,140 datoteko za vas. 75 00:03:24,140 --> 00:03:26,480 >> Zdaj, ko smo opravili priprave podatkov, gremo na 76 00:03:26,480 --> 00:03:27,680 kompilacija. 77 00:03:27,680 --> 00:03:30,725 Razlog za to klicali korak kompilacijo je zato, ker je to 78 00:03:30,725 --> 00:03:34,130 korak, kjer se dejansko ne Jek njegovo sestavo od C do 79 00:03:34,130 --> 00:03:35,370 Sklop kode. 80 00:03:35,370 --> 00:03:38,280 Da bi imeli Jek pripravijo dokumentacijo do skupščine, vendar je 81 00:03:38,280 --> 00:03:42,030 naprej ni več, je mimo-S zastave 82 00:03:42,030 --> 00:03:43,560 v ukazni vrstici. 83 00:03:43,560 --> 00:03:44,790 Oglejmo si na skupščini 84 00:03:44,790 --> 00:03:47,390 Datoteka je izhodni to. 85 00:03:47,390 --> 00:03:49,740 Izgleda precej drugačen jezik. 86 00:03:49,740 --> 00:03:52,660 Skupščina koda je zelo poseben procesor. 87 00:03:52,660 --> 00:03:55,440 V tem primeru, ker je CS50 aparat deluje na 88 00:03:55,440 --> 00:04:00,470 virtualna x86 procesor, to je x86 montažo koda. 89 00:04:00,470 --> 00:04:03,450 Zelo malo ljudi pišete neposredno v zbirniku v teh dneh, 90 00:04:03,450 --> 00:04:06,490 ampak dobi vsak program C kdaj napisal preoblikovala navzdol 91 00:04:06,490 --> 00:04:07,940 v skupščini. 92 00:04:07,940 --> 00:04:11,440 Spet pravimo ta korak prevajate C v montaži 93 00:04:11,440 --> 00:04:14,170 saj se bomo z višjega nivoja na nižji ravni 94 00:04:14,170 --> 00:04:15,480 programski jezik. 95 00:04:15,480 --> 00:04:17,880 >> Kaj naredi montažo nižji ravni kot C? 96 00:04:17,880 --> 00:04:21,660 No, pri montaži, smo zelo omejeni, kaj lahko storimo. 97 00:04:21,660 --> 00:04:25,120 Ni, če je, medtem ko je v tujini, na to, ali zanke vseh vrst. 98 00:04:25,120 --> 00:04:27,560 Vendar pa lahko izvedejo iste stvari, ki jih nadzorni 99 00:04:27,560 --> 00:04:30,270 strukture nudijo uporabo omejene postopke, ki 100 00:04:30,270 --> 00:04:32,350 skupščina ne zagotavlja. 101 00:04:32,350 --> 00:04:35,960 Ampak, da vidite, kako nizko raven montaža je res, pojdiva 102 00:04:35,960 --> 00:04:39,320 en korak naprej v naši zbiranje, sestavljanje. 103 00:04:39,320 --> 00:04:41,890 To je monter je delo pretvoriti montažo kodo 104 00:04:41,890 --> 00:04:44,740 v objekt ali strojni kodi. 105 00:04:44,740 --> 00:04:47,610 Ne pozabite, da monter ne izhodni sklop; 106 00:04:47,610 --> 00:04:51,080 temveč je potrebno pri montaži in strojni kodi izhodov. 107 00:04:51,080 --> 00:04:54,040 Strojna koda je dejanska 1 in 0 je, da CPU lahko 108 00:04:54,040 --> 00:04:57,290 razumem, čeprav imamo še vedno majhen košček dela ostalo 109 00:04:57,290 --> 00:04:59,380 Preden lahko tečemo naš program. 110 00:04:59,380 --> 00:05:01,400 Naj zberejo našo montažo kodo, s posredovanjem 111 00:05:01,400 --> 00:05:04,080 Jek-c zastava. 112 00:05:04,080 --> 00:05:06,410 Zdaj pa poglejmo, kaj je v sestavljeni datoteke. 113 00:05:06,410 --> 00:05:09,220 >> No, to nam ne pomaga veliko. 114 00:05:09,220 --> 00:05:11,340 Ne pozabite, da je stroj koda je tisti in ničel, da 115 00:05:11,340 --> 00:05:13,240 računalnik razume. 116 00:05:13,240 --> 00:05:16,080 To ne pomeni, da je enostavno za nas, da razumejo. 117 00:05:16,080 --> 00:05:19,160 Torej, kako točno nizki ravni je skupščina? 118 00:05:19,160 --> 00:05:21,480 To je skoraj enako kot izvorne kode. 119 00:05:21,480 --> 00:05:24,300 Pot od zbiranja do izvorne kode, je veliko več 120 00:05:24,300 --> 00:05:27,540 Prevajanje kot preoblikovanja, zaradi česar 121 00:05:27,540 --> 00:05:29,310 1 morda ne upošteva, da monter 122 00:05:29,310 --> 00:05:31,400 storiti vse dejanske prevesti. 123 00:05:31,400 --> 00:05:34,110 Dejstvo je, da je zelo enostavno ročno prevajati 124 00:05:34,110 --> 00:05:36,050 Sklop za strojno kodo. 125 00:05:36,050 --> 00:05:39,040 Če pogledamo na skupščini za glavno funkcijo, da prva vrstica 126 00:05:39,040 --> 00:05:42,100 se zgodi, da ustrezajo šestnajstiških 0x55. 127 00:05:42,100 --> 00:05:45,470 V binarne, to je 1.010.101. 128 00:05:45,470 --> 00:05:49,300 V drugi vrstici se zgodi, da ustrezajo šestnajstiško 0x895. 129 00:05:49,300 --> 00:05:51,290 In naslednji, 0x56. 130 00:05:51,290 --> 00:05:53,730 Glede na relativno enostavna tabela, lahko prevedete 131 00:05:53,730 --> 00:05:57,130 montažo v kodo, ki lahko razumeli tudi stroji. 132 00:05:57,130 --> 00:05:58,810 >> Torej je še en korak v 133 00:05:58,810 --> 00:06:01,150 kompilacija, ki se povezuje. 134 00:06:01,150 --> 00:06:04,530 Povezovanje združuje kup predmetov datotek v eno veliko datoteko 135 00:06:04,530 --> 00:06:06,380 da lahko dejansko izvesti. 136 00:06:06,380 --> 00:06:08,570 Povezovanje je zelo odvisen od sistema. 137 00:06:08,570 --> 00:06:11,030 Tako je najlažji način, da bi dobili Jek, da samo povezavo predmet 138 00:06:11,030 --> 00:06:13,920 Datoteke skupaj je, da pokličete na Jek vse datoteke, ki 139 00:06:13,920 --> 00:06:15,190 želite povezati skupaj. 140 00:06:15,190 --> 00:06:18,740 Če podate. Ø datoteke, potem ne bo potrebe po predelavi, 141 00:06:18,740 --> 00:06:21,680 zbrati in zbrati vse svoje izvorne kode. 142 00:06:21,680 --> 00:06:23,960 Naj vrže matematične funkcije v našo datoteko, tako da imamo 143 00:06:23,960 --> 00:06:25,210 Nekaj ​​povezati noter 144 00:06:34,220 --> 00:06:37,010 Zdaj pa jo prevesti nazaj v objektni kodi in 145 00:06:37,010 --> 00:06:38,260 Jek pokličite na njej. 146 00:06:40,560 --> 00:06:41,420 Ups. 147 00:06:41,420 --> 00:06:43,790 Ker smo vključili matematične funkcije, moramo povezati v 148 00:06:43,790 --> 00:06:46,610 math knjižnica s-lm. 149 00:06:46,610 --> 00:06:48,990 >> Če bi želeli povezati kup. O datoteke, ki jih 150 00:06:48,990 --> 00:06:51,420 Napisal sami, bi to le določite jih vsi po 151 00:06:51,420 --> 00:06:52,460 ukazni vrstici. 152 00:06:52,460 --> 00:06:55,320 Omejitev je, da je samo eden od teh dokumentov mora 153 00:06:55,320 --> 00:06:57,790 dejansko določiti glavno funkcijo ali pa je 154 00:06:57,790 --> 00:06:59,930 kar izvršljiv ne bi vedeli, kje začeti 155 00:06:59,930 --> 00:07:00,910 prikazovati kodo. 156 00:07:00,910 --> 00:07:03,360 Kakšna je razlika med navedete datoteko za povezavo v 157 00:07:03,360 --> 00:07:06,600 s-l in le z navedbo datoteko neposredno? 158 00:07:06,600 --> 00:07:07,440 Nič. 159 00:07:07,440 --> 00:07:09,850 To je samo, da je Jek zgodi, da bi natančno vedeli, kaj datoteko 160 00:07:09,850 --> 00:07:12,560 nekaj podobnega se zgodi, lm nanaša. 161 00:07:12,560 --> 00:07:14,700 Če bi vedela, da je datoteka sami, jo lahko določite 162 00:07:14,700 --> 00:07:15,930 eksplicitno. 163 00:07:15,930 --> 00:07:18,990 Zapomnite si, da vse l zastave, da pridejo na koncu 164 00:07:18,990 --> 00:07:20,770 vaše stranke povpraševanja. 165 00:07:20,770 --> 00:07:22,300 >> In to je vse kar je z njo. 166 00:07:22,300 --> 00:07:24,940 Ko zaženete, le Jek na nekaterih datotek, to je tisto, kar je 167 00:07:24,940 --> 00:07:26,350 dejansko počne. 168 00:07:26,350 --> 00:07:29,490 Moje ime je Rob Bowden, in to je CS50.