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