1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB BOWDEN: Laten we het hebben over compilers. 2 00:00:09,100 --> 00:00:11,490 Tot dit punt, je hebt net getypt up van uw broncode in 3 00:00:11,490 --> 00:00:14,260 een aantal bestanden, stuurde ze door deze grote zwarte doos die is 4 00:00:14,260 --> 00:00:16,890 Clang, en uit komt uw uitvoerbare bestand dat doet 5 00:00:16,890 --> 00:00:19,430 precies wat u schreef in uw broncode. 6 00:00:19,430 --> 00:00:22,170 Zo magisch als die is geweest, gaan we aan een nader te nemen 7 00:00:22,170 --> 00:00:23,590 kijken naar wat er daadwerkelijk gebeurt 8 00:00:23,590 --> 00:00:25,220 wanneer we een dossier samen. 9 00:00:25,220 --> 00:00:28,580 Dus wat betekent het om iets samen te stellen? 10 00:00:28,580 --> 00:00:31,150 >> Nou, in de meest algemene zin, het betekent alleen 11 00:00:31,150 --> 00:00:32,580 transformeren code geschreven in een 12 00:00:32,580 --> 00:00:34,680 programmeertaal naar een andere. 13 00:00:34,680 --> 00:00:37,550 Maar meestal als mensen zeggen dat ze samen te stellen iets, ze 14 00:00:37,550 --> 00:00:39,660 zeggen dat ze het nemen van het van een hoger niveau programmering 15 00:00:39,660 --> 00:00:42,460 taal naar lagere programmeertaal. 16 00:00:42,460 --> 00:00:44,960 Dit lijken misschien erg subjectieve termen. 17 00:00:44,960 --> 00:00:48,090 Bijvoorbeeld, heb je waarschijnlijk niet denken aan C als een hoge 18 00:00:48,090 --> 00:00:51,440 level programmeertaal, maar je compileren. 19 00:00:51,440 --> 00:00:52,730 Maar het is allemaal relatief. 20 00:00:52,730 --> 00:00:55,790 Zoals we zullen zien, de assemblage-code en uiteindelijk machine 21 00:00:55,790 --> 00:00:59,270 code die we naar beneden te compileren is onmiskenbaar een lager niveau 22 00:00:59,270 --> 00:01:00,700 dan C. 23 00:01:00,700 --> 00:01:03,310 Hoewel we zullen met behulp van Clang in de demonstratie van vandaag, een 24 00:01:03,310 --> 00:01:06,360 Veel van de ideeën hier kunnen worden overgedragen naar andere compilers. 25 00:01:06,360 --> 00:01:09,160 >> Voor Clang, zijn er vier belangrijke stappen in de totale 26 00:01:09,160 --> 00:01:10,200 compilatie. 27 00:01:10,200 --> 00:01:15,430 Dit zijn een, voorbewerking uitgevoerd door de preprocessor, twee, 28 00:01:15,430 --> 00:01:19,530 compilatie gedaan door de compiler, drie, assembleren 29 00:01:19,530 --> 00:01:22,010 gedaan door de assembler en vier, 30 00:01:22,010 --> 00:01:24,640 koppeling gebeurt door de linker. 31 00:01:24,640 --> 00:01:27,600 Het verwarrend kan zijn dat een van de substappen van de algemene 32 00:01:27,600 --> 00:01:30,980 Clang compilers heet de compiler, maar 33 00:01:30,980 --> 00:01:32,530 we krijgen dat. 34 00:01:32,530 --> 00:01:35,050 We zullen met behulp van een eenvoudige Hello World programma als voorbeeld 35 00:01:35,050 --> 00:01:36,270 gedurende deze video. 36 00:01:36,270 --> 00:01:38,380 Laten we eens een kijkje nemen. 37 00:01:38,380 --> 00:01:40,330 >> De eerste stap is voorverwerking. 38 00:01:40,330 --> 00:01:42,520 Wat doet de preprocessor doen? 39 00:01:42,520 --> 00:01:45,560 In vrijwel elke C-programma die je ooit hebt gelezen of geschreven, 40 00:01:45,560 --> 00:01:48,310 je hebt gebruikt regels code die beginnen met een hekje. 41 00:01:48,310 --> 00:01:51,730 Ik noem het hash, maar u kunt ook bellen het pond, het aantal 42 00:01:51,730 --> 00:01:53,280 ondertekenen, of scherp. 43 00:01:53,280 --> 00:01:56,840 Een dergelijke regel is een preprocessor richtlijn. 44 00:01:56,840 --> 00:02:00,650 U heeft waarschijnlijk gezien # # define en omvatten voor, maar er 45 00:02:00,650 --> 00:02:03,690 zijn verschillende meer dat de preprocessor herkent. 46 00:02:03,690 --> 00:02:07,340 Laten we eerst nog # define onze hello world voorbeeld. 47 00:02:07,340 --> 00:02:11,690 Laten we nu eens gewoon de preprocessor draaien op dit bestand. 48 00:02:11,690 --> 00:02:16,150 Bij het passeren van Clage de-e vlag, je bent de instructie uit te voeren 49 00:02:16,150 --> 00:02:17,880 alleen de preprocessor. 50 00:02:17,880 --> 00:02:19,130 Laten we eens kijken wat er gebeurt. 51 00:02:22,250 --> 00:02:24,020 Het lijkt erop dat Clang net spuugt alles 52 00:02:24,020 --> 00:02:25,200 op de opdrachtregel. 53 00:02:25,200 --> 00:02:27,800 Met het oog op al deze uitgang op te slaan in een nieuw bestand geheten 54 00:02:27,800 --> 00:02:33,850 hello2.c, we voegen> hello2.c op onze opdracht. 55 00:02:33,850 --> 00:02:37,800 Laten we nu eens een kijkje op onze voorbewerkte bestand. 56 00:02:37,800 --> 00:02:40,810 >> Whoa, wat is er gebeurd met onze korte kleine programma? 57 00:02:40,810 --> 00:02:43,890 Als we gaan helemaal naar de onderkant van dit bestand, we zullen zien 58 00:02:43,890 --> 00:02:46,070 een deel van de code die we hebben geschreven. 59 00:02:46,070 --> 00:02:49,800 Merk op dat de # define is verdwenen en alle exemplaren van de naam 60 00:02:49,800 --> 00:02:51,950 zijn vervangen door wat we de in 61 00:02:51,950 --> 00:02:53,590 de # define lijn. 62 00:02:53,590 --> 00:02:56,530 Dus wat zijn al deze typedefs en functie verklaringen 63 00:02:56,530 --> 00:02:58,140 bovenaan het dossier? 64 00:02:58,140 --> 00:03:00,820 Merk op dat de # define niet de enige preprocessor 65 00:03:00,820 --> 00:03:02,390 richtlijn die we hadden aangegeven. 66 00:03:02,390 --> 00:03:05,280 We hebben ook # include stdio.h. 67 00:03:05,280 --> 00:03:09,560 Dus alle van de gekke lijnen zijn eigenlijk gewoon stdio.h gekopieerd 68 00:03:09,560 --> 00:03:11,810 en geplakt in de top van dit bestand. 69 00:03:11,810 --> 00:03:14,110 Dat is waarom header-bestanden zijn zo nuttig voor de functie 70 00:03:14,110 --> 00:03:15,160 verklaringen. 71 00:03:15,160 --> 00:03:17,740 In plaats van om te kopiëren en plakken van al van de functie 72 00:03:17,740 --> 00:03:21,050 verklaringen u van plan bent over het gebruik van op de top van uw dossier, de 73 00:03:21,050 --> 00:03:22,990 preprocessor zal kopieren en te plakken uit de header 74 00:03:22,990 --> 00:03:24,140 bestand voor je. 75 00:03:24,140 --> 00:03:26,480 >> Nu dat we preprocessing gedaan, gaan we naar 76 00:03:26,480 --> 00:03:27,680 compilatie. 77 00:03:27,680 --> 00:03:30,725 De reden dat we noemen deze stap compilatie is, want dit is 78 00:03:30,725 --> 00:03:34,130 de stap waar Clang ook werkelijk doet haar compileren van C naar 79 00:03:34,130 --> 00:03:35,370 assembly code. 80 00:03:35,370 --> 00:03:38,280 Met het oog op zijn Clang een dossier samen tot de montage, maar 81 00:03:38,280 --> 00:03:42,030 blijven niet verder, geef het de vlag-S 82 00:03:42,030 --> 00:03:43,560 op de opdrachtregel. 83 00:03:43,560 --> 00:03:44,790 Laten we eens een kijkje nemen op de vergadering 84 00:03:44,790 --> 00:03:47,390 bestand dat is uitgevoerd. 85 00:03:47,390 --> 00:03:49,740 Lijkt heel andere taal. 86 00:03:49,740 --> 00:03:52,660 Montage-code is zeer processor specifiek. 87 00:03:52,660 --> 00:03:55,440 In dit geval, aangezien de CS50 apparaat wordt uitgevoerd op een 88 00:03:55,440 --> 00:04:00,470 virtuele x86-processor, is dit x86 assembly code. 89 00:04:00,470 --> 00:04:03,450 Zeer weinig mensen schrijven direct in assembler deze dagen, 90 00:04:03,450 --> 00:04:06,490 maar elke C-programma die je ooit schrijven wordt getransformeerd naar beneden 91 00:04:06,490 --> 00:04:07,940 in de montage. 92 00:04:07,940 --> 00:04:11,440 Nogmaals, we noemen deze stap het opstellen van de C in de montage 93 00:04:11,440 --> 00:04:14,170 Aangezien we van een hoger niveau naar een lager niveau 94 00:04:14,170 --> 00:04:15,480 programmeertaal. 95 00:04:15,480 --> 00:04:17,880 >> Wat maakt de montage lager niveau dan C? 96 00:04:17,880 --> 00:04:21,660 Nou, in de montage, zijn wij zeer beperkt in wat we kunnen doen. 97 00:04:21,660 --> 00:04:25,120 Er zijn geen of, terwijl het voor is, of lussen van welke aard ook. 98 00:04:25,120 --> 00:04:27,560 Maar je kunt bereiken dezelfde dingen die deze controle 99 00:04:27,560 --> 00:04:30,270 structuren bieden met behulp van de beperkte activiteiten die 100 00:04:30,270 --> 00:04:32,350 assemblage biedt wel. 101 00:04:32,350 --> 00:04:35,960 Maar om te zien hoe laag niveau assemblage werkelijk is, laten we gaan 102 00:04:35,960 --> 00:04:39,320 nog een stap verder in onze compilatie, assembleren. 103 00:04:39,320 --> 00:04:41,890 Het is de assembler de taak om de assembly code te transformeren 104 00:04:41,890 --> 00:04:44,740 in object of machine code. 105 00:04:44,740 --> 00:04:47,610 Vergeet niet dat de assembler niet doet uitgang montage; 106 00:04:47,610 --> 00:04:51,080 Integendeel, het is de montage en de outputs machine code. 107 00:04:51,080 --> 00:04:54,040 Machine is de werkelijke 1's en 0's die een CPU kan 108 00:04:54,040 --> 00:04:57,290 begrijpen, hoewel we nog steeds een heel klein beetje van het werk links 109 00:04:57,290 --> 00:04:59,380 voordat we kunnen draaien ons programma. 110 00:04:59,380 --> 00:05:01,400 Laten monteren onze assemblage-code door het passeren van 111 00:05:01,400 --> 00:05:04,080 Clang de-c vlag. 112 00:05:04,080 --> 00:05:06,410 Laten we nu eens kijken wat er in de verzamelde bestand. 113 00:05:06,410 --> 00:05:09,220 >> Nou ja, betekent dat niet ons ten zeerste helpen. 114 00:05:09,220 --> 00:05:11,340 Vergeet niet dat de machine code is de enen en nullen die 115 00:05:11,340 --> 00:05:13,240 uw computer kan begrijpen. 116 00:05:13,240 --> 00:05:16,080 Dat betekent niet dat het is gemakkelijk voor ons om te begrijpen. 117 00:05:16,080 --> 00:05:19,160 Dus precies hoe laag niveau is de montage? 118 00:05:19,160 --> 00:05:21,480 Het is bijna identiek aan objectcode. 119 00:05:21,480 --> 00:05:24,300 Gaande van assemblage tot object-code is veel meer een 120 00:05:24,300 --> 00:05:27,540 vertaling dan een transformatie Daarom 121 00:05:27,540 --> 00:05:29,310 kan men de assembler niet beschouwen 122 00:05:29,310 --> 00:05:31,400 voert u een werkelijke compiling. 123 00:05:31,400 --> 00:05:34,110 In feite, het is vrij eenvoudig om handmatig vertalen van 124 00:05:34,110 --> 00:05:36,050 assemblage van de machine code. 125 00:05:36,050 --> 00:05:39,040 Kijkend naar de assembly voor een hoofdfunctie, die eerste regel 126 00:05:39,040 --> 00:05:42,100 gebeurt overeen te stemmen met hexadecimale 0x55. 127 00:05:42,100 --> 00:05:45,470 In binaire, dat is 1010101. 128 00:05:45,470 --> 00:05:49,300 De tweede regel gebeurt overeen te komen hexadecimale 0x895. 129 00:05:49,300 --> 00:05:51,290 En de volgende, 0x56. 130 00:05:51,290 --> 00:05:53,730 Gegeven een relatief eenvoudige tafel, kun je vertalen 131 00:05:53,730 --> 00:05:57,130 geheel in de code die machines te kunnen begrijpen. 132 00:05:57,130 --> 00:05:58,810 >> Dus er is een resterende stap in 133 00:05:58,810 --> 00:06:01,150 compilatie, dat wordt het koppelen. 134 00:06:01,150 --> 00:06:04,530 Koppelen combineert een bos van object bestanden naar een groot bestand 135 00:06:04,530 --> 00:06:06,380 dat je daadwerkelijk kunt uitvoeren. 136 00:06:06,380 --> 00:06:08,570 Koppelen is erg systeemafhankelijk. 137 00:06:08,570 --> 00:06:11,030 Dus de gemakkelijkste manier om Clang te krijgen om gewoon te koppelen object 138 00:06:11,030 --> 00:06:13,920 bestanden samen is om Clang een beroep doen op alle bestanden die 139 00:06:13,920 --> 00:06:15,190 je wilt met elkaar te verbinden. 140 00:06:15,190 --> 00:06:18,740 Als u opgeeft. O bestanden, dan zal het niet opnieuw moet bewerken, 141 00:06:18,740 --> 00:06:21,680 compileren, monteren en al uw broncode. 142 00:06:21,680 --> 00:06:23,960 Laten we gooien een wiskundige functie in ons bestand, dus we moeten 143 00:06:23,960 --> 00:06:25,210 iets te linken inch 144 00:06:34,220 --> 00:06:37,010 Laten we nu eens terug te compileren naar object code en 145 00:06:37,010 --> 00:06:38,260 noemen Clang op. 146 00:06:40,560 --> 00:06:41,420 Oeps. 147 00:06:41,420 --> 00:06:43,790 Aangezien wij omvatte een wiskundige functie, moeten we in koppelen 148 00:06:43,790 --> 00:06:46,610 de wiskunde bibliotheek met-lm. 149 00:06:46,610 --> 00:06:48,990 >> Als we wilden aan elkaar te koppelen stelletje. O bestanden die we 150 00:06:48,990 --> 00:06:51,420 schreef op onze eigen, zouden we gewoon opgeven ze allemaal op de 151 00:06:51,420 --> 00:06:52,460 opdrachtregel. 152 00:06:52,460 --> 00:06:55,320 De beperking is dat slechts een van deze bestanden moet 153 00:06:55,320 --> 00:06:57,790 eigenlijk geef een hoofdfunctie, of anders de 154 00:06:57,790 --> 00:06:59,930 resulterende uitvoerbaar zou niet weten waar te beginnen 155 00:06:59,930 --> 00:07:00,910 het runnen van uw code. 156 00:07:00,910 --> 00:07:03,360 Wat is het verschil tussen het opgeven van een bestand voor een koppeling in 157 00:07:03,360 --> 00:07:06,600 met-l en slechts het opgeven van een bestand direct? 158 00:07:06,600 --> 00:07:07,440 Niets. 159 00:07:07,440 --> 00:07:09,850 Het is gewoon dat Clang gebeurt om precies te weten welk bestand 160 00:07:09,850 --> 00:07:12,560 iets als-lm gebeurt om te verwijzen naar. 161 00:07:12,560 --> 00:07:14,700 Als je wist dat bestand zelf, kunt u opgeven 162 00:07:14,700 --> 00:07:15,930 expliciet. 163 00:07:15,930 --> 00:07:18,990 Vergeet niet dat alle-l vlaggen moeten komen aan het einde 164 00:07:18,990 --> 00:07:20,770 van uw klant de vraag. 165 00:07:20,770 --> 00:07:22,300 >> En dat is alles wat er is. 166 00:07:22,300 --> 00:07:24,940 Als je gewoon Clang draaien op sommige bestanden, dit is wat het is 167 00:07:24,940 --> 00:07:26,350 werkelijk te doen. 168 00:07:26,350 --> 00:07:29,490 Mijn naam is Rob Bowden, en dit is CS50.