1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB Bowden: Beszéljünk összeállítói. 2 00:00:09,100 --> 00:00:11,490 Amíg ezen a ponton, épp most adta fel a forráskódot 3 00:00:11,490 --> 00:00:14,260 fájlokat, elküldte őket a nagy fekete doboz, amely 4 00:00:14,260 --> 00:00:16,890 Csenget, és ki jön a végrehajtható fájl, amely nem 5 00:00:16,890 --> 00:00:19,430 pontosan mit írt a forráskódot. 6 00:00:19,430 --> 00:00:22,170 A varázslatos, mint volt, megyünk, hogy közelebbről 7 00:00:22,170 --> 00:00:23,590 nézd meg, mi történik valójában 8 00:00:23,590 --> 00:00:25,220 amikor egy dossziét állítanak össze. 9 00:00:25,220 --> 00:00:28,580 Szóval, mit is jelent fordítani valamit? 10 00:00:28,580 --> 00:00:31,150 >> Nos, a legáltalánosabb értelemben, ez csak azt jelenti, 11 00:00:31,150 --> 00:00:32,580 transzformáló kódot írt egy 12 00:00:32,580 --> 00:00:34,680 programozási nyelvről a másikra. 13 00:00:34,680 --> 00:00:37,550 De általában, amikor az emberek azt mondják, hogy fordítani valamit, 14 00:00:37,550 --> 00:00:39,660 jelenti azt, hogy figyelembe azt egy magasabb szintű programozási 15 00:00:39,660 --> 00:00:42,460 nyelv egy alacsonyabb szintű programozási nyelv. 16 00:00:42,460 --> 00:00:44,960 Ezek tűnhet nagyon szubjektív szempontból. 17 00:00:44,960 --> 00:00:48,090 Például, akkor valószínűleg nem hiszem, C, mint egy nagy 18 00:00:48,090 --> 00:00:51,440 szintű programozási nyelv, de még összeállításhoz. 19 00:00:51,440 --> 00:00:52,730 De minden relatív. 20 00:00:52,730 --> 00:00:55,790 Mint látni fogjuk, az assembly kódot, és végül gép 21 00:00:55,790 --> 00:00:59,270 kódot, amit fordítani le vitathatatlanul alacsonyabb szintű 22 00:00:59,270 --> 00:01:00,700 mint C. 23 00:01:00,700 --> 00:01:03,310 Bár mi fog használni csenget a mai bemutató, a 24 00:01:03,310 --> 00:01:06,360 Sok az ötletek itt átvitt más fordítókkal. 25 00:01:06,360 --> 00:01:09,160 >> A csengés, négy jelentős lépést a teljes 26 00:01:09,160 --> 00:01:10,200 összeállítása. 27 00:01:10,200 --> 00:01:15,430 Ezek egy, előfeldolgozás által végzett előfeldolgozó, két, 28 00:01:15,430 --> 00:01:19,530 összeállítása által végzett a fordító, három, szerelés 29 00:01:19,530 --> 00:01:22,010 által végzett assembler, és négy, 30 00:01:22,010 --> 00:01:24,640 összekapcsolása által végzett linker. 31 00:01:24,640 --> 00:01:27,600 Azt zavaró lehet, hogy az egyik a allépést a teljes 32 00:01:27,600 --> 00:01:30,980 Zengés fordítóprogramok hívják a fordító, de a 33 00:01:30,980 --> 00:01:32,530 mi lesz erre. 34 00:01:32,530 --> 00:01:35,050 Mi lesz egy egyszerű hello world program a példa 35 00:01:35,050 --> 00:01:36,270 egészében ezt a videót. 36 00:01:36,270 --> 00:01:38,380 Vessünk egy pillantást. 37 00:01:38,380 --> 00:01:40,330 >> Az első lépés a előrefutás. 38 00:01:40,330 --> 00:01:42,520 Mit tesz az előfeldolgozó csinálni? 39 00:01:42,520 --> 00:01:45,560 Az elég sok minden C program, amit valaha olvasott vagy írt, 40 00:01:45,560 --> 00:01:48,310 már használt sornyi kódot, hogy kezdődik a hash. 41 00:01:48,310 --> 00:01:51,730 Majd hívni hash, de akkor is hívni kiló, szám 42 00:01:51,730 --> 00:01:53,280 jelentkezzen be, vagy éles. 43 00:01:53,280 --> 00:01:56,840 Minden ilyen vonal egy előfeldolgozó irányelv. 44 00:01:56,840 --> 00:02:00,650 Valószínűleg már látott # define és # include előtt, de 45 00:02:00,650 --> 00:02:03,690 még néhány, hogy az előfeldolgozó felismeri. 46 00:02:03,690 --> 00:02:07,340 Adjunk hozzá egy # define a mi hello world példa. 47 00:02:07,340 --> 00:02:11,690 Most fut csak a előfeldolgozó az ezt a fájlt. 48 00:02:11,690 --> 00:02:16,150 Átadásával clage a-E zászló, akkor utasítja, hogy fuss 49 00:02:16,150 --> 00:02:17,880 csak az előfeldolgozó. 50 00:02:17,880 --> 00:02:19,130 Lássuk, mi történik. 51 00:02:22,250 --> 00:02:24,020 Úgy néz ki, csak csenget kiköpi mindent 52 00:02:24,020 --> 00:02:25,200 a parancssorban. 53 00:02:25,200 --> 00:02:27,800 Annak érdekében, hogy mentse az összes e kibocsátás egy új nevű fájlt 54 00:02:27,800 --> 00:02:33,850 hello2.c, akkor fűzze> hello2.c a mi parancsot. 55 00:02:33,850 --> 00:02:37,800 Most vessünk egy pillantást a előfeldolgozott fájl. 56 00:02:37,800 --> 00:02:40,810 >> Hé, mi történt a mi rövid kis program? 57 00:02:40,810 --> 00:02:43,890 Ha elmegyünk egészen a végére ezt a fájlt, majd meglátjuk 58 00:02:43,890 --> 00:02:46,070 néhány kódot, hogy mi valójában írt. 59 00:02:46,070 --> 00:02:49,800 Figyeljük meg, hogy a # define eltűnt, és minden esetben a név 60 00:02:49,800 --> 00:02:51,950 váltotta fel pontosan, amit meghatározott 61 00:02:51,950 --> 00:02:53,590 A # define sort. 62 00:02:53,590 --> 00:02:56,530 Tehát mik ezek typedefs és funkció nyilatkozatok 63 00:02:56,530 --> 00:02:58,140 tetején a fájlt? 64 00:02:58,140 --> 00:03:00,820 Figyeljük meg, hogy a # define volt az egyetlen előfeldolgozó 65 00:03:00,820 --> 00:03:02,390 irányelv, hogy mi megadva. 66 00:03:02,390 --> 00:03:05,280 Mi is # include stdio.h. 67 00:03:05,280 --> 00:03:09,560 Tehát az összes őrült vonalak valójában csak stdio.h másolt 68 00:03:09,560 --> 00:03:11,810 és beilleszthetők a tetején ezt a fájlt. 69 00:03:11,810 --> 00:03:14,110 Ezért fejlécfájlokat olyan hasznos funkció 70 00:03:14,110 --> 00:03:15,160 nyilatkozatok. 71 00:03:15,160 --> 00:03:17,740 Ahelyett szüksége, hogy másolja be az összes funkció 72 00:03:17,740 --> 00:03:21,050 nyilatkozatok azt tervezi, használatával a tetején a fájl, az 73 00:03:21,050 --> 00:03:22,990 előfeldolgozó másolja át őket a fejléc 74 00:03:22,990 --> 00:03:24,140 fájlt. 75 00:03:24,140 --> 00:03:26,480 >> Most, hogy készen vagyunk előfeldolgozás, mozgunk rá 76 00:03:26,480 --> 00:03:27,680 összeállítása. 77 00:03:27,680 --> 00:03:30,725 Az ok, nevezzük ezt a lépést, összeállítás, mert ez 78 00:03:30,725 --> 00:03:34,130 a lépést, ha csenget azt valóban annak összeállítása a C a 79 00:03:34,130 --> 00:03:35,370 assembly kóddal. 80 00:03:35,370 --> 00:03:38,280 Annak érdekében, hogy csenget egy dossziét állítanak össze le a gyülekezési, hanem 81 00:03:38,280 --> 00:03:42,030 folytatja tovább, add a-S flag 82 00:03:42,030 --> 00:03:43,560 a parancssorban. 83 00:03:43,560 --> 00:03:44,790 Vessünk egy pillantást a szerelvény 84 00:03:44,790 --> 00:03:47,390 fájl, amely kimeneten. 85 00:03:47,390 --> 00:03:49,740 Úgy néz ki, teljesen más nyelvet. 86 00:03:49,740 --> 00:03:52,660 Assembly kód nagyon processzor egyedi. 87 00:03:52,660 --> 00:03:55,440 Ebben az esetben, mivel a készülék CS50 fut 88 00:03:55,440 --> 00:04:00,470 virtuális x86 processzor, ez az x86 assembly kódot. 89 00:04:00,470 --> 00:04:03,450 Nagyon kevés ember levelet közvetlenül assembly kódot ezekben a napokban, 90 00:04:03,450 --> 00:04:06,490 de minden C program, amit valaha levelet kap transzformált le 91 00:04:06,490 --> 00:04:07,940 a szerelvény. 92 00:04:07,940 --> 00:04:11,440 Ismét hívjuk ezt a lépést összeállításáért C a szerelvény 93 00:04:11,440 --> 00:04:14,170 mert megyünk a magasabb szintről alacsonyabb szintre 94 00:04:14,170 --> 00:04:15,480 programozási nyelv. 95 00:04:15,480 --> 00:04:17,880 >> Mitől gyülekezési alacsonyabb szinten C? 96 00:04:17,880 --> 00:04:21,660 Nos, összeszerelés, mi nagyon korlátozott, hogy mit tehetünk. 97 00:04:21,660 --> 00:04:25,120 Nincsenek, ha a, míg van, az van, vagy hurok bármilyen. 98 00:04:25,120 --> 00:04:27,560 De lehet elérni ugyanazt a dolgot, hogy ezek az ellenőrzési 99 00:04:27,560 --> 00:04:30,270 struktúrákat kínálnak a korlátozott műveleteket 100 00:04:30,270 --> 00:04:32,350 összeállítás nem nyújt. 101 00:04:32,350 --> 00:04:35,960 De ahhoz, hogy lásd, milyen alacsony szinten összeszerelés tényleg, menjünk 102 00:04:35,960 --> 00:04:39,320 egy lépéssel tovább a válogatás, összeszerelés. 103 00:04:39,320 --> 00:04:41,890 Ez az assembler feladata, hogy átalakítsa a kódban 104 00:04:41,890 --> 00:04:44,740 a tárgy vagy gépi kódban. 105 00:04:44,740 --> 00:04:47,610 Ne feledje, hogy az assembler nem ad szerelvény; 106 00:04:47,610 --> 00:04:51,080 inkább tart a gyülekezési és kimenetek gépi kódot. 107 00:04:51,080 --> 00:04:54,040 Gépi kód a tényleges 1 és 0-nak, hogy a CPU képes 108 00:04:54,040 --> 00:04:57,290 érthető, bár még mindig van egy apró kis munka vár ránk 109 00:04:57,290 --> 00:04:59,380 mielőtt tudjuk futtatni a programot. 110 00:04:59,380 --> 00:05:01,400 Tegyük össze a kódban átadásával 111 00:05:01,400 --> 00:05:04,080 Csengés-c zászló. 112 00:05:04,080 --> 00:05:06,410 Most nézzük meg, mi van az összeszerelt fájlban. 113 00:05:06,410 --> 00:05:09,220 >> Nos, ez nem segít sokat. 114 00:05:09,220 --> 00:05:11,340 Ne feledje, hogy a gépi kódot az egyesek és nullák, hogy a 115 00:05:11,340 --> 00:05:13,240 a számítógép képes megérteni. 116 00:05:13,240 --> 00:05:16,080 Ez nem jelenti azt, hogy könnyű megérteni. 117 00:05:16,080 --> 00:05:19,160 Szóval, milyen alacsony szinten van szerelvény? 118 00:05:19,160 --> 00:05:21,480 Ez közel azonos a tárgykód. 119 00:05:21,480 --> 00:05:24,300 Haladva a gyülekezés tárgykód sokkal inkább egy 120 00:05:24,300 --> 00:05:27,540 fordítás mint átalakulása, amely ezért 121 00:05:27,540 --> 00:05:29,310 lehetne nem tekinti az assembler 122 00:05:29,310 --> 00:05:31,400 végezze el a tényleges összeállítást. 123 00:05:31,400 --> 00:05:34,110 Tény, hogy elég könnyű kézzel fordítson 124 00:05:34,110 --> 00:05:36,050 szerelvényt gépi kódot. 125 00:05:36,050 --> 00:05:39,040 Keresi a szerelvény fő funkciója, hogy az első sorban 126 00:05:39,040 --> 00:05:42,100 történik, hogy az megfelel hexadecimális 0x55. 127 00:05:42,100 --> 00:05:45,470 A bináris, ez 1.010.101. 128 00:05:45,470 --> 00:05:49,300 A második sorban történik, hogy az megfelel hexadecimális 0x895. 129 00:05:49,300 --> 00:05:51,290 És a következő, 0x56. 130 00:05:51,290 --> 00:05:53,730 Mivel egy viszonylag egyszerű asztal, akkor lefordítani 131 00:05:53,730 --> 00:05:57,130 szerelvényt a kódot, hogy a gépek érthető is. 132 00:05:57,130 --> 00:05:58,810 >> Szóval van egy megmaradt szakaszát 133 00:05:58,810 --> 00:06:01,150 összeállítása, amely összeköti. 134 00:06:01,150 --> 00:06:04,530 Összekapcsolása ötvözi egy csomó tárgy fájlokat egy nagy fájlba 135 00:06:04,530 --> 00:06:06,380 hogy ténylegesen végrehajtani. 136 00:06:06,380 --> 00:06:08,570 Összekapcsolása nagyon rendszer függő. 137 00:06:08,570 --> 00:06:11,030 Tehát a legegyszerűbb módja, hogy csenget, hogy csak csatolni objektum 138 00:06:11,030 --> 00:06:13,920 fájlok együttesen felhívni csenget az összes fájlt, amely 139 00:06:13,920 --> 00:06:15,190 csatolni kívánt együtt. 140 00:06:15,190 --> 00:06:18,740 Ha megadja. O fájlokat, akkor nem kell újra feldolgozni, 141 00:06:18,740 --> 00:06:21,680 összeállításához, és össze az összes forráskód. 142 00:06:21,680 --> 00:06:23,960 Dobjunk egy matematikai függvényt a fájl, így már 143 00:06:23,960 --> 00:06:25,210 valamit összekapcsolni be 144 00:06:34,220 --> 00:06:37,010 Most fordítsd vissza le tárgykód és 145 00:06:37,010 --> 00:06:38,260 hívják csenget rajta. 146 00:06:40,560 --> 00:06:41,420 Hoppá. 147 00:06:41,420 --> 00:06:43,790 Mivel benne egy matematikai függvény, meg kell összekapcsolni 148 00:06:43,790 --> 00:06:46,610 a matematikai könyvtár-lm. 149 00:06:46,610 --> 00:06:48,990 >> Ha volna összekapcsolni össze rakás. O fájlokat, hogy mi 150 00:06:48,990 --> 00:06:51,420 írta saját, mi lenne most meg őket a 151 00:06:51,420 --> 00:06:52,460 parancssorban. 152 00:06:52,460 --> 00:06:55,320 A korlátozás, hogy csak egy ilyen fájlt kell 153 00:06:55,320 --> 00:06:57,790 ténylegesen meg egy fő funkciója, vagy pedig a 154 00:06:57,790 --> 00:06:59,930 eredő végrehajtható nem tudja, hol kezdje 155 00:06:59,930 --> 00:07:00,910 fut a kódot. 156 00:07:00,910 --> 00:07:03,360 Mi a különbség a meghatározó egy fájlt csatolni az 157 00:07:03,360 --> 00:07:06,600 a-l és csak megad egy fájlt közvetlenül? 158 00:07:06,600 --> 00:07:07,440 Semmi. 159 00:07:07,440 --> 00:07:09,850 Ez csak csengés történik, pontosan tudja, mit fájl 160 00:07:09,850 --> 00:07:12,560 Valami hasonló történik lm hivatkozni. 161 00:07:12,560 --> 00:07:14,700 Ha tudnád, hogy a fájl magad, akkor adja meg azt 162 00:07:14,700 --> 00:07:15,930 kifejezetten. 163 00:07:15,930 --> 00:07:18,990 Ne feledd, hogy minden l zászlókat kell jönni a végén 164 00:07:18,990 --> 00:07:20,770 a kliens kereslet. 165 00:07:20,770 --> 00:07:22,300 >> És ez minden van rá. 166 00:07:22,300 --> 00:07:24,940 Ha csak fuss csenget néhány kép, ez az, amit ez az 167 00:07:24,940 --> 00:07:26,350 ténylegesen csinál. 168 00:07:26,350 --> 00:07:29,490 A nevem Rob Bowden, és ez CS50.