[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.