1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB BOWDEN: Lad os tale om compilers. 2 00:00:09,100 --> 00:00:11,490 Indtil dette punkt, har du lige har skrevet op din kilde kode i 3 00:00:11,490 --> 00:00:14,260 nogle filer, sendte dem gennem denne store sorte boks, der er 4 00:00:14,260 --> 00:00:16,890 Klang, og ud kommer din eksekverbar fil, der gør 5 00:00:16,890 --> 00:00:19,430 præcis, hvad du skrev i din kildekode. 6 00:00:19,430 --> 00:00:22,170 Så magisk som det har været, vi kommer til at tage et nærmere 7 00:00:22,170 --> 00:00:23,590 se på, hvad der rent faktisk sker 8 00:00:23,590 --> 00:00:25,220 Når vi opretter en sagsmappe. 9 00:00:25,220 --> 00:00:28,580 Så hvad betyder det at samle noget? 10 00:00:28,580 --> 00:00:31,150 >> Tja, i den mest almindelige betydning, det betyder bare, 11 00:00:31,150 --> 00:00:32,580 omdanne kode skrevet i ét 12 00:00:32,580 --> 00:00:34,680 programmering sprog til et andet. 13 00:00:34,680 --> 00:00:37,550 Men som regel, når folk siger, at de udarbejder noget, de 14 00:00:37,550 --> 00:00:39,660 betyder, at de tager det fra et højere niveau programmering 15 00:00:39,660 --> 00:00:42,460 sprog til et lavere niveau programmeringssprog. 16 00:00:42,460 --> 00:00:44,960 Disse kan synes som meget subjektive betingelser. 17 00:00:44,960 --> 00:00:48,090 For eksempel, sandsynligvis du ikke tænke på C som en høj 18 00:00:48,090 --> 00:00:51,440 niveau programmeringssprog, men du kompilere det. 19 00:00:51,440 --> 00:00:52,730 Men det er alle relative. 20 00:00:52,730 --> 00:00:55,790 Som vi vil se, samling kode og til sidst maskine 21 00:00:55,790 --> 00:00:59,270 kode, som vi kompilere ned til, er unægtelig et lavere niveau 22 00:00:59,270 --> 00:01:00,700 end C. 23 00:01:00,700 --> 00:01:03,310 Selv om vi kommer til at bruge Dunk i dagens demonstration, en 24 00:01:03,310 --> 00:01:06,360 Mange af de ideer her fremførsel til andre compilere. 25 00:01:06,360 --> 00:01:09,160 >> For Dunk er der fire vigtige skridt i den overordnede 26 00:01:09,160 --> 00:01:10,200 kompilering. 27 00:01:10,200 --> 00:01:15,430 Dette er en, forbehandling udført af forprocessoren, to, 28 00:01:15,430 --> 00:01:19,530 kompilering udført af compileren, tre, montage 29 00:01:19,530 --> 00:01:22,010 udført af assembler, og fire, 30 00:01:22,010 --> 00:01:24,640 forbinder udført af linkeren. 31 00:01:24,640 --> 00:01:27,600 Det kan være forvirrende, at en af ​​undertrin for den samlede 32 00:01:27,600 --> 00:01:30,980 Klang compilers kaldes compiler, men 33 00:01:30,980 --> 00:01:32,530 vi vil komme til det. 34 00:01:32,530 --> 00:01:35,050 Vi kommer til at bruge et simpelt hej verden program som vores eksempel 35 00:01:35,050 --> 00:01:36,270 hele denne video. 36 00:01:36,270 --> 00:01:38,380 Lad os tage et kig. 37 00:01:38,380 --> 00:01:40,330 >> Det første skridt er forbehandling. 38 00:01:40,330 --> 00:01:42,520 Hvad gør præprocessoren gøre? 39 00:01:42,520 --> 00:01:45,560 I stort set alle C-program, du nogensinde har læst eller skrevet, 40 00:01:45,560 --> 00:01:48,310 du har brugt linjer kode, der begynder med en hash. 41 00:01:48,310 --> 00:01:51,730 Jeg vil kalde det hash, men du kan også kalde det pounds, antal 42 00:01:51,730 --> 00:01:53,280 underskrive, eller skarpe. 43 00:01:53,280 --> 00:01:56,840 Enhver sådan linje er en præprocessor direktiv. 44 00:01:56,840 --> 00:02:00,650 Du har sikkert set # define og # include før, men der 45 00:02:00,650 --> 00:02:03,690 er flere mere at præprocessoren genkender. 46 00:02:03,690 --> 00:02:07,340 Lad os tilføje en # define til vores hej verden eksempel. 47 00:02:07,340 --> 00:02:11,690 Nu lad os køre bare præprocessoren på denne fil. 48 00:02:11,690 --> 00:02:16,150 Ved at føre clage-E flag, er du instruere det til at køre 49 00:02:16,150 --> 00:02:17,880 bare præprocessoren. 50 00:02:17,880 --> 00:02:19,130 Lad os se hvad der sker. 51 00:02:22,250 --> 00:02:24,020 Det ligner Dunk bare spytter alt 52 00:02:24,020 --> 00:02:25,200 på kommandolinjen. 53 00:02:25,200 --> 00:02:27,800 For at redde alt dette output til en ny fil kaldet 54 00:02:27,800 --> 00:02:33,850 hello2.c, vil vi tilføje> hello2.c på vores kommando. 55 00:02:33,850 --> 00:02:37,800 Lad os nu tage et kig på vores præprocesseret fil. 56 00:02:37,800 --> 00:02:40,810 >> Whoa, hvad der skete med vores kort lille program? 57 00:02:40,810 --> 00:02:43,890 Hvis vi går hele vejen ned til bunden af ​​denne fil, vil vi se 58 00:02:43,890 --> 00:02:46,070 nogle af den kode, vi faktisk skrev. 59 00:02:46,070 --> 00:02:49,800 Bemærk at # define er væk, og alle tilfælde af navn 60 00:02:49,800 --> 00:02:51,950 er blevet erstattet med præcis, hvad vi er specificeret i 61 00:02:51,950 --> 00:02:53,590 # define linjen. 62 00:02:53,590 --> 00:02:56,530 Så hvad er alle disse typedefs og funktion erklæringer 63 00:02:56,530 --> 00:02:58,140 øverst i filen? 64 00:02:58,140 --> 00:03:00,820 Bemærk at # define ikke var den eneste præprocessor 65 00:03:00,820 --> 00:03:02,390 direktiv, som vi angivet. 66 00:03:02,390 --> 00:03:05,280 Vi har også # include stdio.h. 67 00:03:05,280 --> 00:03:09,560 Så alle de skøre linjer er faktisk lige stdio.h kopieret 68 00:03:09,560 --> 00:03:11,810 og indsat i toppen af ​​denne fil. 69 00:03:11,810 --> 00:03:14,110 Det er derfor, header-filer er så nyttigt for funktion 70 00:03:14,110 --> 00:03:15,160 erklæringer. 71 00:03:15,160 --> 00:03:17,740 I stedet for at skulle kopiere og indsætte hele funktionen 72 00:03:17,740 --> 00:03:21,050 erklæringer du planlægger at bruge i toppen af ​​din fil, 73 00:03:21,050 --> 00:03:22,990 præprocessor vil kopiere og indsætte dem fra header 74 00:03:22,990 --> 00:03:24,140 filen for dig. 75 00:03:24,140 --> 00:03:26,480 >> Nu, hvor vi er færdige forbehandling, vi bevæger os ind på 76 00:03:26,480 --> 00:03:27,680 kompilering. 77 00:03:27,680 --> 00:03:30,725 Grunden til at vi kalder dette trin samling er fordi det er 78 00:03:30,725 --> 00:03:34,130 det trin, hvor Dunk rent faktisk sin kompilere fra C til 79 00:03:34,130 --> 00:03:35,370 montage kode. 80 00:03:35,370 --> 00:03:38,280 For at få Dunk opretter en sagsmappe ned til samling, men 81 00:03:38,280 --> 00:03:42,030 fortsætte længere, passere det the-S flag 82 00:03:42,030 --> 00:03:43,560 på kommandolinjen. 83 00:03:43,560 --> 00:03:44,790 Lad os tage et kig på samlingen 84 00:03:44,790 --> 00:03:47,390 fil, der blev udsendt. 85 00:03:47,390 --> 00:03:49,740 Det ligner en ganske anden sprog. 86 00:03:49,740 --> 00:03:52,660 Assembly kode er meget processor specifik. 87 00:03:52,660 --> 00:03:55,440 I dette tilfælde CS50 apparatet, da kører på en 88 00:03:55,440 --> 00:04:00,470 virtuel x86 processor, det er x86 forsamling kode. 89 00:04:00,470 --> 00:04:03,450 Meget få mennesker skrive direkte i montage kode i disse dage, 90 00:04:03,450 --> 00:04:06,490 men hver C-program, du nogensinde skriver bliver transformeret ned 91 00:04:06,490 --> 00:04:07,940 i samlingen. 92 00:04:07,940 --> 00:04:11,440 Igen, vi kalder dette trin oprettes et C i samlingen 93 00:04:11,440 --> 00:04:14,170 da vi går fra et højere niveau til et lavere niveau 94 00:04:14,170 --> 00:04:15,480 programmeringssprog. 95 00:04:15,480 --> 00:04:17,880 >> Hvad gør monteringen lavere niveau end C? 96 00:04:17,880 --> 00:04:21,660 Tja, i samling, er vi meget begrænset, hvad vi kan gøre. 97 00:04:21,660 --> 00:04:25,120 Der er ingen IF'ens, mens, thi er, eller sløjfer af nogen art. 98 00:04:25,120 --> 00:04:27,560 Men du kan udføre de samme ting, som disse kontrol 99 00:04:27,560 --> 00:04:30,270 strukturer giver anvendelse af de begrænsede operationer, 100 00:04:30,270 --> 00:04:32,350 samling giver dog. 101 00:04:32,350 --> 00:04:35,960 Men at se hvor lavt niveau samling virkelig er, lad os gå 102 00:04:35,960 --> 00:04:39,320 et skridt videre i vores samling, montage. 103 00:04:39,320 --> 00:04:41,890 Det er assembler opgave at omdanne forsamlingen kode 104 00:04:41,890 --> 00:04:44,740 i objekt eller maskinkode. 105 00:04:44,740 --> 00:04:47,610 Husk, at assembler ikke afgiver samling; 106 00:04:47,610 --> 00:04:51,080 snarere, det tager i montering og udgange maskine kode. 107 00:04:51,080 --> 00:04:54,040 Machine kode er den faktiske 1-taller og 0 er, at en CPU kan 108 00:04:54,040 --> 00:04:57,290 forstå, selv om vi stadig har en lille smule arbejde tilbage 109 00:04:57,290 --> 00:04:59,380 før vi kan køre vores program. 110 00:04:59,380 --> 00:05:01,400 Lad os samle vores forsamling kode ved at passere 111 00:05:01,400 --> 00:05:04,080 Klang for-c flag. 112 00:05:04,080 --> 00:05:06,410 Lad os nu se hvad der er i den samlede fil. 113 00:05:06,410 --> 00:05:09,220 >> Tja, betyder det ikke hjælper os meget. 114 00:05:09,220 --> 00:05:11,340 Husk at maskinen koden er de ettaller og nuller, at 115 00:05:11,340 --> 00:05:13,240 computeren kan forstå. 116 00:05:13,240 --> 00:05:16,080 Det betyder ikke, det er nemt for os at forstå. 117 00:05:16,080 --> 00:05:19,160 Så præcis hvordan lavt niveau er samling? 118 00:05:19,160 --> 00:05:21,480 Det er næsten identisk med objekt kode. 119 00:05:21,480 --> 00:05:24,300 Går fra samling til objekt kode er meget mere af en 120 00:05:24,300 --> 00:05:27,540 oversættelse end en transformation, hvilket er grunden 121 00:05:27,540 --> 00:05:29,310 kunne man ikke betragte assembler til 122 00:05:29,310 --> 00:05:31,400 gøre nogen reel compiling. 123 00:05:31,400 --> 00:05:34,110 Faktisk er det temmelig nemt at manuelt oversætte fra 124 00:05:34,110 --> 00:05:36,050 forsamling til maskine kode. 125 00:05:36,050 --> 00:05:39,040 Ser man på samlingen for en hovedfunktion, at første linje 126 00:05:39,040 --> 00:05:42,100 tilfældigvis svarer til hexadecimale 0x55. 127 00:05:42,100 --> 00:05:45,470 I binær, er det 1.010.101. 128 00:05:45,470 --> 00:05:49,300 Den anden linje sker for at svare hexadecimal 0x895. 129 00:05:49,300 --> 00:05:51,290 Og den næste, 0x56. 130 00:05:51,290 --> 00:05:53,730 Givet en relativt simpel tabel, kan du oversætte 131 00:05:53,730 --> 00:05:57,130 samling i koden, at maskinerne kan forstå også. 132 00:05:57,130 --> 00:05:58,810 >> Så der er én resterende skridt i 133 00:05:58,810 --> 00:06:01,150 kompilering, der forbinder. 134 00:06:01,150 --> 00:06:04,530 Sammenkædning kombinerer en masse objekt filer til én stor fil 135 00:06:04,530 --> 00:06:06,380 at du faktisk kan udføre. 136 00:06:06,380 --> 00:06:08,570 Sammenkædning er meget afhængig af systemet. 137 00:06:08,570 --> 00:06:11,030 Så den nemmeste måde at få Dunk bare sammenkæde objektet 138 00:06:11,030 --> 00:06:13,920 filer sammen er at kalde Dunk på alle de filer, 139 00:06:13,920 --> 00:06:15,190 du vil linke sammen. 140 00:06:15,190 --> 00:06:18,740 Hvis du angiver. O-filer, så vil det ikke nødvendigt at oparbejde, 141 00:06:18,740 --> 00:06:21,680 kompilere og samle alle dine kildekode. 142 00:06:21,680 --> 00:06:23,960 Lad os kaste et matematisk funktion i vores fil, så vi har 143 00:06:23,960 --> 00:06:25,210 noget at forbinde i. 144 00:06:34,220 --> 00:06:37,010 Lad os nu kompilere det tilbage ned til objekt-kode og 145 00:06:37,010 --> 00:06:38,260 kalde Dunk på det. 146 00:06:40,560 --> 00:06:41,420 Ups. 147 00:06:41,420 --> 00:06:43,790 Da vi inkluderet en matematisk funktion, er vi nødt til at linke i 148 00:06:43,790 --> 00:06:46,610 math bibliotek med-lm. 149 00:06:46,610 --> 00:06:48,990 >> Hvis vi ønskede at sammenkæde flok. O-filer, som vi 150 00:06:48,990 --> 00:06:51,420 skrev på vores egne, ville vi bare angive dem alle på 151 00:06:51,420 --> 00:06:52,460 kommandolinje. 152 00:06:52,460 --> 00:06:55,320 Begrænsningen er, at kun en af ​​disse filer skal 153 00:06:55,320 --> 00:06:57,790 faktisk angive en hovedfunktion, ellers 154 00:06:57,790 --> 00:06:59,930 resulterende eksekverbare ville ikke vide hvor du skal starte 155 00:06:59,930 --> 00:07:00,910 kører din kode. 156 00:07:00,910 --> 00:07:03,360 Hvad er forskellen mellem at angive en fil til at linke i 157 00:07:03,360 --> 00:07:06,600 med-l og blot angive en fil direkte? 158 00:07:06,600 --> 00:07:07,440 Ingenting. 159 00:07:07,440 --> 00:07:09,850 Det er bare at Dunk sker at vide præcis, hvad fil 160 00:07:09,850 --> 00:07:12,560 noget lignende-lm sker for at henvise til. 161 00:07:12,560 --> 00:07:14,700 Hvis du vidste, at filen selv, kan du angive det 162 00:07:14,700 --> 00:07:15,930 eksplicit. 163 00:07:15,930 --> 00:07:18,990 Bare husk, at al-l-flag er nødt til at komme i slutningen 164 00:07:18,990 --> 00:07:20,770 af din klient efterspørgsel. 165 00:07:20,770 --> 00:07:22,300 >> Og det er alt der er til det. 166 00:07:22,300 --> 00:07:24,940 Når du bare køre Dunk på nogle filer, det er hvad det er 167 00:07:24,940 --> 00:07:26,350 faktisk gør. 168 00:07:26,350 --> 00:07:29,490 Mit navn er Rob Bowden, og dette er CS50.