Aula 06 - Compiladores, Interpretadores e Depuradores Flashcards
O que são compiladores?
Compiladores são programas de computador capazes de traduzir um código-fonte escrito em uma linguagem de programação de alto nível para uma linguagem de programação de baixo nível (podendo ser uma linguagem de montagem ou código-objeto).
O que é código-fonte?
O código-fonte é um conjunto de palavras ou símbolos escritos de forma ordenada, contendo instruções em uma das linguagens de programação existentes, de maneira lógica. Atualmente, com a diversificação de linguagens, o código pode ser escrito de forma totalmente modular, podendo um mesmo conjunto de códigos ser compartilhado por diversos programas e, até mesmo, linguagens
O que é Código-Objeto?
O código-objeto representa a versão compilada e montada de um arquivo de código-fonte. Ele não é diretamente um arquivo executável, na medida em que ele deve ser ligado com outros códigos-objeto para criar um executável. Trata-se de uma porção do código de máquina, mas que contém ainda tabelas de símbolos, constantes, strings e outras referências
OBS: Alguns chamam o código-objeto de Código (Binário) de Máquina.
O que é um Pré-Processador?
O pré-processador é um programa que recebe um texto e efetua conversões léxicas, tais como substituição de macros, inclusão condicional, inclusão de ficheiros e exclusão de comentários. Normalmente ele é responsável por mudanças no código fonte destinadas de acordo com decisões tomadas em tempo de compilação.
O uso de pré-processadores tem vindo a ter cada vez menos comum à medida que as linguagens recentes fornecem características mais abstratas em vez de características orientadas lexicalmente. Há também linguagens recentes que tem pouca ou nenhuma funcionalidade, como por exemplo a linguagem Java, que não possui um pré-processador (mas quem programou C na faculdade usou
muito!).
Como é dividido o processo de compilação?
O processo de compilação é dividido
em duas fases:
a)Análise ou Front-End (Análise Léxica, Sintática, Semântica e Geração de Código Intermediário).
b) Síntese ou Back-end (Otimização de Código Intermediário e Geração de Código Final).
Explique a fase de compilação conhecida como Análise Léxica.
- Nesta fase, um analisador léxico (ou Scanner) lê o código-fonte caractere por caractere e divide o código escrito em símbolos léxicos chamados tokens, guardados em uma tabela de símbolos
- Inicialmente, ele descarta comentários, espaços em branco, marcas de formatação, etc; depois ele efetivamente agrupa os caracteres em tokens
- Em linguagens de programação, nós dividimos um texto em palavras-reservadas, identificadores, operadores,
pontuação, números, etc. A Análise Léxica é uma forma de verificar um alfabeto, ou seja, conseguimos verificar se existe ou não algum caractere que não faz parte do alfabeto
Ex: Eu vou passar nesse concurso!
Os tokens obtidos foram: “Eu”; “vou”; “passar”; “nesse”; “concurso”; “!”
Explique a fase de compilação conhecida como Análise Sintática.
- Também conhecida como Análise Gramatical ou Parsing, analisa uma sequência de entrada para determinar sua estrutura gramatical, segundo uma determinada gramática formal.
- Ela pega os tokens resultantes do processo de análise léxica e joga em uma estrutura hierárquica, como uma árvore. Assim como no português, verifica-se a estrutura do texto
- Assim como na linguagem natural, nas linguagens de programação se espera que os símbolos sejam dispostos de uma forma lógica uns em relação aos outros, tal como as palavras se juntam para formar expressões, orações e frases – isso é sintaxe. Um erro sintático, portanto, é um caso em que as “frases” do programa estão mal formuladas, aquilo que comumente chamamos de “erro gramatical”.
- O analisador sintático consulta a tabela de símbolos para verificar a presença de variáveis definidas pelo programador. Se o analisador encontra uma variável para a qual não existe descrição na tabela de símbolos, ele emite uma mensagem de erro.
- O analisador sintático também detecta
construções ilegais como A = B + C = D. No entanto, o que o analisador sintático não faz é verificar se os operadores = ou + são válidos para as variáveis A, B, C e D – quem faz isso é o analisador semântico. . Logo, nós podemos afirmar
que o analisador sintático tem uma certa preocupação com a operação, mas não com os operandos. E mais: os erros de sintaxe são sempre detectados em tempo de compilação/parse.
Explique a fase de compilação conhecida como Análise Semântica.
- Nesta fase, verificam-se erros semânticos, i.e., erros de sentido. Entre as principais atividades, estão a checagem de tipos, verificação de fluxos de controle e verificação de unicidade de declaração de variáveis. Essa fase também é encarregada de analisar a utilização dos identificadores e de ligar cada uma delas a sua declaração.
- Erros semânticos também são bastante comuns, entre eles nós podemos mencionar: dividir um número por uma string; criar uma classe que herda de si mesma; usar o operador ^ achando que é de exponenciação, mas na verdade é um ou exclusivo; ou dividir zero por zero. Erros semânticos podem ser detectados tanto durante a compilação quanto durante a execução.
- O Analisador Semântico usa a árvore de análise como entrada e verifica se os tipos de dados são apropriados usando informação da tabela de símbolos. O analisador semântico também faz as promoções adequadas de tipos de dados, tais como mudar um valor ou uma variável do tipo inteiro para ponto-flutuante, se tais promoções são suportadas pelas regras da linguagem.
Ex: int x = “Diego”; ora, eu não posso declarar uma variável do tipo inteiro e atribuir um valor textual.
Explique a fase de compilação conhecida como Geração de Código Intermediário.
Nesta fase, ocorre a transformação da árvore sintática em uma representação intermediária do código fonte. Esta linguagem intermediária é mais próxima da linguagem objeto do que o código fonte, mas ainda permite uma manipulação mais fácil do que se o código Assembly ou código de máquina fosse utilizado.
Explique a fase de compilação conhecida como Otimização de Código Intermediário.
Nesta fase, examina-se o código intermediário produzido durante a fase anterior(Geração de Código Intermediário) com objetivo de produzir, através de algumas técnicas, um código que execute com bastante eficiência o programa. Utilizam-se técnicas que detectam padrões dentro do código produzido e os substitui por códigos mais eficientes. Simples assim!
Explique a fase de compilação conhecida como Geração de Código Final.
Chegamos à última fase do processo de compilação com a geração do código de montagem (ainda não é o código-objeto, apesar de muitos compiladores já realizarem a montagem). Um código-objeto não é imediatamente executável, visto que ainda há código binário a ser incluído no programa, tais como bibliotecas .
OBS: Essa é a única fase da síntese que é obrigatória; as duas anteriores são opcionais(Geração e Otimização de Código Intermediário).
O que é um Montador/Assembler?
É um programa que efetua a tradução de forma mais rápida e simples de um programa escrito em linguagem de montagem (ex: Assembly) em um equivalente em linguagem de máquina.
OBS: Assembler é o montador, Assembly é uma linguagem de programação de baixo nível.
Quais são os principais tipos de Assemblers e suas funções?
Cross-assembler: é executado em um computador com um processador diferente daquele para o qual se está gerando código.
Macro-assembler: dispõe de recursos de macro, efetuando a expansão do código cada vez que uma macro for encontrada.
Micro-assembler: permite a escrita de micro-instruções, definindo-se assim um conjunto de instruções de um processador microprogramável.
Meta-assembler: é um assembler que pode montar programas para vários processadores diferentes.
Assembler de um passo: varre o programa-fonte apenas uma vez, gerando o código (deve existir alguma forma de se revolver as referências adiante).
Assembler de dois passos: varre o programa-fonte duas vezes para gerar o código, podendo assim resolver automaticamente as referências adiante.
Julgue o item a seguir:
A Linguagem de Montagem é traduzida para uma Linguagem de Máquina (Binária). Ambas são dependentes de Hardware.
Correto. Cada família de processadores possui sua própria linguagem de montagem particular. Por essa razão, Assembly não se trata de uma linguagem portável.
Julgue o item a seguir:
A Montagem é um tipo de tradução, assim como a compilação ou a interpretação. Logo, ela pode
existir por si só sem que haja compilação alguma.
Correto.