[Powered by Google Translate] ROB BOWDEN: Imos falar sobre compiladores.
Ata este punto, que acaba de escribir o seu código fonte en
algúns arquivos, enviou-os por este gran caixa negra que é
Clang, e vén para fóra o seu arquivo executable que fai
exactamente o que escribiu no seu código fonte.
Tan máxico como que foi, imos ver máis de preto
ollar para o que está realmente a suceder
cando compilar un arquivo.
Entón, o que iso supón para compilar algo?
>> Ben, no sentido máis xeral, significa só que
transformando código escrito nunha
linguaxe de programación para outra.
Pero, xeralmente, cando as persoas din que compilar algo, eles
quere dicir que eles están tendo desde unha programación de nivel superior
linguaxe a un menor nivel de linguaxe de programación.
Estas poden parecer termos moi subxectivos.
Por exemplo, probablemente non pensa C como unha alta
linguaxe de nivel de programación, pero recompila-lo.
Pero é todo sobre.
Como veremos, o código de montaxe e, eventualmente, máquina
código que compilamos para abaixo é, innegablemente, un nivel máis baixo
que C.
Aínda que nós imos usar Clang en demostración de hoxe, un
Moitas das ideas aquí transitar para outros compiladores.
>> Para Clang, hai catro pasos importantes no global
compilación.
Estes son un pre-procesamento feito polo pre-procesador, dous,
de compilación realizado polo compilador, tres, montaxe
feito polo montador, e catro,
ligando feito polo linker.
Pode ser confuso que un dos sub-pasos de a global
Compiladores Clang chámase o compilador, pero
nós imos chegar a iso.
Nós estaremos usando un programa sinxelo Ola mundo como o noso exemplo
Durante este vídeo.
Imos dar un ollo.
>> O primeiro paso é o pre-procesamento.
O que fai o pre-procesador de facer?
En practicamente todos os programas C que xa leu ou escribir,
xa usou liñas de código que comezan cun hash.
Vou chamalo de hash, pero tamén pode chamalo de libras número,
asinar ou cortantes.
Calquera liña tal é unha directiva de pre-procesamento.
Probablemente xa viu # define e # include antes, pero hai
son outros que o pre-procesador recoñece.
Imos engadir un # define ao noso exemplo Ola mundo.
Agora imos executar só o pre-procesador neste arquivo.
Ao pasar a bandeira do E-CLAGE, está instruíndo-a executar
só o pre-procesador.
Imos ver o que acontece.
Parece que Clang só cospe todo
na liña de comandos.
A fin de salvar toda esa saída para un novo ficheiro chamado
hello2.c, imos engadir> hello2.c ao noso mando.
Agora imos dar un ollo ao noso arquivo pre-procesado.
>> Whoa, o que pasou co noso programa curto pouco?
Percorrer todo o camiño ata o fondo deste arquivo, imos ver
parte do código que realmente escribiu.
Teña en conta que o # define se foi e todas as instancias do nome
foron substituídos por exactamente o que especificado en
a liña # define.
Entón, o que son todas esas typedefs e declaracións de función
no cume do ficheiro?
Nótese que a definición # non foi só o pre-procesador
Directiva que especificou.
Temos tamén # include stdio.h.
Así, todas as liñas de tolos son realmente só stdio.h copiado
e pegado na parte superior do ficheiro.
É por iso que os ficheiros de cabeceira son tan útiles para a función
declaracións.
En vez de ter copiar e pegar todas as funcións
declaracións que planea utilizar na parte superior do seu arquivo, o
pre-procesador pode copiar e cola-los a partir da cabeceira
ficheiro para ti.
>> Agora que estamos a facer o pre-procesamento, pasamos
compilación.
A razón que chamamos esta compilación paso é porque este é
o paso onde Clang realmente fai a súa compilación de C para
código de montaxe.
Co fin de ter Clang de presentar un proceso para abaixo para a montaxe, pero
continuar sen máis, pasar a bandeira do S-
na liña de comandos.
Imos dar un ollo na montaxe
arquivo que foi emitido.
Parece moi unha lingua diferente.
Código de montaxe é moi procesador específico.
Neste caso, unha vez que o aparello CS50 é executado en un
procesador x86 virtual, que é o código de montaxe x86.
Moi poucas persoas escribindo directamente no código de montaxe nos días de hoxe,
pero cada programa en C escribe sempre se transforma para abaixo
en conxunto.
Unha vez máis, chamamos esta etapa de compilar C en assembly
unha vez que imos a partir dun nivel máis elevado para un nivel inferior
linguaxe de programación.
>> O que fai o nivel de montaxe inferior C?
Ben, en asemblea, estamos moi limitados no que podemos facer.
Non hai, si, mentres, por, ou lazos de calquera tipo.
Pero podes facer as mesmas cousas que eses controis
estruturas ofrecer usando as operacións limitadas que
montaxe fai prever.
Pero para ver como montaxe de nivel baixo realmente é, imos
un paso máis na nosa compilación, montaxe.
É o traballo do montador de converter o código de montaxe
en obxecto ou código de máquina.
Lembre que o montador non fai conxunto de saída;
ao contrario, ela leva na montaxe e código saídas máquina.
Código de máquina é o actual 1 e 0 que a CPU nunha lata
comprender, pero aínda temos un pouco de traballo deixaron
antes de que poidamos executar o noso programa.
Imos montar o noso código de montaxe, pasando
Clang bandeira do c.
Agora imos ver o que está no arquivo montado.
>> Ben, iso non nos axuda moito.
Lembre que o código de máquina é os uns e ceros que
o ordenador poida entender.
Iso non significa que é fácil para nós entendermos.
Así, exactamente como baixo nivel é montaxe?
É case idéntico ao código obxecto.
Indo de montaxe para código obxecto é moito máis dun
tradución do que unha transformación, é por iso que
non se pode considerar que o montador
facer compilación real.
En realidade, é moi doado de traducir a man a partir de
montaxe para código de máquina.
Mirando para a montaxe dunha función principal, que a primeira liña
pasa a corresponder a 0x55 hexadecimais.
No sistema binario, que é 1010101.
A segunda liña pasa a corresponder 0x895 hexadecimal.
E o seguinte, 0x56.
Dada unha táboa relativamente simple, podería traducir
montaxe no código que as máquinas poden entender tamén.
>> Polo tanto, hai unha etapa resto
de compilación, que está ligando.
Ligando combina unha morea de arquivos obxecto nun arquivo grande
que realmente pode facer.
Vinculación é moi dependente do sistema.
Entón, o xeito máis doado de obter Clang para só unha ligazón obxecto
arquivos xuntos é chamar Clang en todos os ficheiros que
quere vincular xuntos.
Se só se especifica. O arquivo, non será necesario reprocesando,
compilar e montar todo o seu código fonte.
Imos xogar unha función matemática no noso arquivo, polo que temos
algo de obrigar Pol
Agora imos recompila-lo de volta para o código obxecto e
chamar Clang sobre el.
Oops.
Dende que incluíu unha función matemática, cómpre vincular en
a biblioteca de matemáticas con LM.
>> Se queremos unir morea de arquivos. ¿Que
escribiu no noso propio, nós só especifica-los todos ao
liña de comandos.
A restrición é que un destes ficheiros debe
realmente especificar unha función principal, ou o
executable resultante non sabería por onde comezar
executar o seu código.
Cal é a diferenza entre especificar un ficheiro para vincular en
con l-e só especificar un arquivo directamente?
Nada.
É que acontece Clang saber exactamente o arquivo
algo así como-LM pasa a referirse.
Se soubese que o arquivo, podes especifica-lo
explicitamente.
Basta lembrar que todos os l bandeiras ten que vir ao final
da súa demanda do cliente.
>> E iso é todo o que existe para ela.
Cando só executar Clang en algúns arquivos, este é o que se
realmente facendo.
O meu nome é Rob Bowden, e este é o CS50.