1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB BOWDEN: Vamos a hablar de los compiladores. 2 00:00:09,100 --> 00:00:11,490 Hasta este punto, usted acaba de escribir su código fuente en 3 00:00:11,490 --> 00:00:14,260 algunos archivos, los envió a través de esta gran caja negro que es 4 00:00:14,260 --> 00:00:16,890 Clang, y sale el archivo ejecutable que hace 5 00:00:16,890 --> 00:00:19,430 exactamente lo que escribió en su código fuente. 6 00:00:19,430 --> 00:00:22,170 Como mágica como la que ha sido, vamos a tomar un cerrador 7 00:00:22,170 --> 00:00:23,590 mirar lo que está sucediendo realmente 8 00:00:23,590 --> 00:00:25,220 cuando se compila un archivo. 9 00:00:25,220 --> 00:00:28,580 Entonces, ¿qué significa eso para compilar algo? 10 00:00:28,580 --> 00:00:31,150 >> Pues bien, en el sentido más general, sólo significa 11 00:00:31,150 --> 00:00:32,580 código transformar escrito en uno 12 00:00:32,580 --> 00:00:34,680 lenguaje de programación a otro. 13 00:00:34,680 --> 00:00:37,550 Pero por lo general cuando la gente dice que compilar algo, 14 00:00:37,550 --> 00:00:39,660 significa que lo están tomando de una programación de alto nivel 15 00:00:39,660 --> 00:00:42,460 lenguaje a un lenguaje de programación de bajo. 16 00:00:42,460 --> 00:00:44,960 Estos pueden parecer términos muy subjetivos. 17 00:00:44,960 --> 00:00:48,090 Por ejemplo, es probable que no piense en C como un alto 18 00:00:48,090 --> 00:00:51,440 nivel de lenguaje de programación, pero sí es compilarlo. 19 00:00:51,440 --> 00:00:52,730 Pero todo es relativo. 20 00:00:52,730 --> 00:00:55,790 Como veremos, el ensamblado de código máquina y eventualmente 21 00:00:55,790 --> 00:00:59,270 código que se compila hasta es sin duda un nivel más bajo 22 00:00:59,270 --> 00:01:00,700 de C. 23 00:01:00,700 --> 00:01:03,310 A pesar de que va a utilizar Clang en la manifestación de hoy, un 24 00:01:03,310 --> 00:01:06,360 Muchas de las ideas aquí trasladan a otros compiladores. 25 00:01:06,360 --> 00:01:09,160 >> Para Clang, hay cuatro pasos principales en el total 26 00:01:09,160 --> 00:01:10,200 compilación. 27 00:01:10,200 --> 00:01:15,430 Estos son uno, preprocesamiento realizado por el preprocesador, dos, 28 00:01:15,430 --> 00:01:19,530 compilación realizada por el compilador, tres, montaje 29 00:01:19,530 --> 00:01:22,010 hecho por el ensamblador, y cuatro, 30 00:01:22,010 --> 00:01:24,640 ligarse hecho por el enlazador. 31 00:01:24,640 --> 00:01:27,600 Puede ser confuso que una de las subetapas de la global 32 00:01:27,600 --> 00:01:30,980 Compiladores Clang se llama el compilador, pero 33 00:01:30,980 --> 00:01:32,530 vamos a llegar a eso. 34 00:01:32,530 --> 00:01:35,050 Vamos a estar usando un programa simple hola mundo como nuestro ejemplo 35 00:01:35,050 --> 00:01:36,270 a lo largo de este vídeo. 36 00:01:36,270 --> 00:01:38,380 Vamos a echar un vistazo. 37 00:01:38,380 --> 00:01:40,330 >> El primer paso es el preprocesamiento. 38 00:01:40,330 --> 00:01:42,520 ¿Qué hace el preprocesador hacer? 39 00:01:42,520 --> 00:01:45,560 En casi todos los programas C que hayas leído o escrito, 40 00:01:45,560 --> 00:01:48,310 que ha utilizado las líneas de código que comienzan con una almohadilla. 41 00:01:48,310 --> 00:01:51,730 Lo llamaré hash, pero también se le puede llamar libras, número 42 00:01:51,730 --> 00:01:53,280 firmar, o agudo. 43 00:01:53,280 --> 00:01:56,840 Cualquier línea tal es una directiva de preprocesador. 44 00:01:56,840 --> 00:02:00,650 Usted probablemente ha visto # define y # include antes, pero hay 45 00:02:00,650 --> 00:02:03,690 varios más que el preprocesador reconoce. 46 00:02:03,690 --> 00:02:07,340 Vamos a añadir un # define para nuestro ejemplo hello world. 47 00:02:07,340 --> 00:02:11,690 Ahora vamos a ejecutar únicamente el preprocesador en este archivo. 48 00:02:11,690 --> 00:02:16,150 Con la aprobación de la bandera clage-E, que está instruyendo para que se ejecute 49 00:02:16,150 --> 00:02:17,880 sólo el preprocesador. 50 00:02:17,880 --> 00:02:19,130 Vamos a ver qué pasa. 51 00:02:22,250 --> 00:02:24,020 Parece Clang sólo escupe todo 52 00:02:24,020 --> 00:02:25,200 en la línea de comandos. 53 00:02:25,200 --> 00:02:27,800 Con el fin de salvar a todos de esta salida a un nuevo archivo llamado 54 00:02:27,800 --> 00:02:33,850 hello2.c, vamos a añadir> hello2.c a nuestro comando. 55 00:02:33,850 --> 00:02:37,800 Ahora echemos un vistazo a nuestro archivo preprocesado. 56 00:02:37,800 --> 00:02:40,810 >> Whoa, ¿qué pasó con nuestro programa poco corto? 57 00:02:40,810 --> 00:02:43,890 Si nos vamos todo el camino hasta la parte inferior de este archivo, ya veremos 58 00:02:43,890 --> 00:02:46,070 una parte del código que realmente escribió. 59 00:02:46,070 --> 00:02:49,800 Observe que el # define se ha ido y todas las instancias de nombre 60 00:02:49,800 --> 00:02:51,950 han sido reemplazados con exactamente lo que se especifica en 61 00:02:51,950 --> 00:02:53,590 la línea # define. 62 00:02:53,590 --> 00:02:56,530 Entonces, ¿qué son todas estas definiciones de tipo y declaraciones de funciones 63 00:02:56,530 --> 00:02:58,140 en la parte superior del archivo? 64 00:02:58,140 --> 00:03:00,820 Observe que el # define no fue el único preprocesador 65 00:03:00,820 --> 00:03:02,390 Directiva que se especifica. 66 00:03:02,390 --> 00:03:05,280 También hemos # include stdio.h. 67 00:03:05,280 --> 00:03:09,560 Así que todas las líneas locas son en realidad stdio.h copiado 68 00:03:09,560 --> 00:03:11,810 y se pega en la parte superior de este archivo. 69 00:03:11,810 --> 00:03:14,110 Es por eso que los archivos de cabecera son tan útiles para la función 70 00:03:14,110 --> 00:03:15,160 declaraciones. 71 00:03:15,160 --> 00:03:17,740 En lugar de tener que copiar y pegar todo de la función 72 00:03:17,740 --> 00:03:21,050 declaraciones que desee usar en la parte superior de su archivo, los 73 00:03:21,050 --> 00:03:22,990 preprocesador copiar y pegar desde la cabecera 74 00:03:22,990 --> 00:03:24,140 archivo para usted. 75 00:03:24,140 --> 00:03:26,480 >> Ahora que hemos terminado preprocesamiento, pasamos a 76 00:03:26,480 --> 00:03:27,680 compilación. 77 00:03:27,680 --> 00:03:30,725 La razón por la que llamamos esta compilación paso es porque se trata de 78 00:03:30,725 --> 00:03:34,130 el paso donde Clang realmente hace su compilación de C a 79 00:03:34,130 --> 00:03:35,370 ensamblado de código. 80 00:03:35,370 --> 00:03:38,280 Con el fin de tener Clang compilar un archivo hacia abajo para el montaje, pero 81 00:03:38,280 --> 00:03:42,030 no continuar más allá, pasar el S-bandera 82 00:03:42,030 --> 00:03:43,560 en la línea de comandos. 83 00:03:43,560 --> 00:03:44,790 Vamos a echar un vistazo a la asamblea 84 00:03:44,790 --> 00:03:47,390 archivo que se emiten. 85 00:03:47,390 --> 00:03:49,740 Parece bastante un idioma diferente. 86 00:03:49,740 --> 00:03:52,660 Código ensamblador es muy específico del procesador. 87 00:03:52,660 --> 00:03:55,440 En este caso, ya que el aparato CS50 se ejecuta en un 88 00:03:55,440 --> 00:04:00,470 procesador x86 virtual, este es el código ensamblador x86. 89 00:04:00,470 --> 00:04:03,450 Muy pocas personas escribir directamente en código ensamblador en estos días, 90 00:04:03,450 --> 00:04:06,490 pero cada programa en C ¿Alguna vez escribir se transforma hacia abajo 91 00:04:06,490 --> 00:04:07,940 en el conjunto. 92 00:04:07,940 --> 00:04:11,440 Una vez más, hacemos un llamado este paso la elaboración del C en el conjunto de 93 00:04:11,440 --> 00:04:14,170 ya que estamos pasando de un nivel superior a un nivel inferior 94 00:04:14,170 --> 00:04:15,480 lenguaje de programación. 95 00:04:15,480 --> 00:04:17,880 >> Lo que hace a nivel de conjunto inferior de C? 96 00:04:17,880 --> 00:04:21,660 Pues bien, en conjunto, estamos muy limitados en lo que podemos hacer. 97 00:04:21,660 --> 00:04:25,120 No hay si, a la vez, porque es, o bucles de la clase. 98 00:04:25,120 --> 00:04:27,560 Pero usted puede realizar las mismas cosas que estos controles 99 00:04:27,560 --> 00:04:30,270 estructuras ofrecen mediante las operaciones limitadas que 100 00:04:30,270 --> 00:04:32,350 montaje proporciona. 101 00:04:32,350 --> 00:04:35,960 Sin embargo, para ver hasta qué conjunto de nivel bajo es en realidad, vamos a 102 00:04:35,960 --> 00:04:39,320 un paso más en nuestra recopilación, montaje. 103 00:04:39,320 --> 00:04:41,890 Es el trabajo del montador de transformar el código en ensamblador 104 00:04:41,890 --> 00:04:44,740 en objeto o código de máquina. 105 00:04:44,740 --> 00:04:47,610 Recuerde que el ensamblador no ensamblado de salida; 106 00:04:47,610 --> 00:04:51,080 más bien, se necesitan en el montaje y salidas de código máquina. 107 00:04:51,080 --> 00:04:54,040 Código máquina es el actual 1 y 0 que una CPU puede 108 00:04:54,040 --> 00:04:57,290 entender, aunque todavía nos queda un poco de trabajo a la izquierda 109 00:04:57,290 --> 00:04:59,380 antes de que podamos ejecutar nuestro programa. 110 00:04:59,380 --> 00:05:01,400 Vamos a montar nuestro código ensamblador pasando 111 00:05:01,400 --> 00:05:04,080 Clang el c-bandera. 112 00:05:04,080 --> 00:05:06,410 Ahora vamos a ver lo que hay en el archivo de ensamblado. 113 00:05:06,410 --> 00:05:09,220 >> Bueno, eso no nos ayuda mucho. 114 00:05:09,220 --> 00:05:11,340 Recuerde que el código de máquina es los unos y ceros que los 115 00:05:11,340 --> 00:05:13,240 su computadora puede entender. 116 00:05:13,240 --> 00:05:16,080 Eso no quiere decir que sea fácil de entender para nosotros. 117 00:05:16,080 --> 00:05:19,160 Entonces, ¿qué tan bajo es el nivel de ensamblado? 118 00:05:19,160 --> 00:05:21,480 Es casi idéntico al código objeto. 119 00:05:21,480 --> 00:05:24,300 Pasar de ensamblador a código objeto es mucho más que un 120 00:05:24,300 --> 00:05:27,540 traducción de una transformación, por lo 121 00:05:27,540 --> 00:05:29,310 no se puede considerar que el ensamblador 122 00:05:29,310 --> 00:05:31,400 hacer cualquier compilación actual. 123 00:05:31,400 --> 00:05:34,110 De hecho, es bastante fácil de traducir manualmente desde 124 00:05:34,110 --> 00:05:36,050 ensamblador a código máquina. 125 00:05:36,050 --> 00:05:39,040 En cuanto a la asamblea para una función principal, que la primera línea 126 00:05:39,040 --> 00:05:42,100 sucede para corresponder a 0x55 hexadecimales. 127 00:05:42,100 --> 00:05:45,470 En binario, que es 1010101. 128 00:05:45,470 --> 00:05:49,300 La segunda línea pasa a corresponder 0x895 hexadecimal. 129 00:05:49,300 --> 00:05:51,290 Y el próximo 0x56,. 130 00:05:51,290 --> 00:05:53,730 Dada una tabla relativamente simple, que podría traducirse 131 00:05:53,730 --> 00:05:57,130 ensamblado en el código que las máquinas pueden comprender también. 132 00:05:57,130 --> 00:05:58,810 >> Así que hay un paso restante en 133 00:05:58,810 --> 00:06:01,150 compilación, que está vinculando. 134 00:06:01,150 --> 00:06:04,530 Vinculación combina un montón de archivos de objetos en un archivo grande 135 00:06:04,530 --> 00:06:06,380 que en realidad se puede ejecutar. 136 00:06:06,380 --> 00:06:08,570 La vinculación es muy dependiente del sistema. 137 00:06:08,570 --> 00:06:11,030 Así que la manera más fácil de obtener Clang para vincular sólo objeto 138 00:06:11,030 --> 00:06:13,920 archivos juntos es llamar Clang en todos los archivos que los 139 00:06:13,920 --> 00:06:15,190 desea vincular juntos. 140 00:06:15,190 --> 00:06:18,740 Si usted especifique. Archivos o, entonces no tendrá que volver a procesar, 141 00:06:18,740 --> 00:06:21,680 compilar y reunir todo el código fuente. 142 00:06:21,680 --> 00:06:23,960 Vamos a lanzar una función matemática en nuestro fichero, por lo que hemos 143 00:06:23,960 --> 00:06:25,210 algo para ligarse pulg 144 00:06:34,220 --> 00:06:37,010 Ahora vamos a compilar de nuevo a código objeto y 145 00:06:37,010 --> 00:06:38,260 llamar Clang en él. 146 00:06:40,560 --> 00:06:41,420 Oops. 147 00:06:41,420 --> 00:06:43,790 Ya que incluía una función matemática, tenemos que vincular en 148 00:06:43,790 --> 00:06:46,610 la biblioteca matemática con-lm. 149 00:06:46,610 --> 00:06:48,990 >> Si queremos enlazar montón de archivos. O que 150 00:06:48,990 --> 00:06:51,420 escribió por nosotros mismos, nos volveríamos a especificar todos a la 151 00:06:51,420 --> 00:06:52,460 línea de comandos. 152 00:06:52,460 --> 00:06:55,320 La restricción es que sólo uno de estos archivos deben 153 00:06:55,320 --> 00:06:57,790 realmente especificar la función principal, o el otro 154 00:06:57,790 --> 00:06:59,930 ejecutable resultante no sabría por dónde empezar 155 00:06:59,930 --> 00:07:00,910 ejecutar su código. 156 00:07:00,910 --> 00:07:03,360 ¿Cuál es la diferencia entre especificar un archivo para enlazar 157 00:07:03,360 --> 00:07:06,600 con-l y sólo se especifica un archivo directamente? 158 00:07:06,600 --> 00:07:07,440 Nada. 159 00:07:07,440 --> 00:07:09,850 Es que sucede Clang saber exactamente qué archivo 160 00:07:09,850 --> 00:07:12,560 algo así como-lm pasa a referirse. 161 00:07:12,560 --> 00:07:14,700 Si usted supiera que archivo usted mismo, usted podría especificar 162 00:07:14,700 --> 00:07:15,930 explícitamente. 163 00:07:15,930 --> 00:07:18,990 Sólo recuerde que todo l banderas tienen que venir al final 164 00:07:18,990 --> 00:07:20,770 de la demanda de los clientes. 165 00:07:20,770 --> 00:07:22,300 >> Y eso es todo lo que hay que hacer. 166 00:07:22,300 --> 00:07:24,940 Cuando se acaba de ejecutar Clang en algunos archivos, esto es lo que es 167 00:07:24,940 --> 00:07:26,350 haciendo en realidad. 168 00:07:26,350 --> 00:07:29,490 Mi nombre es Rob Bowden, y esto es CS50.