« As leis de Murphy aplicadas aos homens. | Entrada | Este rato mata-me! »

abril 13, 2005

A pedido de várias famílias: como funciona um compilador

Ontem, no aniversário do afixe, escrevi um texto em que escrevia o programa de aniversário. Devido às várias questões que foram colocadas, resolvi dar uma explicação mais alargada sobre o assunto, explicando

Como funciona um compilador

Um compilador pode ser definido como um programa que tem como entrada um ficheiro escrito num código fonte e tem como saída um ficheiro escrito núm código objecto, podendo neste processo gerar mensagens de erro.

compil.jpg

O compilador é composto por duas fases:
Análise, composta por:
- Análise léxica;
- Análise sintáctica;
- Análise semântica;
Geração de saída, que comporta:
- Geração de código;
- Optimização de código.

A análise léxica resulta de uma análise linear do código fonte, agrupando os caracteres em sequências com um determinado significado, designados por tokens.
Por exemplo, na seguinte instrução:
y = x + 'a';

Temos os seguintes tokens:
- identificador 'y';
- símbolo de atribuição '=';
- identificador 'x';
- sinal '+';
- carácter 'a';
- símbolo de terminação ';'.

Na análise sintáctica faz-se o agrupamento hierárquico dos tokens, usando regras recursivas. Pode-se definir uma expressão recursivamente:
- um identificador é uma expressão;
- um número é um expressão;
- se e1 e e2 são expressões, então e1 + e2, e1 * e2, (e1) também são expressões.

Na imagem seguinte pode-se ver a ideia abstracta de uma árvore sintáctica.

analsint.jpg

Chega então a fase da análise semântica, onde se verifica se a forma como os tokens foram associados hierarquicamente faz sentido e também a verificação de tipos. Por exemplo, antes de se somar a variável x com o carácter 'a', este tem de ser transformado num número do mesmo tipo da primeira, por exemplo float (número com vírgula flutuante), como se pode ver nas duas imagens seguintes:

semant1.jpg semant2.jpg

Após a fase de análise, vem a geração de saída (output).
Começa-se por gerar código intermédio, isto é, instruções duma Máquina Abstracta.
Por exemplo: y = x + 'a' ;
geraria um código da seguinte forma ('a' tem o código 97, y é id1 e x é id2, t1 e t2 são variáveis temporárias):
t1 = (float)97
t2 = id2 + t1
id1 = t2

Em seguida, tenta-se optimizar este código de modo a ficar mais rápido. No exemplo anterior pode-se reduzir o número de instruções para apenas uma:
id1 = id2 + 97.0

Finalmente, gera-se o código objecto final, normalmente linguagem assembly/linguagem máquina recolocável (isto é, com um possível deslocamento relativamente às posições de memória).
No exemplo anterior, em assembly, temos:
MOVF id2 , R1
ADDF #97.0 , R1
MOVF R1 , id1

Finalmente, falta dizer que o compilador é apenas uma fase (a mais importante, é certo). Na imagem seguinte podem ver o contexto de um compilador.

contextocomp.jpg

Pronto, acabei. Se houver dúvidas, não hesitem em perguntar...

Publicado por Jorge Morais às abril 13, 2005 02:57 PM

Afixadelas

Nem sei se ria se chore...
Jorge, és muito simpático e explicaste tudo muito bem, mas fiquei na mesma, quando não pior...
Mas deixa, o problema é meu... Não consigo mesmo lá chegar...

Publicado por: M. em abril 13, 2005 02:06 PM

Compilador? Epá, a primeira dói sempre um bocadinho, mas depois passa.

Publicado por: susana em abril 13, 2005 02:06 PM

Boa explicação sim senhor!
;)

Publicado por: bin_tex em abril 13, 2005 02:08 PM

Sim senhora. Tens jeito

Publicado por: transpose em abril 13, 2005 02:18 PM

"Na burguesia, temos duas fases a distinguir: aquela durante a qual ela se constituiu em classe sob o regime do feudalismo e da monarquia absoluta e aquela em que, já constituída em classe, ela derrubou o feudalismo e a monarquia, para fazer da sociedade uma sociedade burguesa. A primeira destas fases foi a mais longa e a que necessitou de maiores esforços. Também ela tinha começado por coligações parciais contra os senhores feudais.

Muitos têm feito investigações sobre as diferentes fases históricas que a burguesia percorreu, desde a comuna até à sua constituição como classe. Mas quando se trata de dar conta exacta das greves, das coligações e das outras formas através das quais os proletários efectuam sob os nossos olhos a sua organização como classe, uns são tomados por um pavor real, outros exibem um desdém transcendental" (Miséria da Filosofia, cap. 2, § 5).

O que o jovem Marx declarava assim em 1847, pouco depois de ter aderido ao socialismo proletário, e que retomou de seguida por ocasião da exposição que fez no Manifesto Comunista dos diversos patamares de desenvolvimento da burguesia e do proletariado, repetiu-o de novo vinte anos mais tarde na célebre Resolução sobre os Sindicatos, adoptada no congresso realizado em Genebra pela Associação Internacional dos Trabalhadores, onde era dito que os sindicatos, assumindo por tarefa diária defender o salário e a jornada de trabalho do operário contra os permanentes ataques do capital, já se tinham transformado, sem disso terem consciência, em "centros de organização da classe operária, da mesma forma que as comunas e os municípios da Idade Média o tinha sido para a burguesia" e que no futuro "deviam agir conscientemente como centros de organização da classe operária no seu conjunto."

Karl Korsch,

in "Revolutionäre Kommune", magazine "Die Aktion", Setembro de 1929

Publicado por: mulher do dotórosas em abril 13, 2005 02:25 PM

Olha lá ò realmente@hotmail.com que raio de ligação existe entre a "célebre Resolução sobre os Sindicatos" e um compilador pá?

Podes explicar?

Publicado por: bin_tex em abril 13, 2005 02:31 PM

CAMARADA BIN

É IMPRESCINDÍVEL PREPARAR A REVOLUÇÃO

TRÊS MEDIDAS ESSENCIAIS:

- Esclarecimento teórico e político dos fins e meios da luta do proletariado, das condições históricas e imediatas dessa luta.

- Intervenção organizada, unida e centralizada a nível internacional, para contribuir no processo que leva à acção revolucionária da classe operária.

- Agrupamento de revolucionários para a constituição de um autêntico partido comunista mundial, indispensável ao proletariado para abolir a dominação capitalista e a sua marcha para a sociedade comunista.

E É PRECISO DIVULGAR ISTO.

SEMPRE. SOBRETUDO EM ABRIL

Publicado por: mulher do dotórosas em abril 13, 2005 02:38 PM

bin, não percas tempo.

Jorge, pecebi tudo. Obrigado.Foste claro como a água.Só fiquei com uma dúvida: um compilador compila?

M, tens que te esforçar mais um bocadinho. Olha que eu sou uma azelha e ficou tudo claro para mim.

Publicado por: isabel em abril 13, 2005 02:43 PM

M.,
Mando-te um link para o livro que é considerada a bíblia dos compiladores. Tenho a certeza que depois de leres tudo, vais perceber esta parte:
http://www.amazon.com/exec/obidos/tg/detail/-/0201100886/qid=1113401311/sr=8-1/ref=pd_csp_1/104-3402089-6351121?v=glance&s=books&n=507846

Publicado por: Jorge Morais em abril 13, 2005 03:10 PM

susana,
LOL
normalmente demora um semestre inteiro a passar ;-)

Publicado por: Jorge Morais em abril 13, 2005 03:12 PM

bin_tex,
já compilaste o programa em Linux???

Publicado por: Jorge Morais em abril 13, 2005 03:14 PM

transpose,
Sim SENHORA??? Será que alguém que compila é obrigatoriamente uma senhora??? ;-)
Obrigado.

Publicado por: Jorge Morais em abril 13, 2005 03:17 PM

Epá Jorge ainda não tive tempo no fds faço isso, passo mais de 12 horas por dia no pc e no mac a trabalhar, chega a uma hora que já não posso mais...

depois dou-te um feed-back;)

Publicado por: bin_tex em abril 13, 2005 03:19 PM

Oh, Mulher do Dotórosas.
Estes comentários estão fora do contexto, e quando assim é, eu apago-os. Não apago estes porque é a primeira vez e espero que seja a última. Se insistires, já estás avisada...
Se comentares o que se está a falar, és sempre bem-vinda :-)

Publicado por: Jorge Morais em abril 13, 2005 03:26 PM

isabel,
LOL
um compilador, definitivamente, compila... senão como é que havia geração (de código)? LOL

Publicado por: Jorge Morais em abril 13, 2005 03:30 PM

bin_tex,
vê lá se fazes isto, quero ver pelo menos uma pessoa a conseguir fazer as coisas bem, caso contrário começo a ficar frustrado... ;-)

Publicado por: Jorge Morais em abril 13, 2005 03:34 PM

Pergunta:
O que faz o seguinte programa?

#include
int main()
{
int x;
scanf("%d",&x);
printf("%d",x);
return (0);
}


Explicação:

A primeira linha do programa inclui o arquivo de cabecalho stdio.h. Este arquivo contém a declaracão das funcões 'scanf' e 'printf'. No início do programa é declarada a variavel 'x', inteira. 'scanf'lê x pelo teclado e printf imprime o valor lido. Na execucão o programa irá esperar até que o usuário entre com um número, e exibirá em seguida este número.

E AGORA?

JÁ POSSO FALAR DA REVOLUÇÃO QUE HÁ-DE DERRUBAR O CAPITALISMO SELVAGEM QUE ESCRAVIZA A HUMANIDADE?

Publicado por: mulher do dotórosas em abril 13, 2005 03:52 PM

mulher do dótorosas,
falta o <stdio.h>
Gosto mais de falar em ficheiro em vez de arquivo, dado que um arquivo contém, habitualmente, vários ficheiros, e prefiro utilizador em vez de usuário. Começo a desconfiar que compraste o livro em brasileiro...
Aproveito para acrescentar que &x dentro da função scanf signifca "endereço de x", dado que o valor é lido directamente para o endereço de memória reservado à variável x, e que %d é uma sequência de formatação, dizendo que se deve ler e escrever como um inteiro decimal. Finalmente, o return(0); significa que a função main retorna o valor 0.

E não, não podes falar ;-)

Publicado por: Jorge Morais em abril 13, 2005 04:01 PM

Foi o meu marido que comprou o livro: bem lhe peço para não comprar em saldos do continente.

Publicado por: mulher do dotórosas em abril 13, 2005 04:07 PM

Obrigada, Jorge!
Agora é que fiquei mesmo com os olhos cheios de lágrimas...

Publicado por: M. em abril 13, 2005 04:10 PM

Creio que depois desta explicação o Afixe nunca mais compilará da mesma forma... ;)

Já trabalhei sem usar "compilador", velhos tempos... hoje nem se dá pela sua existência.

Publicado por: Zoick em abril 13, 2005 04:12 PM

md (não podias arranjar um nick mais pequenino?),
está explicado ;-)

Publicado por: Jorge Morais em abril 13, 2005 04:13 PM

M.,
Lágrimas nos olhos?
Será de alegria, felicidade ou júbilo extremo?

Publicado por: Jorge Morais em abril 13, 2005 04:16 PM

Jorge podiamos dar umas aulitas de html tb aqui
o que dizes?

Publicado por: bin_tex em abril 13, 2005 04:19 PM

Júbilo extremo certamente, não é Butterfly?

Onde anda a Sôdona Emiéle? Jorge se a vires avisa-a que tem uma prenda para levantar até às 17.00H!
Está lá em casa..

Publicado por: bin_tex em abril 13, 2005 04:23 PM

Zoick,
não me digas que és do tempo do GWBasic (que era um interpretador e não um compilador)... Hoje em dia, quase não se nota o compilador (susana, isto é uma boa notícia?)...

Publicado por: Jorge Morais em abril 13, 2005 04:26 PM

bin_tex,
HTML??? Hum, vou pensar nisso...
Quanto à Emiéle, ainda bem que nos avisaste que ela andava desaparecida. Ela de vez em quando faz isso, e depois vamos encontrá-la nos sítios mais inimagináveis. Mas quando toma a medicação não há problemas ;-)
Tem mesmo de ser até às 5 da tarde? Era mais fácil se fosse às 5 da manhã...

Publicado por: Jorge Morais em abril 13, 2005 04:33 PM

Jorge antes de mais toda a gente nesta casa me trata por Bin, portanto FACHAVOR!

Html era fixe, ensinava-se ai umas cenas porreiras à malta, aliás...

podia criar-se um sequência, desde a linguagem binária, fazia-se uns posts sinteticos sobre isso

tipo introdução à informática, há malta que não sabe determinado tipo de cenas, não é vergonha nenhuma, e o afixe ensinava um bocadinho...

a parte do html era mto fixe, de vez em quando recebo mails e perguntarem como se faz isto e aquilo, portanto acho que era muito positivo.

A Sôdona Emiéle...Jorge será que ela já foi para a ilha?
terá apanhado o último ferry?
como é a ilha?
Emiéle podias mandar um telegrama e partilhares connosco a tua viagem para a ilha, tem animais a ilha?
tem muitas plantas?

Publicado por: bin_tex em abril 13, 2005 04:46 PM

Entendi perfeitamente.

Publicado por: fernando nogueira gonçalves em abril 13, 2005 05:46 PM

herrr.... hummm... bem, como hei-de dizê-lo, Jorge, mais antigo ainda... Mas esse também e já nem me lembrava. Falava em Assembler.

Publicado por: Zoick em abril 13, 2005 06:01 PM

hmmmm...hmmmmmmmm...hmmmmmmmm... :-) tá bem. Volto depois. Etc etc.

Publicado por: lyra em abril 13, 2005 06:31 PM

Oh amigos, já vos ocorreu que cá a je trabalha?
Trabalho é trabalho, cognac é cognac, é nem sempre posso andar por aqui a brincar...
Mas, pronto, fico lisonjeada que notassem a minha ausência.

Publicado por: Emiéle em abril 13, 2005 07:27 PM

Muitos parabéns!

Publicado por: francisco curate em abril 13, 2005 07:30 PM

bin (sem _tex),
Combinado.
Em relação ao HTML, há muita documentação, talvez fosse apenas de colocar os links (sempre era um post mais à Jorge Morais ;-) ).
A Emiéle já foi encontrada, mas não podemos revelar onde (top secret). ;-)

Publicado por: Jorge Morais em abril 13, 2005 10:33 PM

fernando,
ainda bem, já estava a ficar decepcionado com as minhas "capacidades pedagógicas" ;-)

Publicado por: Jorge Morais em abril 13, 2005 10:35 PM

Zoick,
Assembler? Qual?
Motorolla 68000? Intel Z80, 8086?
Eu ainda programei um pouquinho nestas linguagens...

Publicado por: Jorge Morais em abril 13, 2005 10:38 PM

lyra,
fico à espera... ;-)

Publicado por: Jorge Morais em abril 13, 2005 10:40 PM

Emiéle,
nós sentimos sempre a tua falta, especialmente de manhã, se não encontramos os teus textos ;-)

Publicado por: Jorge Morais em abril 13, 2005 10:44 PM

francisco,
obrigado.

Publicado por: Jorge Morais em abril 13, 2005 10:47 PM

E eu a pensar que o "compilador" apenas funcionava com uma "pila"!

Publicado por: canzoada em abril 14, 2005 12:06 AM

Só não percebi aquela parte entre "... podendo neste processo gerar mensagens de erro." e "Pronto, acabei". Importa-se de repetir?

Publicado por: Mi em abril 14, 2005 02:00 AM

canzoada,
não, percebeste mal, é com pilhas, faltava o 'h'.

Publicado por: Jorge Morais em abril 14, 2005 02:14 AM

Mi,
As mensagens de erro têm a ver com a ocorrência de erros no código fonte, que são reportados (neste casos, habitualmente, não é gerado código objecto...
"Pronto, acabei" - a explicação. Mas estou cá para esclarecer todas as tuas dúvidas (ou quase...).

P.S. Já encontraste a canção dos caracóis?

Publicado por: Jorge Morais em abril 14, 2005 02:22 AM

Jorge, no 8086...

Publicado por: Zoick em abril 14, 2005 11:20 AM

Zoick,
Bons tempos.
Em 8086 só tive umas 3 aulas, com um professor que não sabia dar aulas...
A fundo, foi mesmo o MC68000. Mas penso que já não me lembro de nada...

Publicado por: Jorge Morais em abril 14, 2005 11:46 AM

Muito obrigada, sôtor.

Quanto à canção dos caracóis, não fora a referência de que te falei, num blog português, tenderia a achar que, afinal, tinha sido fruto da minha imaginação.

Publicado por: Mi em abril 14, 2005 04:30 PM

Mi,
Já lancei um apelo, num post mais acima ;-)

Publicado por: Jorge Morais em abril 14, 2005 06:02 PM

Já vi :))
Os riscos que tu corres para encontrares a canção. Já te desclassificaram o post e tudo. Obrigada, Jorge!

Publicado por: Mi em abril 14, 2005 07:22 PM

Mi, sempre às ordens ;-)

Publicado por: Jorge Morais em abril 15, 2005 11:04 AM

Site Meter BlogRating online