[Powered by Google Translate] ROB BOWDEN: Vamos a hablar de los compiladores.
Hasta este punto, usted acaba de escribir su código fuente en
algunos archivos, los envió a través de esta gran caja negro que es
Clang, y sale el archivo ejecutable que hace
exactamente lo que escribió en su código fuente.
Como mágica como la que ha sido, vamos a tomar un cerrador
mirar lo que está sucediendo realmente
cuando se compila un archivo.
Entonces, ¿qué significa eso para compilar algo?
>> Pues bien, en el sentido más general, sólo significa
código transformar escrito en uno
lenguaje de programación a otro.
Pero por lo general cuando la gente dice que compilar algo,
significa que lo están tomando de una programación de alto nivel
lenguaje a un lenguaje de programación de bajo.
Estos pueden parecer términos muy subjetivos.
Por ejemplo, es probable que no piense en C como un alto
nivel de lenguaje de programación, pero sí es compilarlo.
Pero todo es relativo.
Como veremos, el ensamblado de código máquina y eventualmente
código que se compila hasta es sin duda un nivel más bajo
de C.
A pesar de que va a utilizar Clang en la manifestación de hoy, un
Muchas de las ideas aquí trasladan a otros compiladores.
>> Para Clang, hay cuatro pasos principales en el total
compilación.
Estos son uno, preprocesamiento realizado por el preprocesador, dos,
compilación realizada por el compilador, tres, montaje
hecho por el ensamblador, y cuatro,
ligarse hecho por el enlazador.
Puede ser confuso que una de las subetapas de la global
Compiladores Clang se llama el compilador, pero
vamos a llegar a eso.
Vamos a estar usando un programa simple hola mundo como nuestro ejemplo
a lo largo de este vídeo.
Vamos a echar un vistazo.
>> El primer paso es el preprocesamiento.
¿Qué hace el preprocesador hacer?
En casi todos los programas C que hayas leído o escrito,
que ha utilizado las líneas de código que comienzan con una almohadilla.
Lo llamaré hash, pero también se le puede llamar libras, número
firmar, o agudo.
Cualquier línea tal es una directiva de preprocesador.
Usted probablemente ha visto # define y # include antes, pero hay
varios más que el preprocesador reconoce.
Vamos a añadir un # define para nuestro ejemplo hello world.
Ahora vamos a ejecutar únicamente el preprocesador en este archivo.
Con la aprobación de la bandera clage-E, que está instruyendo para que se ejecute
sólo el preprocesador.
Vamos a ver qué pasa.
Parece Clang sólo escupe todo
en la línea de comandos.
Con el fin de salvar a todos de esta salida a un nuevo archivo llamado
hello2.c, vamos a añadir> hello2.c a nuestro comando.
Ahora echemos un vistazo a nuestro archivo preprocesado.
>> Whoa, ¿qué pasó con nuestro programa poco corto?
Si nos vamos todo el camino hasta la parte inferior de este archivo, ya veremos
una parte del código que realmente escribió.
Observe que el # define se ha ido y todas las instancias de nombre
han sido reemplazados con exactamente lo que se especifica en
la línea # define.
Entonces, ¿qué son todas estas definiciones de tipo y declaraciones de funciones
en la parte superior del archivo?
Observe que el # define no fue el único preprocesador
Directiva que se especifica.
También hemos # include stdio.h.
Así que todas las líneas locas son en realidad stdio.h copiado
y se pega en la parte superior de este archivo.
Es por eso que los archivos de cabecera son tan útiles para la función
declaraciones.
En lugar de tener que copiar y pegar todo de la función
declaraciones que desee usar en la parte superior de su archivo, los
preprocesador copiar y pegar desde la cabecera
archivo para usted.
>> Ahora que hemos terminado preprocesamiento, pasamos a
compilación.
La razón por la que llamamos esta compilación paso es porque se trata de
el paso donde Clang realmente hace su compilación de C a
ensamblado de código.
Con el fin de tener Clang compilar un archivo hacia abajo para el montaje, pero
no continuar más allá, pasar el S-bandera
en la línea de comandos.
Vamos a echar un vistazo a la asamblea
archivo que se emiten.
Parece bastante un idioma diferente.
Código ensamblador es muy específico del procesador.
En este caso, ya que el aparato CS50 se ejecuta en un
procesador x86 virtual, este es el código ensamblador x86.
Muy pocas personas escribir directamente en código ensamblador en estos días,
pero cada programa en C ¿Alguna vez escribir se transforma hacia abajo
en el conjunto.
Una vez más, hacemos un llamado este paso la elaboración del C en el conjunto de
ya que estamos pasando de un nivel superior a un nivel inferior
lenguaje de programación.
>> Lo que hace a nivel de conjunto inferior de C?
Pues bien, en conjunto, estamos muy limitados en lo que podemos hacer.
No hay si, a la vez, porque es, o bucles de la clase.
Pero usted puede realizar las mismas cosas que estos controles
estructuras ofrecen mediante las operaciones limitadas que
montaje proporciona.
Sin embargo, para ver hasta qué conjunto de nivel bajo es en realidad, vamos a
un paso más en nuestra recopilación, montaje.
Es el trabajo del montador de transformar el código en ensamblador
en objeto o código de máquina.
Recuerde que el ensamblador no ensamblado de salida;
más bien, se necesitan en el montaje y salidas de código máquina.
Código máquina es el actual 1 y 0 que una CPU puede
entender, aunque todavía nos queda un poco de trabajo a la izquierda
antes de que podamos ejecutar nuestro programa.
Vamos a montar nuestro código ensamblador pasando
Clang el c-bandera.
Ahora vamos a ver lo que hay en el archivo de ensamblado.
>> Bueno, eso no nos ayuda mucho.
Recuerde que el código de máquina es los unos y ceros que los
su computadora puede entender.
Eso no quiere decir que sea fácil de entender para nosotros.
Entonces, ¿qué tan bajo es el nivel de ensamblado?
Es casi idéntico al código objeto.
Pasar de ensamblador a código objeto es mucho más que un
traducción de una transformación, por lo
no se puede considerar que el ensamblador
hacer cualquier compilación actual.
De hecho, es bastante fácil de traducir manualmente desde
ensamblador a código máquina.
En cuanto a la asamblea para una función principal, que la primera línea
sucede para corresponder a 0x55 hexadecimales.
En binario, que es 1010101.
La segunda línea pasa a corresponder 0x895 hexadecimal.
Y el próximo 0x56,.
Dada una tabla relativamente simple, que podría traducirse
ensamblado en el código que las máquinas pueden comprender también.
>> Así que hay un paso restante en
compilación, que está vinculando.
Vinculación combina un montón de archivos de objetos en un archivo grande
que en realidad se puede ejecutar.
La vinculación es muy dependiente del sistema.
Así que la manera más fácil de obtener Clang para vincular sólo objeto
archivos juntos es llamar Clang en todos los archivos que los
desea vincular juntos.
Si usted especifique. Archivos o, entonces no tendrá que volver a procesar,
compilar y reunir todo el código fuente.
Vamos a lanzar una función matemática en nuestro fichero, por lo que hemos
algo para ligarse pulg
Ahora vamos a compilar de nuevo a código objeto y
llamar Clang en él.
Oops.
Ya que incluía una función matemática, tenemos que vincular en
la biblioteca matemática con-lm.
>> Si queremos enlazar montón de archivos. O que
escribió por nosotros mismos, nos volveríamos a especificar todos a la
línea de comandos.
La restricción es que sólo uno de estos archivos deben
realmente especificar la función principal, o el otro
ejecutable resultante no sabría por dónde empezar
ejecutar su código.
¿Cuál es la diferencia entre especificar un archivo para enlazar
con-l y sólo se especifica un archivo directamente?
Nada.
Es que sucede Clang saber exactamente qué archivo
algo así como-lm pasa a referirse.
Si usted supiera que archivo usted mismo, usted podría especificar
explícitamente.
Sólo recuerde que todo l banderas tienen que venir al final
de la demanda de los clientes.
>> Y eso es todo lo que hay que hacer.
Cuando se acaba de ejecutar Clang en algunos archivos, esto es lo que es
haciendo en realidad.
Mi nombre es Rob Bowden, y esto es CS50.