12 Aula Introdução Aos Compiladores
12 Aula Introdução Aos Compiladores
12 Aula Introdução Aos Compiladores
Formais e Autômatos
15º Aqui vale a pena considerar a relação entre o modelo semântico de uma linguagem de
programação e uma máquina virtual. De fato, cada linguagem de programação pode ser vista como
definindo uma máquina virtual que a executa.
16º O modelo semântico da linguagem é o funcionamento desta máquina. Um interpretador
puro para uma linguagem é uma máquina virtual para ela. Como no estudo da Organização de
Computadores, é necessário organizar as máquinas em camadas.
17º Por isso existe, em um nível mais baixo, a linguagem de máquina, que define o modelo
de execução do hardware em si; logo acima temos o Sistema Operacional, que define uma
linguagem com novas primitivas, conhecidas como chamadas de sistema.
18º Acima do SO podemos ter um compilador de linguagem de alto nível que traduz
diretamente para código nativo, como o compilador C gcc; ou podemos ter uma máquina virtual que
executa diretamente uma linguagem em bytecode, como é o caso da máquina virtual Java.
19º Acima da JVM temos o compilador javac, que traduz um programa em Java para sua
versão em bytecode. A definição do que é feito em software e o que é feito em hardware não é
absoluta, sendo estabelecida por motivos de praticidade, desempenho e economia.
20º Poderia se criar um processador que executasse diretamente a linguagem C, mas seu
projeto seria complicadíssimo e seu custo muito alto.
Organização de um Compilador
21º Na Figura 1.1 [2] a estrutura básica de um compilador é apresentada de uma forma
muito simplificada. Agora consideramos essa estrutura em maiores detalhes. Em décadas de
desenvolvimento dos compiladores, estabeleceram-se algumas tradições na forma de estruturá-los.
22º Uma dessas tradições é separar o compilador em duas partes principais: a primeira
analisa o programa-fonte para verificar sua corretude e extrair as informações necessárias para a
tradução; a segunda utiliza as informações coletadas para gerar, ou sintetizar, o programa na
linguagem de destino.
23º É o modelo de análise e síntese; a fase de análise também é chamada de vanguarda do
compilador (front-end) e a de síntese é conhecida como retaguarda (back-end). Isso é mostrado na
Figura 1.3 [4].
24º Na figura, vê-se uma ligação entre as duas partes. O que é transmitido entre a análise e a
síntese é uma forma chamada de representação intermediária do programa. É como se fosse uma
linguagem “a meio caminho” entre as linguagens fonte e destino.
25º A representação intermediária é a saída da fase de análise, e entrada da fase de síntese.
Há uma série de razões para dividir os compiladores desta forma. Uma delas é modularizar a
construção dos compiladores: a interface entre análise e síntese fica bem determinada — é a
representação intermediária. [...]
26º O ideal deste modelo é que a representação intermediária fosse completamente
independente tanto da linguagem fonte como da linguagem de destino. Neste caso seria possível ter
uma representação intermediária universal, e todos os compiladores poderiam utiliza-la: para criar
um compilador para uma nova linguagem seria necessário apenas escrever o módulo de análise;
para suportar uma nova arquitetura bastaria escrever um módulo de síntese. Na prática, entretanto,
isto não é possível. Para gerar código de destino com eficiência aceitável, a representação
intermediária de um compilador vai depender tanto de características da linguagem fonte como da
linguagem destino. Agora consideramos em mais detalhe o que os módulos de análise e síntese
devem fazer.
Por que estudar os compiladores?
Fonte: https: Fonte: Linguagens e Máquinas: Uma Introdução aos Fundamentos da Computação
Newton José Vieira Departamento de Ciência da Computação Instituto de Ciências Exatas
http://producao.virtual.ufpb.br/books/tautologico/intro-comp/livro/livro.pdf