[Powered by Google Translate] ROB BOWDEN: Hai vorbim despre compilatoare. Până în acest moment, tocmai ați tastat codul sursă până în unele fișiere, le-a trimis prin intermediul acestui cutie neagră mare, care este Zăngănit, și iese fișierul executabil care face exact ceea ce ai scris în codul sursă. Ca magic ca a fost, am de gând să ia o mai strânsă uita-te la ceea ce se intampla de fapt atunci când am compila un fișier. Deci, ce înseamnă să compileze ceva? Ei bine, în sensul cel mai general, aceasta înseamnă doar Codul de transformarea scris într-un singur limbajul de programare la altul. Dar, de obicei, atunci când oamenii spun că compila ceva, ei înseamnă că îl iau de la un nivel mai ridicat de programare lingvistice la un limbaj de programare mai mic nivel. Acestea pot părea termeni foarte subiectivi. De exemplu, probabil că nu cred că a C ca un nivel ridicat limbaj de programare de nivel, dar tu nu-l compilați. Dar totul e relativ. După cum vom vedea, codul de asamblare și, eventual, mașină cod care am compila în jos pentru a este incontestabil un nivel inferior decât C. Deși vom folosi zăngănit în demonstrația de astăzi, o Multe dintre ideile de aici transporta pe la alte compilatoare. Pentru zăngănit, există patru etape majore în total compilare. Acestea sunt una, preprocesare făcut de preprocesor, două, compilarea face de către compilator, trei, asamblare efectuată de către asamblor, și patru, care leagă făcut de linker-ul. Ea poate fi confuz că una dintre cele substeps de ansamblu Compilatoare zăngănit este numit compilator, dar vom ajunge la asta. Vom fi cu ajutorul unui program simplu Salut lume ca exemplul nostru pe parcursul acestui videoclip. Să aruncăm o privire. Primul pas este de preprocesare. Ce face preprocesor face? În destul de mult fiecare program C care l-ai citit sau scris, ați folosit linii de cod care începe cu o hash. Voi numi hash, dar poate, de asemenea ea de lire sterline, numărul de inscriere, sau ascuțite. Orice astfel de linie este o directivă preprocesor. Probabil ați văzut # define # include și înainte, dar nu există Sunt mai multe care mai preprocesor recunoaște. Să adăugăm un # define la exemplul nostru Salut lume. Acum, haideți să rulați doar preprocesor privire la acest dosar. Prin trecerea de pavilion clage E-, esti instruindu-l pentru a rula doar preprocesor. Să vedem ce se întâmplă. Se pare ca zăngănit doar scuipa totul la linia de comandă. În scopul de a salva toate acestea ieșire la un nou fisier numit hello2.c, vom adăuga> hello2.c la comanda noastră. Acum, haideți să aruncăm o privire la dosarul nostru preprocesată. Uau, ce sa întâmplat cu programul nostru pic cam scurt? Dacă vom merge tot drumul până la partea de jos a acestui fișier, vom vedea o parte din cod pe care am scris de fapt. Observați că # define este plecat și a tuturor instanțelor de nume au fost înlocuite cu exact ceea ce am specificat în # define linie. Deci, ce sunt toate aceste typedefs și declarații de funcții în partea de sus a fișierului? Observați că # define nu a fost singurul preprocesor directivă pe care am specificat. De asemenea, am # include stdio.h. Deci, toate liniile de nebun sunt de fapt doar stdio.h copiat și lipit în partea de sus a acestui fișier. De aceea, fișierele header sunt atât de utile pentru funcția declarații. În loc de a fi nevoie să copiați și să lipiți toate functiei Declarațiile aveți de gând cu privire la utilizarea, la partea de sus a fișierului, în preprocesorul va copia și lipiți-le din antet dosar pentru tine. Acum că am terminat preprocesare, trecem pe compilare. Motivul numim aceasta compilatie pas este că acest lucru este pasul în cazul în care zăngănit de fapt, nu sa compilarea de la C la asamblare cod. Pentru a avea zăngănit întocmesc un dosar până la adunare, dar continua mai departe, să-l dați S-pavilion la linia de comandă. Să aruncăm o privire la ansamblul fișier care a fost emise. Se pare ca destul de o altă limbă. Codul de asamblare este foarte procesor specifică. În acest caz, deoarece aparatul CS50 rulează pe un procesor virtual x86, aceasta este codul de asamblare x86. Foarte puțini oameni scriu direct in cod de asamblare în aceste zile, dar fiecare program C scrii vreodată se transformă în jos în ansamblu. Din nou, noi numim acest pas compilarea C în ansamblul din moment ce suntem merge de la un nivel superior la un nivel inferior limbajul de programare. Ceea ce face ca nivelul de ansamblu mai mic decât C? Ei bine, în ansamblu, suntem foarte limitate în ceea ce putem face. Nu există în cazul în care lui, in timp ce, pentru bucle, sau de orice fel. Dar puteți realiza aceleasi lucruri ca acestea de control Structurile oferă utilizarea la operațiunile limitate de care asamblare nu oferă. Dar, pentru a vedea cât de asamblare nivel scăzut este într-adevăr, să mergem cu un pas mai departe în elaborarea de către noi, asamblare. E treaba de asamblare de a transforma codul de asamblare în obiect sau cod mașină. Amintiți-vă că nu asamblor de asamblare de ieșire; mai degrabă, este nevoie de cod în asamblare și mașină de ieșiri. Codul mașină este real 1 si 0, care poate fi un procesor înțelege, deși încă mai avem un pic de lucru stânga înainte de a putea rula programul nostru. Să asambla codul nostru de asamblare prin care trece Zăngănit c-pavilion. Acum, să vedem ce e în dosar asamblat. Ei bine, asta nu ne ajuta foarte mult. Amintiți-vă că mașina este codul de unu și zero care computerul poate înțelege. Asta nu înseamnă că e ușor pentru noi să înțelegem. Deci, exact cum este nivelul scăzut de asamblare? Este aproape identic cu codul obiect. Trecerea de la asamblare la cod obiect este mult mai mult de-o Traducere decât o transformare, care este motivul pentru care nu s-ar putea lua în considerare de asamblare a face orice real compilare. De fapt, e destul de ușor pentru a traduce manual din de asamblare în cod mașină. Privind la asamblare pentru o funcție principală, faptul că prima linie se întâmplă să corespundă 0x55 hexazecimale. În binar, asta e 1010101. A doua linie se întâmplă să corespundă 0x895 hexazecimal. Și 0x56 următor,. Având în vedere o masă relativ simplu, te-ar putea traduce de asamblare în cod care mașinile pot înțelege prea. Deci, nu e un pas rămasă în compilare, care se leagă. Legarea combină o grămadă de fișiere obiect într-un fișier mare pe care le poate executa de fapt. Legarea este foarte dependenta de sistem. Deci, cel mai simplu mod de a obține zăngănit de a lega doar obiect Fișierele împreună este de a apela zăngănit pe toate fișierele care doriți să legați împreună. Dacă specificați. Fișiere o, atunci nu va trebui să prelucreze din nou, compila, și să asambleze toate codul sursă. Să aruncăm o funcție matematică într-un fișier noastră, așa că avem ceva pentru a lega inch Acum, haideți să-l compilați înapoi la cod obiect și apel zăngănit pe ea. Hopa. Din moment ce am inclus o funcție matematică, avem nevoie pentru a lega în biblioteca matematica cu-LM. Dacă am vrut să unească o grămadă de fișiere. Că am scris pe cont propriu, am specificați-le pe toate la linia de comandă. Restricție este că doar unul dintre aceste fișiere trebuie să specifica de fapt o funcție principală, sau altceva executabil rezultat nu ar ști de unde să încep execută codul. Care este diferența dintre specificând un fișier pentru a lega în cu-l și specificând doar un fișier în mod direct? Nimic. E doar faptul că zăngănit se întâmplă să știu exact ce fișier ceva de genul-LM se întâmplă să se refere la. Dacă ai ști că fișierul tine, ai putea specifica în mod explicit. Doar amintiți-vă că toate-l steaguri trebuie să vină de la sfârșitul cererii dumneavoastră clientului. Și asta e tot acolo este să-l. Când executați doar zăngănit pe unele fișiere, acest lucru este ceea ce este de fapt, a face. Numele meu este Rob Bowden, iar acest lucru este CS50.