1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB BOWDEN: Hai vorbim despre compilatoare. 2 00:00:09,100 --> 00:00:11,490 Până în acest moment, tocmai ați tastat codul sursă până în 3 00:00:11,490 --> 00:00:14,260 unele fișiere, le-a trimis prin intermediul acestui cutie neagră mare, care este 4 00:00:14,260 --> 00:00:16,890 Zăngănit, și iese fișierul executabil care face 5 00:00:16,890 --> 00:00:19,430 exact ceea ce ai scris în codul sursă. 6 00:00:19,430 --> 00:00:22,170 Ca magic ca a fost, am de gând să ia o mai strânsă 7 00:00:22,170 --> 00:00:23,590 uita-te la ceea ce se intampla de fapt 8 00:00:23,590 --> 00:00:25,220 atunci când am compila un fișier. 9 00:00:25,220 --> 00:00:28,580 Deci, ce înseamnă să compileze ceva? 10 00:00:28,580 --> 00:00:31,150 >> Ei bine, în sensul cel mai general, aceasta înseamnă doar 11 00:00:31,150 --> 00:00:32,580 Codul de transformarea scris într-un singur 12 00:00:32,580 --> 00:00:34,680 limbajul de programare la altul. 13 00:00:34,680 --> 00:00:37,550 Dar, de obicei, atunci când oamenii spun că compila ceva, ei 14 00:00:37,550 --> 00:00:39,660 înseamnă că îl iau de la un nivel mai ridicat de programare 15 00:00:39,660 --> 00:00:42,460 lingvistice la un limbaj de programare mai mic nivel. 16 00:00:42,460 --> 00:00:44,960 Acestea pot părea termeni foarte subiectivi. 17 00:00:44,960 --> 00:00:48,090 De exemplu, probabil că nu cred că a C ca un nivel ridicat 18 00:00:48,090 --> 00:00:51,440 limbaj de programare de nivel, dar tu nu-l compilați. 19 00:00:51,440 --> 00:00:52,730 Dar totul e relativ. 20 00:00:52,730 --> 00:00:55,790 După cum vom vedea, codul de asamblare și, eventual, mașină 21 00:00:55,790 --> 00:00:59,270 cod care am compila în jos pentru a este incontestabil un nivel inferior 22 00:00:59,270 --> 00:01:00,700 decât C. 23 00:01:00,700 --> 00:01:03,310 Deși vom folosi zăngănit în demonstrația de astăzi, o 24 00:01:03,310 --> 00:01:06,360 Multe dintre ideile de aici transporta pe la alte compilatoare. 25 00:01:06,360 --> 00:01:09,160 >> Pentru zăngănit, există patru etape majore în total 26 00:01:09,160 --> 00:01:10,200 compilare. 27 00:01:10,200 --> 00:01:15,430 Acestea sunt una, preprocesare făcut de preprocesor, două, 28 00:01:15,430 --> 00:01:19,530 compilarea face de către compilator, trei, asamblare 29 00:01:19,530 --> 00:01:22,010 efectuată de către asamblor, și patru, 30 00:01:22,010 --> 00:01:24,640 care leagă făcut de linker-ul. 31 00:01:24,640 --> 00:01:27,600 Ea poate fi confuz că una dintre cele substeps de ansamblu 32 00:01:27,600 --> 00:01:30,980 Compilatoare zăngănit este numit compilator, dar 33 00:01:30,980 --> 00:01:32,530 vom ajunge la asta. 34 00:01:32,530 --> 00:01:35,050 Vom fi cu ajutorul unui program simplu Salut lume ca exemplul nostru 35 00:01:35,050 --> 00:01:36,270 pe parcursul acestui videoclip. 36 00:01:36,270 --> 00:01:38,380 Să aruncăm o privire. 37 00:01:38,380 --> 00:01:40,330 >> Primul pas este de preprocesare. 38 00:01:40,330 --> 00:01:42,520 Ce face preprocesor face? 39 00:01:42,520 --> 00:01:45,560 În destul de mult fiecare program C care l-ai citit sau scris, 40 00:01:45,560 --> 00:01:48,310 ați folosit linii de cod care începe cu o hash. 41 00:01:48,310 --> 00:01:51,730 Voi numi hash, dar poate, de asemenea ea de lire sterline, numărul de 42 00:01:51,730 --> 00:01:53,280 inscriere, sau ascuțite. 43 00:01:53,280 --> 00:01:56,840 Orice astfel de linie este o directivă preprocesor. 44 00:01:56,840 --> 00:02:00,650 Probabil ați văzut # define # include și înainte, dar nu există 45 00:02:00,650 --> 00:02:03,690 Sunt mai multe care mai preprocesor recunoaște. 46 00:02:03,690 --> 00:02:07,340 Să adăugăm un # define la exemplul nostru Salut lume. 47 00:02:07,340 --> 00:02:11,690 Acum, haideți să rulați doar preprocesor privire la acest dosar. 48 00:02:11,690 --> 00:02:16,150 Prin trecerea de pavilion clage E-, esti instruindu-l pentru a rula 49 00:02:16,150 --> 00:02:17,880 doar preprocesor. 50 00:02:17,880 --> 00:02:19,130 Să vedem ce se întâmplă. 51 00:02:22,250 --> 00:02:24,020 Se pare ca zăngănit doar scuipa totul 52 00:02:24,020 --> 00:02:25,200 la linia de comandă. 53 00:02:25,200 --> 00:02:27,800 În scopul de a salva toate acestea ieșire la un nou fisier numit 54 00:02:27,800 --> 00:02:33,850 hello2.c, vom adăuga> hello2.c la comanda noastră. 55 00:02:33,850 --> 00:02:37,800 Acum, haideți să aruncăm o privire la dosarul nostru preprocesată. 56 00:02:37,800 --> 00:02:40,810 >> Uau, ce sa întâmplat cu programul nostru pic cam scurt? 57 00:02:40,810 --> 00:02:43,890 Dacă vom merge tot drumul până la partea de jos a acestui fișier, vom vedea 58 00:02:43,890 --> 00:02:46,070 o parte din cod pe care am scris de fapt. 59 00:02:46,070 --> 00:02:49,800 Observați că # define este plecat și a tuturor instanțelor de nume 60 00:02:49,800 --> 00:02:51,950 au fost înlocuite cu exact ceea ce am specificat în 61 00:02:51,950 --> 00:02:53,590 # define linie. 62 00:02:53,590 --> 00:02:56,530 Deci, ce sunt toate aceste typedefs și declarații de funcții 63 00:02:56,530 --> 00:02:58,140 în partea de sus a fișierului? 64 00:02:58,140 --> 00:03:00,820 Observați că # define nu a fost singurul preprocesor 65 00:03:00,820 --> 00:03:02,390 directivă pe care am specificat. 66 00:03:02,390 --> 00:03:05,280 De asemenea, am # include stdio.h. 67 00:03:05,280 --> 00:03:09,560 Deci, toate liniile de nebun sunt de fapt doar stdio.h copiat 68 00:03:09,560 --> 00:03:11,810 și lipit în partea de sus a acestui fișier. 69 00:03:11,810 --> 00:03:14,110 De aceea, fișierele header sunt atât de utile pentru funcția 70 00:03:14,110 --> 00:03:15,160 declarații. 71 00:03:15,160 --> 00:03:17,740 În loc de a fi nevoie să copiați și să lipiți toate functiei 72 00:03:17,740 --> 00:03:21,050 Declarațiile aveți de gând cu privire la utilizarea, la partea de sus a fișierului, în 73 00:03:21,050 --> 00:03:22,990 preprocesorul va copia și lipiți-le din antet 74 00:03:22,990 --> 00:03:24,140 dosar pentru tine. 75 00:03:24,140 --> 00:03:26,480 >> Acum că am terminat preprocesare, trecem pe 76 00:03:26,480 --> 00:03:27,680 compilare. 77 00:03:27,680 --> 00:03:30,725 Motivul numim aceasta compilatie pas este că acest lucru este 78 00:03:30,725 --> 00:03:34,130 pasul în cazul în care zăngănit de fapt, nu sa compilarea de la C la 79 00:03:34,130 --> 00:03:35,370 asamblare cod. 80 00:03:35,370 --> 00:03:38,280 Pentru a avea zăngănit întocmesc un dosar până la adunare, dar 81 00:03:38,280 --> 00:03:42,030 continua mai departe, să-l dați S-pavilion 82 00:03:42,030 --> 00:03:43,560 la linia de comandă. 83 00:03:43,560 --> 00:03:44,790 Să aruncăm o privire la ansamblul 84 00:03:44,790 --> 00:03:47,390 fișier care a fost emise. 85 00:03:47,390 --> 00:03:49,740 Se pare ca destul de o altă limbă. 86 00:03:49,740 --> 00:03:52,660 Codul de asamblare este foarte procesor specifică. 87 00:03:52,660 --> 00:03:55,440 În acest caz, deoarece aparatul CS50 rulează pe un 88 00:03:55,440 --> 00:04:00,470 procesor virtual x86, aceasta este codul de asamblare x86. 89 00:04:00,470 --> 00:04:03,450 Foarte puțini oameni scriu direct in cod de asamblare în aceste zile, 90 00:04:03,450 --> 00:04:06,490 dar fiecare program C scrii vreodată se transformă în jos 91 00:04:06,490 --> 00:04:07,940 în ansamblu. 92 00:04:07,940 --> 00:04:11,440 Din nou, noi numim acest pas compilarea C în ansamblul 93 00:04:11,440 --> 00:04:14,170 din moment ce suntem merge de la un nivel superior la un nivel inferior 94 00:04:14,170 --> 00:04:15,480 limbajul de programare. 95 00:04:15,480 --> 00:04:17,880 >> Ceea ce face ca nivelul de ansamblu mai mic decât C? 96 00:04:17,880 --> 00:04:21,660 Ei bine, în ansamblu, suntem foarte limitate în ceea ce putem face. 97 00:04:21,660 --> 00:04:25,120 Nu există în cazul în care lui, in timp ce, pentru bucle, sau de orice fel. 98 00:04:25,120 --> 00:04:27,560 Dar puteți realiza aceleasi lucruri ca acestea de control 99 00:04:27,560 --> 00:04:30,270 Structurile oferă utilizarea la operațiunile limitate de care 100 00:04:30,270 --> 00:04:32,350 asamblare nu oferă. 101 00:04:32,350 --> 00:04:35,960 Dar, pentru a vedea cât de asamblare nivel scăzut este într-adevăr, să mergem 102 00:04:35,960 --> 00:04:39,320 cu un pas mai departe în elaborarea de către noi, asamblare. 103 00:04:39,320 --> 00:04:41,890 E treaba de asamblare de a transforma codul de asamblare 104 00:04:41,890 --> 00:04:44,740 în obiect sau cod mașină. 105 00:04:44,740 --> 00:04:47,610 Amintiți-vă că nu asamblor de asamblare de ieșire; 106 00:04:47,610 --> 00:04:51,080 mai degrabă, este nevoie de cod în asamblare și mașină de ieșiri. 107 00:04:51,080 --> 00:04:54,040 Codul mașină este real 1 si 0, care poate fi un procesor 108 00:04:54,040 --> 00:04:57,290 înțelege, deși încă mai avem un pic de lucru stânga 109 00:04:57,290 --> 00:04:59,380 înainte de a putea rula programul nostru. 110 00:04:59,380 --> 00:05:01,400 Să asambla codul nostru de asamblare prin care trece 111 00:05:01,400 --> 00:05:04,080 Zăngănit c-pavilion. 112 00:05:04,080 --> 00:05:06,410 Acum, să vedem ce e în dosar asamblat. 113 00:05:06,410 --> 00:05:09,220 >> Ei bine, asta nu ne ajuta foarte mult. 114 00:05:09,220 --> 00:05:11,340 Amintiți-vă că mașina este codul de unu și zero care 115 00:05:11,340 --> 00:05:13,240 computerul poate înțelege. 116 00:05:13,240 --> 00:05:16,080 Asta nu înseamnă că e ușor pentru noi să înțelegem. 117 00:05:16,080 --> 00:05:19,160 Deci, exact cum este nivelul scăzut de asamblare? 118 00:05:19,160 --> 00:05:21,480 Este aproape identic cu codul obiect. 119 00:05:21,480 --> 00:05:24,300 Trecerea de la asamblare la cod obiect este mult mai mult de-o 120 00:05:24,300 --> 00:05:27,540 Traducere decât o transformare, care este motivul pentru care 121 00:05:27,540 --> 00:05:29,310 nu s-ar putea lua în considerare de asamblare a 122 00:05:29,310 --> 00:05:31,400 face orice real compilare. 123 00:05:31,400 --> 00:05:34,110 De fapt, e destul de ușor pentru a traduce manual din 124 00:05:34,110 --> 00:05:36,050 de asamblare în cod mașină. 125 00:05:36,050 --> 00:05:39,040 Privind la asamblare pentru o funcție principală, faptul că prima linie 126 00:05:39,040 --> 00:05:42,100 se întâmplă să corespundă 0x55 hexazecimale. 127 00:05:42,100 --> 00:05:45,470 În binar, asta e 1010101. 128 00:05:45,470 --> 00:05:49,300 A doua linie se întâmplă să corespundă 0x895 hexazecimal. 129 00:05:49,300 --> 00:05:51,290 Și 0x56 următor,. 130 00:05:51,290 --> 00:05:53,730 Având în vedere o masă relativ simplu, te-ar putea traduce 131 00:05:53,730 --> 00:05:57,130 de asamblare în cod care mașinile pot înțelege prea. 132 00:05:57,130 --> 00:05:58,810 >> Deci, nu e un pas rămasă în 133 00:05:58,810 --> 00:06:01,150 compilare, care se leagă. 134 00:06:01,150 --> 00:06:04,530 Legarea combină o grămadă de fișiere obiect într-un fișier mare 135 00:06:04,530 --> 00:06:06,380 pe care le poate executa de fapt. 136 00:06:06,380 --> 00:06:08,570 Legarea este foarte dependenta de sistem. 137 00:06:08,570 --> 00:06:11,030 Deci, cel mai simplu mod de a obține zăngănit de a lega doar obiect 138 00:06:11,030 --> 00:06:13,920 Fișierele împreună este de a apela zăngănit pe toate fișierele care 139 00:06:13,920 --> 00:06:15,190 doriți să legați împreună. 140 00:06:15,190 --> 00:06:18,740 Dacă specificați. Fișiere o, atunci nu va trebui să prelucreze din nou, 141 00:06:18,740 --> 00:06:21,680 compila, și să asambleze toate codul sursă. 142 00:06:21,680 --> 00:06:23,960 Să aruncăm o funcție matematică într-un fișier noastră, așa că avem 143 00:06:23,960 --> 00:06:25,210 ceva pentru a lega inch 144 00:06:34,220 --> 00:06:37,010 Acum, haideți să-l compilați înapoi la cod obiect și 145 00:06:37,010 --> 00:06:38,260 apel zăngănit pe ea. 146 00:06:40,560 --> 00:06:41,420 Hopa. 147 00:06:41,420 --> 00:06:43,790 Din moment ce am inclus o funcție matematică, avem nevoie pentru a lega în 148 00:06:43,790 --> 00:06:46,610 biblioteca matematica cu-LM. 149 00:06:46,610 --> 00:06:48,990 >> Dacă am vrut să unească o grămadă de fișiere. Că am 150 00:06:48,990 --> 00:06:51,420 scris pe cont propriu, am specificați-le pe toate la 151 00:06:51,420 --> 00:06:52,460 linia de comandă. 152 00:06:52,460 --> 00:06:55,320 Restricție este că doar unul dintre aceste fișiere trebuie să 153 00:06:55,320 --> 00:06:57,790 specifica de fapt o funcție principală, sau altceva 154 00:06:57,790 --> 00:06:59,930 executabil rezultat nu ar ști de unde să încep 155 00:06:59,930 --> 00:07:00,910 execută codul. 156 00:07:00,910 --> 00:07:03,360 Care este diferența dintre specificând un fișier pentru a lega în 157 00:07:03,360 --> 00:07:06,600 cu-l și specificând doar un fișier în mod direct? 158 00:07:06,600 --> 00:07:07,440 Nimic. 159 00:07:07,440 --> 00:07:09,850 E doar faptul că zăngănit se întâmplă să știu exact ce fișier 160 00:07:09,850 --> 00:07:12,560 ceva de genul-LM se întâmplă să se refere la. 161 00:07:12,560 --> 00:07:14,700 Dacă ai ști că fișierul tine, ai putea specifica 162 00:07:14,700 --> 00:07:15,930 în mod explicit. 163 00:07:15,930 --> 00:07:18,990 Doar amintiți-vă că toate-l steaguri trebuie să vină de la sfârșitul 164 00:07:18,990 --> 00:07:20,770 cererii dumneavoastră clientului. 165 00:07:20,770 --> 00:07:22,300 >> Și asta e tot acolo este să-l. 166 00:07:22,300 --> 00:07:24,940 Când executați doar zăngănit pe unele fișiere, acest lucru este ceea ce este 167 00:07:24,940 --> 00:07:26,350 de fapt, a face. 168 00:07:26,350 --> 00:07:29,490 Numele meu este Rob Bowden, iar acest lucru este CS50.