Aula 06 - Compiladores, Interpretadores e Depuradores Flashcards

1
Q

O que são compiladores?

A

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).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

O que é código-fonte?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

O que é Código-Objeto?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

O que é um Pré-Processador?

A

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!).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Como é dividido o processo de compilação?

A

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).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Explique a fase de compilação conhecida como Análise Léxica.

A
  1. 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
  2. Inicialmente, ele descarta comentários, espaços em branco, marcas de formatação, etc; depois ele efetivamente agrupa os caracteres em tokens
  3. 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”; “!”

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Explique a fase de compilação conhecida como Análise Sintática.

A
  1. 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.
  2. 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
  3. 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”.
  4. 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.
  5. 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.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Explique a fase de compilação conhecida como Análise Semântica.

A
  1. 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.
  2. 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.
  3. 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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Explique a fase de compilação conhecida como Geração de Código Intermediário.

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Explique a fase de compilação conhecida como Otimização de Código Intermediário.

A

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!

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Explique a fase de compilação conhecida como Geração de Código Final.

A

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).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

O que é um Montador/Assembler?

A

É 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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Quais são os principais tipos de Assemblers e suas funções?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Julgue o item a seguir:

A Linguagem de Montagem é traduzida para uma Linguagem de Máquina (Binária). Ambas são dependentes de Hardware.

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

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.

A

Correto.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Julgue o item a seguir:

Compiladores devem obrigatoriamente transformar código-fonte em código de montagem, que será posteriormente convertido em código-objeto por um montador.

A

Errado. Na teoria, a afirmação é verdadeira. Mas na prática, é quase o inverso: a maioria dos compiladores realizam a tarefa do montador, produzindo um código de máquina relocável que pode ser passado diretamente para um ligador e/ou carregador, isto é, já entregam um código-objeto.

17
Q

O que é um Ligador(Linker ou Link-Editor)?

A

Ligadores são programas que recebem como entrada um conjunto de arquivos-objeto, bibliotecas padrão, arquivos de controle, parâmetros diversos e bibliotecas compartilhadas e os unem em um módulo, denominado Módulo de Carga, que é posteriormente carregado em memória (eventualmente, pode ser mais de um módulo). Ele é responsável por resolver referências internas e externas.

18
Q

O que é um Carregador (Loader)?

A

São programas que transferem o código de máquina de um módulo objeto para a memória e encaminham o início de sua execução. Eles recebem o módulo de carga como entrada, transferem seu código para a memória e realizam apenas os ajustes de realocação de acordo com o endereço base de memória. Um programa pode ser composto por partes independentemente carregadas e realocadas.

19
Q

Quais são os dois tipos básicos de carregadores?

A

a) Carregadores Binários: Os carregadores binários (ou carregadores absolutos) são mais simples e apenas copiam o arquivo em formato binário para a memória, de tal forma que o arquivo executável é simplesmente uma imagem binária do programa em execução na memória. Um programa que usa carregadores absolutos é associado com localizações específicas de memória, e por isso deve sempre ser carregado na mesma área de memória para serem executados corretamente (Ex: programas com extensão .COM). O carregador realocável pode ser colocado em qualquer local da memória para execução.

b) Carregadres Realocáveis: O programa executável realocável é semelhante ao programa executável absoluto, exceto que os endereços são todos relativos a zero (não são absolutos) e a informação de quais endereços relativos devem ser alterados quando o programa for colocado em execução estão junto com o arquivo executável (Ex: programas com extensão .EXE)

Atualmente também existem Carregadores que fazem a ligação de partes do programa em tempo de execução. Estes são chamados Carregadores-Ligadores

20
Q

Quais são as diferenças entre bibiotecas estáticas e dinâmicas?

A

a)Bibliotecas estáticas:
-todo o código da biblioteca é copiado e inserido dentro do binário final
-não pode ser compartilhada por outros programas, ocupando mais espaço na memória
-precisa recompilar o programa para que a bibliotecas seja atualizada

Alguns pontos positivos das bibliotecas estáticas é que se a mesma for corrompida posteriormente, seu programa não sofrerá pois utilizou uma versão estável. Os pontos negativos estão no custo de memória e de não usufruir imediatamente de otimizações da biblioteca. No Windows temos as .lib, e no Linux as lib.a

b) Bibliotecas dinâmicas:
-não são inseridas em sua totalidade, são apenas referenciadas no binário final
-outros programas podem utilizá-la, ocupando menos espaço na memória
-confere ao programa a possibilidade de atualizar as bibliotecas sem a necessidade de uma nova compilação/instalação

Pontos positivos está no menor custo de memória e atualizações dinâmicas. Entretanto, a biblioteca pode não ser encontrada corretamente ou se tornar incompatível com seu programa devido a uma atualização. Além disso, possui performance ligeiramente pior que as bibliotecas estáticas. No Windows, temos as .DLL (Dynamic-Link Libraries) e no Unix, temos as lib.so

21
Q

Resumo de um processo de compilação.

A
  1. Um programador escreve módulos de código-fonte em uma linguagem de programação de alto nível (ex: C).
  2. Esse código-fonte passa por um pré-processador que manipula diretivas, macros, comentários, etc.
  3. Começa, então, de fato o processo de compilação por meio de uma 4. análise léxica (tokenização e tabela de símbolos), seguida de uma 5. análise sintática (parsing e estrutura de árvore).
  4. Avança-se à análise semântica (checagem de tipos e verificação de variáveis), depois à 7. geração do código intermediário, 8. sua otimização e, por fim, a 9. geração do código final, que em geral é um programa em linguagem de montagem (Assembly).
  5. O Montador traduzirá cada modulo da linguagem de montagem para um código-objeto (alguns compiladores fazem também o papel de montador e já entregam um código-objeto) com algumas referências a resolver e que ainda não pode ser executado (O código-objeto é uma combinação de instruções de linguagem de máquina, dados e informações necessárias para colocar as instruções corretamente na memória.)
  6. O Ligador combinará todos esses módulos-objeto em um módulo de carga, com diversas rotinas de bibliotecas para resolver as referências internas e externas
  7. Por fim, o carregador coloca o código de máquina nos locais apropriados da memória para ser executado pelo processador. Para agilizar o processo de tradução, algumas etapas são puladas ou combinadas. Alguns compiladores produzem módulos-objeto diretamente, e alguns sistemas utilizam Carregadores-Ligadores, que realizam as duas últimas etapas.
22
Q

Quais as principais diferenças entre os compiladores e os interpretadores?

A

-Diferente de compiladores, que leem todo o arquivo de código fonte antes de produzir uma sequência binária, interpretadores processam um comando de cada vez

-Com tanto trabalho sendo feito “durante o voo”, interpretadores geralmente são muito mais lentos do que compiladores. Pelo menos cinco dos seis passos requeridos por compiladores também devem ser feitos por interpretadores, e estes passos são realizados em “tempo real”. Esta abordagem não dá oportunidade para otimização de código

-Além disso, a detecção de erros em interpretadores é geralmente limitada à verificação da sintaxe da linguagem e dos tipos de variáveis. Por exemplo, poucos interpretadores detectam possíveis operações aritméticas ilegais antes que ocorram ou avisam o programador antes de exceder os limites de um array. Os compiladores detectam erros bem mais variados.

-Apesar da velocidade de execução vagarosa e da verificação tardia de erros, existem boas razões para usar uma linguagem interpretada. A mais importante delas é que linguagens interpretadas permitem depuração em nível de código-fonte, tornando-as ideais para programadores iniciantes e usuários finais – podemos dizer que a detecção de erros é mais fácil para quem está começando

23
Q

Questão conceito sobre Compilador:
(CESPE - 2006 – DATAPREV - Analista de Sistemas) O compilador é parte integrante do kernel de sistemas operacionais.

A

Errado. Não é regra haver compiladores como parte do kernel de sistemas operacionais.

24
Q

Questão conceito sobre interpretadores:
(CESPE - 2007 – TCU - Analista de Sistemas) Um interpretador pode ser considerado como um programa que lê um conjunto de instruções e as executa passo a passo. Programas interpretados são, em geral, menores e mais facilmente mantidos, embora sejam mais lentos que os programas compilados.

A

Correto.

25
Q

Resolvendo questões da apostila, fiquei com muita dúvida em relação a ligador produzir código executável e o que é módulo de carga.

A

(verificar melhor)

26
Q
A