[Powered by Google Translate] ROB Bowden: Anem a parlar dels compiladors.
Fins aquest punt, vostè acaba d'escriure seves fonts en
alguns arxius, els va enviar a través d'aquesta gran caixa negre que és
Clang, i surt l'arxiu executable que fa
exactament el que va escriure en el seu codi font.
Com màgica com la que ha estat, anem a prendre un tancador
mirar el que està succeint realment
Donat un arxiu.
Llavors, què significa això per compilar alguna cosa?
>> Doncs bé, en el sentit més general, només significa
codi transformar escrit en un
llenguatge de programació a un altre.
Però en general quan la gent diu de compilar alguna cosa,
significa que ho estan prenent d'una programació d'alt nivell
llenguatge a un llenguatge de programació de baix.
Aquests poden semblar termes molt subjectius.
Per exemple, és probable que no pensi en C com un alt
nivell de llenguatge de programació, però sí que és compilar.
Però tot és relatiu.
Com veurem, l'acoblament de codi màquina i eventualment
codi que es compila fins és sens dubte un nivell més baix
de C.
Tot i que utilitzarà Clang a la manifestació d'avui, un
Moltes de les idees aquí traslladen a altres compiladors.
>> Per Clang, hi ha quatre passos principals en el total
compilació.
Aquests són un, preprocessament realitzat pel preprocessador, dos,
compilació realitzada pel compilador, tres, muntatge
fet per l'assemblador, i quatre,
lligar fet pel enllaçador.
Pot ser confús que una de les subetapes de la global
Compiladors Clang es diu el compilador, però
arribarem a això.
Estarem usant un programa simple hola món com el nostre exemple
al llarg d'aquest vídeo.
Anem a fer una ullada.
>> El primer pas és el preprocessament.
Què fa el preprocessador fer?
En gairebé tots els programes C que hagis llegit o escrit,
que ha utilitzat les línies de codi que comencen amb un coixinet.
El trucaré hash, però també es pot dir lliures, nombre
signar, o agut.
Qualsevol línia tal és una directiva de preprocessador.
Vostè probablement ha vist # define i # include abans, però hi ha
diversos més que el preprocessador reconeix.
Anem a afegir un # defineix per al nostre exemple hello world.
Ara anem a executar únicament el preprocessador en aquest arxiu.
Amb l'aprovació de la bandera clage-E, que està instruint perquè s'executi
només el preprocessador.
Anem a veure què passa.
Sembla Clang només escup tot
en la línia d'ordres.
Per tal de salvar a tots d'aquesta sortida a un nou arxiu anomenat
hello2.c, anem a afegir> hello2.c al nostre comandament.
Ara donem una ullada al nostre arxiu preprocessat.
>> Whoa, què va passar amb el nostre programa poc curt?
Si ens anem tot el camí fins a la part inferior d'aquest arxiu, ja veurem
una part del codi que realment va escriure.
Observeu que el # defineix s'ha anat i totes les instàncies de nom
han estat reemplaçats amb exactament el que s'especifica en
la línia # defineix.
Llavors, què són totes aquestes definicions de tipus i declaracions de funcions
a la part superior de l'arxiu?
Observeu que el # defineix no va ser l'únic preprocessador
Directiva que s'especifica.
També hem # include stdio.h.
Així que totes les línies boges són en realitat stdio.h copiat
i s'enganxa a la part superior d'aquest arxiu.
És per això que els arxius de capçalera són tan útils per a la funció
declaracions.
En lloc d'haver de copiar i enganxar tot de la funció
declaracions que voleu utilitzar a la part superior del seu arxiu, els
preprocessador copiar i enganxar des de la capçalera
arxiu per a vostè.
>> Ara que hem acabat preprocessament, passem a
compilació.
La raó per la qual anomenem aquesta compilació pas és perquè es tracta d'
el pas on Clang realment fa la seva compilació de C a
ensamblat de codi.
Per tal de tenir Clang compilar un arxiu cap avall per al muntatge, però
no continuar més enllà, passar el S-bandera
en la línia d'ordres.
Anem a fer una ullada a l'assemblea
arxiu que s'emeten.
Sembla bastant un idioma diferent.
Codi assemblador és molt específic del processador.
En aquest cas, ja que l'aparell CS50 s'executa en un
processador x86 virtual, aquest és el codi assemblador x86.
Molt poques persones escriure directament en codi assemblador en aquests dies,
però cada programa en C Alguna vegada escriure es transforma cap avall
en el conjunt.
Un cop més, fem una crida aquest pas l'elaboració del C al conjunt de
ja que estem passant d'un nivell superior a un nivell inferior
llenguatge de programació.
>> El que fa a nivell de conjunt inferior de C?
Doncs bé, en conjunt, estem molt limitats en el que podem fer.
No hi ha si, al mateix temps, perquè és, o bucles de la classe.
Però vostè pot realitzar les mateixes coses que aquests controls
estructures ofereixen mitjançant les operacions limitades que
muntatge proporciona.
No obstant això, per veure fins a quin conjunt de nivell baix és en realitat, anem a
un pas més en la nostra recopilació, muntatge.
És el treball del muntador de transformar el codi en assemblador
en objecte o codi de màquina.
Recordeu que l'assemblador no ensamblat de sortida;
més aviat, es necessiten en el muntatge i sortides de codi màquina.
Codi màquina és l'actual 1 i 0 que una CPU pot
entendre, tot i que encara ens queda una mica de treball a l'esquerra
abans de poder executar el nostre programa.
Anem a muntar el nostre codi assemblador passant
Clang el c-bandera.
Ara anem a veure el que hi ha a l'arxiu de ensamblat.
>> Bé, això no ens ajuda molt.
Recordeu que el codi de màquina és dels uns i zeros que els
l'ordinador pot entendre.
Això no vol dir que sigui fàcil d'entendre per a nosaltres.
Llavors, què tan baix és el nivell d'acoblament?
És gairebé idèntic al codi objecte.
Passar d'assemblador a codi objecte és molt més que un
traducció d'una transformació, de manera
no es pot considerar que l'assemblador
fer qualsevol compilació actual.
De fet, és bastant fàcil de traduir manualment des
assemblador a codi màquina.
Quant a l'assemblea per a una funció principal, que la primera línia
succeeix per correspondre a 0x55 hexadecimals.
En binari, que és 1010101.
La segona línia passa a correspondre 0x895 hexadecimal.
I el proper 0x56,.
Donada una taula relativament simple, que podria traduir
ensamblat en el codi que les màquines poden comprendre també.
>> Així que hi ha un pas restant en
compilació, que està vinculant.
Vinculació combina un munt d'arxius d'objectes en un arxiu gran
que en realitat es pot executar.
La vinculació és molt dependent del sistema.
Així que la manera més fàcil d'obtenir Clang per vincular només objecte
arxius junts és cridar Clang en tots els arxius que els
desitja vincular junts.
Si especifiqueu. Arxius o, llavors no haurà de tornar a processar,
compilar i reunir tot el codi font.
Anem a llançar una funció matemàtica en el nostre fitxer, de manera que hem
alguna cosa per lligar-se polz
Ara anem a compilar de nou a codi objecte i
cridar Clang-hi.
Oops.
Ja que incloïa una funció matemàtica, hem de vincular a
la biblioteca matemàtica amb-lm.
>> Si volem enllaçar munt d'arxius. O que
escriure per nosaltres mateixos, ens tornaríem a especificar tots a la
línia d'ordres.
La restricció és que només un d'aquests arxius han
realment especificar la funció principal, o l'altre
executable resultant no sabria per on començar
executar el seu codi.
Quina és la diferència entre especificar un arxiu per enllaçar
amb-l i només especifiqueu un arxiu directament?
Res.
És que passa Clang saber exactament un arxiu
una mena-lm passa a referir.
Si sabés que arxiu vostè mateix, vostè podria especificar
explícitament.
Només recordeu que tot l banderes han de venir al final
de la demanda dels clients.
>> I això és tot el que cal fer.
Quan s'acaba d'executar Clang en alguns arxius, això és el que és
fent en realitat.
El meu nom és Rob Bowden, i això és CS50.