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