1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB Bowden: Kom ons praat oor samestellers. 2 00:00:09,100 --> 00:00:11,490 Tot op hierdie punt, jy het net getik jou bron kode in 3 00:00:11,490 --> 00:00:14,260 sommige lêers het hulle gestuur deur middel van hierdie groot swart boks wat 4 00:00:14,260 --> 00:00:16,890 Klang, en kom uit jou uitvoerbare lêer wat nie 5 00:00:16,890 --> 00:00:19,430 presies wat jy geskryf het in jou bronkode. 6 00:00:19,430 --> 00:00:22,170 As magiese as wat, ons gaan 'n nader te neem 7 00:00:22,170 --> 00:00:23,590 kyk na wat is eintlik gebeur 8 00:00:23,590 --> 00:00:25,220 wanneer ons 'n lêer saam te stel. 9 00:00:25,220 --> 00:00:28,580 So wat beteken dit om iets saam te stel? 10 00:00:28,580 --> 00:00:31,150 >> Wel, in die mees algemene sin van die woord, dit beteken net 11 00:00:31,150 --> 00:00:32,580 die transformasie van kode wat geskryf is in een 12 00:00:32,580 --> 00:00:34,680 programmering taal na 'n ander. 13 00:00:34,680 --> 00:00:37,550 Maar gewoonlik wanneer mense sê hulle stel iets, hulle 14 00:00:37,550 --> 00:00:39,660 beteken dat hulle is om dit van 'n hoër vlak programmeringsomgewing 15 00:00:39,660 --> 00:00:42,460 taal na 'n laer vlak programmeertaal. 16 00:00:42,460 --> 00:00:44,960 Dit kan lyk soos 'n baie subjektiewe terme. 17 00:00:44,960 --> 00:00:48,090 Byvoorbeeld, het jy waarskynlik dink nie van C as 'n hoë 18 00:00:48,090 --> 00:00:51,440 vlak programmeertaal, maar jy stel dit. 19 00:00:51,440 --> 00:00:52,730 Maar dit is alles relatief. 20 00:00:52,730 --> 00:00:55,790 Soos ons sal sien, die gemeente-kode en uiteindelik masjien 21 00:00:55,790 --> 00:00:59,270 kode wat ons stel af na is onteenseglik 'n laer vlak 22 00:00:59,270 --> 00:01:00,700 as C. 23 00:01:00,700 --> 00:01:03,310 Alhoewel ons sal gebruik word om kletteren in vandag se demonstrasie, 'n 24 00:01:03,310 --> 00:01:06,360 baie van die idees hier dra aan ander vertalers. 25 00:01:06,360 --> 00:01:09,160 >> Klang, is daar vier belangrike stappe in die algehele 26 00:01:09,160 --> 00:01:10,200 samestelling. 27 00:01:10,200 --> 00:01:15,430 Dit is een preprocessing gedoen deur die preprocessor, twee, 28 00:01:15,430 --> 00:01:19,530 samestelling gedoen deur die samesteller, drie, monteerwerk 29 00:01:19,530 --> 00:01:22,010 gedoen deur die assembler en vier, 30 00:01:22,010 --> 00:01:24,640 koppel deur die koppelingshistoon gedoen. 31 00:01:24,640 --> 00:01:27,600 Dit kan verwarrend wees dat een van die substeps van die algehele 32 00:01:27,600 --> 00:01:30,980 Kletteren samestellers word genoem die vertaler, maar 33 00:01:30,980 --> 00:01:32,530 ons sal kry. 34 00:01:32,530 --> 00:01:35,050 Ons sal gebruik word om 'n eenvoudige hello world program as ons 'n voorbeeld 35 00:01:35,050 --> 00:01:36,270 regdeur hierdie video. 36 00:01:36,270 --> 00:01:38,380 Kom ons neem 'n blik. 37 00:01:38,380 --> 00:01:40,330 >> Preprocessing is die eerste stap. 38 00:01:40,330 --> 00:01:42,520 Wat beteken die voorverwerker doen? 39 00:01:42,520 --> 00:01:45,560 In pretty much elke C program wat jy ooit gelees of geskryf, 40 00:01:45,560 --> 00:01:48,310 jy gebruik om lyne van die kode wat begin met 'n hash. 41 00:01:48,310 --> 00:01:51,730 Ek sal dit noem hash, maar jy kan noem dit ook pond, die aantal 42 00:01:51,730 --> 00:01:53,280 teken, of skerp. 43 00:01:53,280 --> 00:01:56,840 Enige so 'n lyn is 'n preprocessor richtlijn. 44 00:01:56,840 --> 00:02:00,650 Jy het waarskynlik gesien # definieer en # include voor, maar daar 45 00:02:00,650 --> 00:02:03,690 is verskeie meer dat die voorverwerker erken. 46 00:02:03,690 --> 00:02:07,340 Kom ons voeg 'n # define ons hello world voorbeeld. 47 00:02:07,340 --> 00:02:11,690 Nou kom ons hardloop net die voorverwerker op hierdie lêer. 48 00:02:11,690 --> 00:02:16,150 Deur clage die-E vlag, jy opdrag om dit te doen 49 00:02:16,150 --> 00:02:17,880 net die voorverwerker. 50 00:02:17,880 --> 00:02:19,130 Kom ons kyk wat gebeur. 51 00:02:22,250 --> 00:02:24,020 Dit lyk soos kletteren net spoeg alles 52 00:02:24,020 --> 00:02:25,200 op die command line. 53 00:02:25,200 --> 00:02:27,800 Ten einde al van hierdie uitset te slaan na 'n nuwe lêer met die naam 54 00:02:27,800 --> 00:02:33,850 hello2.c, sal ons te heg> hello2.c op ons opdrag. 55 00:02:33,850 --> 00:02:37,800 Nou laat ons neem 'n blik by ons preprocessed lêer. 56 00:02:37,800 --> 00:02:40,810 >> Whoa, wat gebeur het met ons kort klein program? 57 00:02:40,810 --> 00:02:43,890 As ons gaan al die pad aan die onderkant van hierdie lêer, sal ons sien 58 00:02:43,890 --> 00:02:46,070 sommige van die kode dat ons eintlik geskryf het. 59 00:02:46,070 --> 00:02:49,800 Let daarop dat die # define is verby en alle gevalle van naam 60 00:02:49,800 --> 00:02:51,950 is vervang met presies wat ons gespesifiseer in 61 00:02:51,950 --> 00:02:53,590 # define lyn. 62 00:02:53,590 --> 00:02:56,530 So, wat is al hierdie typedefs en funksie verklarings 63 00:02:56,530 --> 00:02:58,140 op die top van die lêer? 64 00:02:58,140 --> 00:03:00,820 Let daarop dat die # define was nie die enigste preprocessor 65 00:03:00,820 --> 00:03:02,390 Richtlijn dat ons gespesifiseer. 66 00:03:02,390 --> 00:03:05,280 Ons sluit ook # het stdio.h. 67 00:03:05,280 --> 00:03:09,560 So was dan al van die gek lyne is eintlik net stdio.h gekopieer 68 00:03:09,560 --> 00:03:11,810 en geplak in die top van hierdie lêer. 69 00:03:11,810 --> 00:03:14,110 Dit is die rede waarom header lêers is so nuttig vir funksie 70 00:03:14,110 --> 00:03:15,160 verklarings. 71 00:03:15,160 --> 00:03:17,740 In plaas van hoef te kopieer en plak van die funksie 72 00:03:17,740 --> 00:03:21,050 verklarings jy van plan op die gebruik op die top van jou lêer, die 73 00:03:21,050 --> 00:03:22,990 preprocessor sal kopieer en plak hulle uit die kop 74 00:03:22,990 --> 00:03:24,140 dien vir jou. 75 00:03:24,140 --> 00:03:26,480 >> Nou dat ons preprocessing klaar is, beweeg ons op 76 00:03:26,480 --> 00:03:27,680 samestelling. 77 00:03:27,680 --> 00:03:30,725 Die rede waarom ons noem hierdie stap samestelling is, want dit is 78 00:03:30,725 --> 00:03:34,130 die stap waar die geratel nie eintlik sy die opstel van C na 79 00:03:34,130 --> 00:03:35,370 vergadering kode. 80 00:03:35,370 --> 00:03:38,280 Ten einde te kletteren stel 'n lêer af na die gemeente nie, maar 81 00:03:38,280 --> 00:03:42,030 voortgaan nie verder, verby die-S vlag 82 00:03:42,030 --> 00:03:43,560 op die command line. 83 00:03:43,560 --> 00:03:44,790 Kom ons neem 'n blik op die vergadering 84 00:03:44,790 --> 00:03:47,390 lêer wat outputted. 85 00:03:47,390 --> 00:03:49,740 Dit lyk soos 'n ander taal. 86 00:03:49,740 --> 00:03:52,660 Vergadering kode is baie verwerker spesifieke. 87 00:03:52,660 --> 00:03:55,440 In hierdie geval, aangesien die CS50 toestel loop op 'n 88 00:03:55,440 --> 00:04:00,470 virtuele x86 verwerker, dit is x86 vergadering kode. 89 00:04:00,470 --> 00:04:03,450 Baie min mense skryf direk in die gemeente-kode hierdie dae, 90 00:04:03,450 --> 00:04:06,490 maar elke C program wat jy al ooit skryf kry getransformeer 91 00:04:06,490 --> 00:04:07,940 in die gemeente. 92 00:04:07,940 --> 00:04:11,440 Weer, noem ons hierdie stap die samestelling van die C in die gemeente 93 00:04:11,440 --> 00:04:14,170 want ons gaan van 'n hoër vlak na 'n laer vlak 94 00:04:14,170 --> 00:04:15,480 programmeertaal. 95 00:04:15,480 --> 00:04:17,880 >> Wat vergadering laer vlak as C? 96 00:04:17,880 --> 00:04:21,660 Wel, in die gemeente, is ons baie beperk in wat ons kan doen. 97 00:04:21,660 --> 00:04:25,120 Daar is nie indien, terwyl is, is of lissies van enige aard. 98 00:04:25,120 --> 00:04:27,560 Maar jy kan bereik dieselfde dinge dat hierdie beheer 99 00:04:27,560 --> 00:04:30,270 strukture bied deur gebruik te maak van die beperkte bedrywighede wat 100 00:04:30,270 --> 00:04:32,350 vergadering nie voorsien. 101 00:04:32,350 --> 00:04:35,960 Maar om te sien hoe lae vlak gemeente werklik is, laat ons gaan 102 00:04:35,960 --> 00:04:39,320 'n stap verder in ons samestelling, vervaardiging. 103 00:04:39,320 --> 00:04:41,890 Dit is die samesteller se werk om die vergadering kode te omskep 104 00:04:41,890 --> 00:04:44,740 in die voorwerp of masjien-kode. 105 00:04:44,740 --> 00:04:47,610 Onthou dat die assembler nie uitset vergadering; 106 00:04:47,610 --> 00:04:51,080 eerder, dit neem in die gemeente en uitsette masjien kode. 107 00:04:51,080 --> 00:04:54,040 Machine kode is die werklike 1 en 0 se dat 'n SVE kan 108 00:04:54,040 --> 00:04:57,290 verstaan, alhoewel ons nog 'n klein bietjie van die werk verlaat het 109 00:04:57,290 --> 00:04:59,380 voordat ons kan hardloop ons program. 110 00:04:59,380 --> 00:05:01,400 Kom ons versamel ons vergadering kode deur ' 111 00:05:01,400 --> 00:05:04,080 Klang-c vlag. 112 00:05:04,080 --> 00:05:06,410 Nou laat ons kyk wat is in die saamgestelde lêer. 113 00:05:06,410 --> 00:05:09,220 >> Wel, wat nie help ons baie. 114 00:05:09,220 --> 00:05:11,340 Onthou dat die masjien kode is die ene en nulle wat 115 00:05:11,340 --> 00:05:13,240 jou rekenaar kan verstaan. 116 00:05:13,240 --> 00:05:16,080 Dit beteken nie dit is maklik vir ons om te verstaan. 117 00:05:16,080 --> 00:05:19,160 So presies hoe lae vlak is die vergadering? 118 00:05:19,160 --> 00:05:21,480 Dit is byna identies aan object code. 119 00:05:21,480 --> 00:05:24,300 Gaan van die vergadering aan die object code is veel meer van 'n 120 00:05:24,300 --> 00:05:27,540 vertaling as 'n transformasie, wat is die rede waarom 121 00:05:27,540 --> 00:05:29,310 dalk nie die assembler oorweeg 122 00:05:29,310 --> 00:05:31,400 doen enige werklike Opstel. 123 00:05:31,400 --> 00:05:34,110 Om die waarheid te sê, dit is redelik maklik om te vertaal die hand van 124 00:05:34,110 --> 00:05:36,050 vergadering aan die masjien kode. 125 00:05:36,050 --> 00:05:39,040 Op soek na die vergadering vir 'n belangrike funksie, wat eerste reël 126 00:05:39,040 --> 00:05:42,100 gebeur om ooreen te stem heksadesimale 0x55. 127 00:05:42,100 --> 00:05:45,470 In binêre, dit is 1.010.101. 128 00:05:45,470 --> 00:05:49,300 Die tweede lyn gebeur heksadesimale 0x895 om ooreen te stem. 129 00:05:49,300 --> 00:05:51,290 En die volgende, 0x56. 130 00:05:51,290 --> 00:05:53,730 Gegewe 'n relatief eenvoudige tafel, kan jy dit vertaal 131 00:05:53,730 --> 00:05:57,130 vergadering in die kode dat masjiene te kan verstaan. 132 00:05:57,130 --> 00:05:58,810 >> So is daar een oorblywende stap in 133 00:05:58,810 --> 00:06:01,150 samestelling, wat 'n skakel. 134 00:06:01,150 --> 00:06:04,530 Met 'n skakel kombineer 'n klomp van die voorwerp lêers in een groot lêer 135 00:06:04,530 --> 00:06:06,380 dat jy eintlik kan voer. 136 00:06:06,380 --> 00:06:08,570 Skakel is baie stelsel afhanklik. 137 00:06:08,570 --> 00:06:11,030 Dus is die maklikste manier om kletteren te kry om net te koppel voorwerp 138 00:06:11,030 --> 00:06:13,920 lêers tesame kletteren te roep op al die lêers wat 139 00:06:13,920 --> 00:06:15,190 jy wil aan mekaar te koppel. 140 00:06:15,190 --> 00:06:18,740 As jy spesifiseer. O lêers, dan sal dit nie nodig het om te verwerk, 141 00:06:18,740 --> 00:06:21,680 stel, en versamel al van jou bronkode. 142 00:06:21,680 --> 00:06:23,960 Kom ons gooi 'n wiskunde-funksie in ons lêer, sodat ons ' 143 00:06:23,960 --> 00:06:25,210 iets om te skakel. 144 00:06:34,220 --> 00:06:37,010 Nou laat ons stel dit weer af te object code en 145 00:06:37,010 --> 00:06:38,260 noem kletteren op dit. 146 00:06:40,560 --> 00:06:41,420 Oeps. 147 00:06:41,420 --> 00:06:43,790 Aangesien ons 'n wiskunde-funksie, moet ons in skakel 148 00:06:43,790 --> 00:06:46,610 die wiskunde biblioteek met lm. 149 00:06:46,610 --> 00:06:48,990 >> As ons wou saam te koppel klomp van die o lêers wat ons 150 00:06:48,990 --> 00:06:51,420 geskryf het op ons eie, ons wil net spesifiseer hulle almal by die 151 00:06:51,420 --> 00:06:52,460 command line. 152 00:06:52,460 --> 00:06:55,320 Die beperking is dat slegs een van hierdie lêers moet 153 00:06:55,320 --> 00:06:57,790 eintlik 'n hooffunksie spesifiseer, of anders die 154 00:06:57,790 --> 00:06:59,930 gevolg uitvoerbaar sou nie weet waar om te begin nie 155 00:06:59,930 --> 00:07:00,910 die bestuur van jou kode. 156 00:07:00,910 --> 00:07:03,360 Wat is die verskil tussen die spesifiseer van 'n lêer om te skakel in 157 00:07:03,360 --> 00:07:06,600 met-l en net spesifiseer 'n lêer direk? 158 00:07:06,600 --> 00:07:07,440 Niks nie. 159 00:07:07,440 --> 00:07:09,850 Dis net dat die geratel gebeur presies wat lêer om te weet 160 00:07:09,850 --> 00:07:12,560 iets soos lm gebeur om te verwys na. 161 00:07:12,560 --> 00:07:14,700 As jy geweet het dat 'n lêer jouself, kan jy spesifiseer dit 162 00:07:14,700 --> 00:07:15,930 uitdruklik. 163 00:07:15,930 --> 00:07:18,990 Net onthou dat al-l vlae het om te kom aan die einde 164 00:07:18,990 --> 00:07:20,770 van jou kliënt vraag. 165 00:07:20,770 --> 00:07:22,300 >> En dit is al wat daar is om dit. 166 00:07:22,300 --> 00:07:24,940 Wanneer jy net op 'n paar lêers loop klang, dit is wat dit is 167 00:07:24,940 --> 00:07:26,350 eintlik doen. 168 00:07:26,350 --> 00:07:29,490 My naam is Rob Bowden, en dit is CS50.