1 00:00:07,200 --> 00:00:09,100 [Powered by Google Translate] ROB BOWDEN: Imos falar sobre compiladores. 2 00:00:09,100 --> 00:00:11,490 Ata este punto, que acaba de escribir o seu código fonte en 3 00:00:11,490 --> 00:00:14,260 algúns arquivos, enviou-os por este gran caixa negra que é 4 00:00:14,260 --> 00:00:16,890 Clang, e vén para fóra o seu arquivo executable que fai 5 00:00:16,890 --> 00:00:19,430 exactamente o que escribiu no seu código fonte. 6 00:00:19,430 --> 00:00:22,170 Tan máxico como que foi, imos ver máis de preto 7 00:00:22,170 --> 00:00:23,590 ollar para o que está realmente a suceder 8 00:00:23,590 --> 00:00:25,220 cando compilar un arquivo. 9 00:00:25,220 --> 00:00:28,580 Entón, o que iso supón para compilar algo? 10 00:00:28,580 --> 00:00:31,150 >> Ben, no sentido máis xeral, significa só que 11 00:00:31,150 --> 00:00:32,580 transformando código escrito nunha 12 00:00:32,580 --> 00:00:34,680 linguaxe de programación para outra. 13 00:00:34,680 --> 00:00:37,550 Pero, xeralmente, cando as persoas din que compilar algo, eles 14 00:00:37,550 --> 00:00:39,660 quere dicir que eles están tendo desde unha programación de nivel superior 15 00:00:39,660 --> 00:00:42,460 linguaxe a un menor nivel de linguaxe de programación. 16 00:00:42,460 --> 00:00:44,960 Estas poden parecer termos moi subxectivos. 17 00:00:44,960 --> 00:00:48,090 Por exemplo, probablemente non pensa C como unha alta 18 00:00:48,090 --> 00:00:51,440 linguaxe de nivel de programación, pero recompila-lo. 19 00:00:51,440 --> 00:00:52,730 Pero é todo sobre. 20 00:00:52,730 --> 00:00:55,790 Como veremos, o código de montaxe e, eventualmente, máquina 21 00:00:55,790 --> 00:00:59,270 código que compilamos para abaixo é, innegablemente, un nivel máis baixo 22 00:00:59,270 --> 00:01:00,700 que C. 23 00:01:00,700 --> 00:01:03,310 Aínda que nós imos usar Clang en demostración de hoxe, un 24 00:01:03,310 --> 00:01:06,360 Moitas das ideas aquí transitar para outros compiladores. 25 00:01:06,360 --> 00:01:09,160 >> Para Clang, hai catro pasos importantes no global 26 00:01:09,160 --> 00:01:10,200 compilación. 27 00:01:10,200 --> 00:01:15,430 Estes son un pre-procesamento feito polo pre-procesador, dous, 28 00:01:15,430 --> 00:01:19,530 de compilación realizado polo compilador, tres, montaxe 29 00:01:19,530 --> 00:01:22,010 feito polo montador, e catro, 30 00:01:22,010 --> 00:01:24,640 ligando feito polo linker. 31 00:01:24,640 --> 00:01:27,600 Pode ser confuso que un dos sub-pasos de a global 32 00:01:27,600 --> 00:01:30,980 Compiladores Clang chámase o compilador, pero 33 00:01:30,980 --> 00:01:32,530 nós imos chegar a iso. 34 00:01:32,530 --> 00:01:35,050 Nós estaremos usando un programa sinxelo Ola mundo como o noso exemplo 35 00:01:35,050 --> 00:01:36,270 Durante este vídeo. 36 00:01:36,270 --> 00:01:38,380 Imos dar un ollo. 37 00:01:38,380 --> 00:01:40,330 >> O primeiro paso é o pre-procesamento. 38 00:01:40,330 --> 00:01:42,520 O que fai o pre-procesador de facer? 39 00:01:42,520 --> 00:01:45,560 En practicamente todos os programas C que xa leu ou escribir, 40 00:01:45,560 --> 00:01:48,310 xa usou liñas de código que comezan cun hash. 41 00:01:48,310 --> 00:01:51,730 Vou chamalo de hash, pero tamén pode chamalo de libras número, 42 00:01:51,730 --> 00:01:53,280 asinar ou cortantes. 43 00:01:53,280 --> 00:01:56,840 Calquera liña tal é unha directiva de pre-procesamento. 44 00:01:56,840 --> 00:02:00,650 Probablemente xa viu # define e # include antes, pero hai 45 00:02:00,650 --> 00:02:03,690 son outros que o pre-procesador recoñece. 46 00:02:03,690 --> 00:02:07,340 Imos engadir un # define ao noso exemplo Ola mundo. 47 00:02:07,340 --> 00:02:11,690 Agora imos executar só o pre-procesador neste arquivo. 48 00:02:11,690 --> 00:02:16,150 Ao pasar a bandeira do E-CLAGE, está instruíndo-a executar 49 00:02:16,150 --> 00:02:17,880 só o pre-procesador. 50 00:02:17,880 --> 00:02:19,130 Imos ver o que acontece. 51 00:02:22,250 --> 00:02:24,020 Parece que Clang só cospe todo 52 00:02:24,020 --> 00:02:25,200 na liña de comandos. 53 00:02:25,200 --> 00:02:27,800 A fin de salvar toda esa saída para un novo ficheiro chamado 54 00:02:27,800 --> 00:02:33,850 hello2.c, imos engadir> hello2.c ao noso mando. 55 00:02:33,850 --> 00:02:37,800 Agora imos dar un ollo ao noso arquivo pre-procesado. 56 00:02:37,800 --> 00:02:40,810 >> Whoa, o que pasou co noso programa curto pouco? 57 00:02:40,810 --> 00:02:43,890 Percorrer todo o camiño ata o fondo deste arquivo, imos ver 58 00:02:43,890 --> 00:02:46,070 parte do código que realmente escribiu. 59 00:02:46,070 --> 00:02:49,800 Teña en conta que o # define se foi e todas as instancias do nome 60 00:02:49,800 --> 00:02:51,950 foron substituídos por exactamente o que especificado en 61 00:02:51,950 --> 00:02:53,590 a liña # define. 62 00:02:53,590 --> 00:02:56,530 Entón, o que son todas esas typedefs e declaracións de función 63 00:02:56,530 --> 00:02:58,140 no cume do ficheiro? 64 00:02:58,140 --> 00:03:00,820 Nótese que a definición # non foi só o pre-procesador 65 00:03:00,820 --> 00:03:02,390 Directiva que especificou. 66 00:03:02,390 --> 00:03:05,280 Temos tamén # include stdio.h. 67 00:03:05,280 --> 00:03:09,560 Así, todas as liñas de tolos son realmente só stdio.h copiado 68 00:03:09,560 --> 00:03:11,810 e pegado na parte superior do ficheiro. 69 00:03:11,810 --> 00:03:14,110 É por iso que os ficheiros de cabeceira son tan útiles para a función 70 00:03:14,110 --> 00:03:15,160 declaracións. 71 00:03:15,160 --> 00:03:17,740 En vez de ter copiar e pegar todas as funcións 72 00:03:17,740 --> 00:03:21,050 declaracións que planea utilizar na parte superior do seu arquivo, o 73 00:03:21,050 --> 00:03:22,990 pre-procesador pode copiar e cola-los a partir da cabeceira 74 00:03:22,990 --> 00:03:24,140 ficheiro para ti. 75 00:03:24,140 --> 00:03:26,480 >> Agora que estamos a facer o pre-procesamento, pasamos 76 00:03:26,480 --> 00:03:27,680 compilación. 77 00:03:27,680 --> 00:03:30,725 A razón que chamamos esta compilación paso é porque este é 78 00:03:30,725 --> 00:03:34,130 o paso onde Clang realmente fai a súa compilación de C para 79 00:03:34,130 --> 00:03:35,370 código de montaxe. 80 00:03:35,370 --> 00:03:38,280 Co fin de ter Clang de presentar un proceso para abaixo para a montaxe, pero 81 00:03:38,280 --> 00:03:42,030 continuar sen máis, pasar a bandeira do S- 82 00:03:42,030 --> 00:03:43,560 na liña de comandos. 83 00:03:43,560 --> 00:03:44,790 Imos dar un ollo na montaxe 84 00:03:44,790 --> 00:03:47,390 arquivo que foi emitido. 85 00:03:47,390 --> 00:03:49,740 Parece moi unha lingua diferente. 86 00:03:49,740 --> 00:03:52,660 Código de montaxe é moi procesador específico. 87 00:03:52,660 --> 00:03:55,440 Neste caso, unha vez que o aparello CS50 é executado en un 88 00:03:55,440 --> 00:04:00,470 procesador x86 virtual, que é o código de montaxe x86. 89 00:04:00,470 --> 00:04:03,450 Moi poucas persoas escribindo directamente no código de montaxe nos días de hoxe, 90 00:04:03,450 --> 00:04:06,490 pero cada programa en C escribe sempre se transforma para abaixo 91 00:04:06,490 --> 00:04:07,940 en conxunto. 92 00:04:07,940 --> 00:04:11,440 Unha vez máis, chamamos esta etapa de compilar C en assembly 93 00:04:11,440 --> 00:04:14,170 unha vez que imos a partir dun nivel máis elevado para un nivel inferior 94 00:04:14,170 --> 00:04:15,480 linguaxe de programación. 95 00:04:15,480 --> 00:04:17,880 >> O que fai o nivel de montaxe inferior C? 96 00:04:17,880 --> 00:04:21,660 Ben, en asemblea, estamos moi limitados no que podemos facer. 97 00:04:21,660 --> 00:04:25,120 Non hai, si, mentres, por, ou lazos de calquera tipo. 98 00:04:25,120 --> 00:04:27,560 Pero podes facer as mesmas cousas que eses controis 99 00:04:27,560 --> 00:04:30,270 estruturas ofrecer usando as operacións limitadas que 100 00:04:30,270 --> 00:04:32,350 montaxe fai prever. 101 00:04:32,350 --> 00:04:35,960 Pero para ver como montaxe de nivel baixo realmente é, imos 102 00:04:35,960 --> 00:04:39,320 un paso máis na nosa compilación, montaxe. 103 00:04:39,320 --> 00:04:41,890 É o traballo do montador de converter o código de montaxe 104 00:04:41,890 --> 00:04:44,740 en obxecto ou código de máquina. 105 00:04:44,740 --> 00:04:47,610 Lembre que o montador non fai conxunto de saída; 106 00:04:47,610 --> 00:04:51,080 ao contrario, ela leva na montaxe e código saídas máquina. 107 00:04:51,080 --> 00:04:54,040 Código de máquina é o actual 1 e 0 que a CPU nunha lata 108 00:04:54,040 --> 00:04:57,290 comprender, pero aínda temos un pouco de traballo deixaron 109 00:04:57,290 --> 00:04:59,380 antes de que poidamos executar o noso programa. 110 00:04:59,380 --> 00:05:01,400 Imos montar o noso código de montaxe, pasando 111 00:05:01,400 --> 00:05:04,080 Clang bandeira do c. 112 00:05:04,080 --> 00:05:06,410 Agora imos ver o que está no arquivo montado. 113 00:05:06,410 --> 00:05:09,220 >> Ben, iso non nos axuda moito. 114 00:05:09,220 --> 00:05:11,340 Lembre que o código de máquina é os uns e ceros que 115 00:05:11,340 --> 00:05:13,240 o ordenador poida entender. 116 00:05:13,240 --> 00:05:16,080 Iso non significa que é fácil para nós entendermos. 117 00:05:16,080 --> 00:05:19,160 Así, exactamente como baixo nivel é montaxe? 118 00:05:19,160 --> 00:05:21,480 É case idéntico ao código obxecto. 119 00:05:21,480 --> 00:05:24,300 Indo de montaxe para código obxecto é moito máis dun 120 00:05:24,300 --> 00:05:27,540 tradución do que unha transformación, é por iso que 121 00:05:27,540 --> 00:05:29,310 non se pode considerar que o montador 122 00:05:29,310 --> 00:05:31,400 facer compilación real. 123 00:05:31,400 --> 00:05:34,110 En realidade, é moi doado de traducir a man a partir de 124 00:05:34,110 --> 00:05:36,050 montaxe para código de máquina. 125 00:05:36,050 --> 00:05:39,040 Mirando para a montaxe dunha función principal, que a primeira liña 126 00:05:39,040 --> 00:05:42,100 pasa a corresponder a 0x55 hexadecimais. 127 00:05:42,100 --> 00:05:45,470 No sistema binario, que é 1010101. 128 00:05:45,470 --> 00:05:49,300 A segunda liña pasa a corresponder 0x895 hexadecimal. 129 00:05:49,300 --> 00:05:51,290 E o seguinte, 0x56. 130 00:05:51,290 --> 00:05:53,730 Dada unha táboa relativamente simple, podería traducir 131 00:05:53,730 --> 00:05:57,130 montaxe no código que as máquinas poden entender tamén. 132 00:05:57,130 --> 00:05:58,810 >> Polo tanto, hai unha etapa resto 133 00:05:58,810 --> 00:06:01,150 de compilación, que está ligando. 134 00:06:01,150 --> 00:06:04,530 Ligando combina unha morea de arquivos obxecto nun arquivo grande 135 00:06:04,530 --> 00:06:06,380 que realmente pode facer. 136 00:06:06,380 --> 00:06:08,570 Vinculación é moi dependente do sistema. 137 00:06:08,570 --> 00:06:11,030 Entón, o xeito máis doado de obter Clang para só unha ligazón obxecto 138 00:06:11,030 --> 00:06:13,920 arquivos xuntos é chamar Clang en todos os ficheiros que 139 00:06:13,920 --> 00:06:15,190 quere vincular xuntos. 140 00:06:15,190 --> 00:06:18,740 Se só se especifica. O arquivo, non será necesario reprocesando, 141 00:06:18,740 --> 00:06:21,680 compilar e montar todo o seu código fonte. 142 00:06:21,680 --> 00:06:23,960 Imos xogar unha función matemática no noso arquivo, polo que temos 143 00:06:23,960 --> 00:06:25,210 algo de obrigar Pol 144 00:06:34,220 --> 00:06:37,010 Agora imos recompila-lo de volta para o código obxecto e 145 00:06:37,010 --> 00:06:38,260 chamar Clang sobre el. 146 00:06:40,560 --> 00:06:41,420 Oops. 147 00:06:41,420 --> 00:06:43,790 Dende que incluíu unha función matemática, cómpre vincular en 148 00:06:43,790 --> 00:06:46,610 a biblioteca de matemáticas con LM. 149 00:06:46,610 --> 00:06:48,990 >> Se queremos unir morea de arquivos. ¿Que 150 00:06:48,990 --> 00:06:51,420 escribiu no noso propio, nós só especifica-los todos ao 151 00:06:51,420 --> 00:06:52,460 liña de comandos. 152 00:06:52,460 --> 00:06:55,320 A restrición é que un destes ficheiros debe 153 00:06:55,320 --> 00:06:57,790 realmente especificar unha función principal, ou o 154 00:06:57,790 --> 00:06:59,930 executable resultante non sabería por onde comezar 155 00:06:59,930 --> 00:07:00,910 executar o seu código. 156 00:07:00,910 --> 00:07:03,360 Cal é a diferenza entre especificar un ficheiro para vincular en 157 00:07:03,360 --> 00:07:06,600 con l-e só especificar un arquivo directamente? 158 00:07:06,600 --> 00:07:07,440 Nada. 159 00:07:07,440 --> 00:07:09,850 É que acontece Clang saber exactamente o arquivo 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 Se soubese que o arquivo, podes especifica-lo 162 00:07:14,700 --> 00:07:15,930 explicitamente. 163 00:07:15,930 --> 00:07:18,990 Basta lembrar que todos os l bandeiras ten que vir ao final 164 00:07:18,990 --> 00:07:20,770 da súa demanda do cliente. 165 00:07:20,770 --> 00:07:22,300 >> E iso é todo o que existe para ela. 166 00:07:22,300 --> 00:07:24,940 Cando só executar Clang en algúns arquivos, este é o que se 167 00:07:24,940 --> 00:07:26,350 realmente facendo. 168 00:07:26,350 --> 00:07:29,490 O meu nome é Rob Bowden, e este é o CS50.