Buscar

Resumo Fundamentos em Linguagem e Teoria da Computação

Prévia do material em texto

Resumo Fundamentos em Linguagem e Teoria da Computação 
1. Compiladores e linguagens de programação 
 
 
1 – O que é um compilador? 
R: É constituído internamente por passos ou fases. Cada fase comunicasse com a seguinte através de uma 
linguagem intermediária adequada. 
 
2-Quais e o que fazem as fases que constituem o compilador? 
R:O compilador é constituído de 2 fases: Fase de Análise(Front-End) que é constituída de Analisador Léxico que 
verifica como as palavras estão escritas(onde o programa fonte é lido), Analisador Sintático que verifica a ordem e 
a estrutura e Analisador Semântico que verifica o significa das palavras no código; e Fase de síntese(Back-End) 
que é constituída de Gerador de código Intermediário e Otimizador de código . 
 
3 – O que é Tabela de Literais e qual sua importância? 
R: Armazena constantes e cadeias de caracteres usados em um programa. Também é usada para construir 
endereços simbólicos para literais e definições de dados ao arquivo de código fonte. Ela é importante para reduzir 
o tamanho de um programa na memória, pois permite o reaproveitamento das constantes e das cadeias de 
caracteres. 
 
4 – O que é Tabela de Símbolos? 
R: É uma estrutura de dados (normalmente tabela de hashing, ou então árvore, lista, pilha) contendo um registro 
para cada nome e para seus atributos. 
 
5 – Como os erros são manipulados e tratados pelo compilador? 
R: Os erros estáticos (em tempo de compilação) devem ser reportados pelo compilador. É importante que ele 
gere mensagens de erro inteligíveis e conclua a compilação após cada erro. Cada fase requer um tratamento de 
erro diferente e qualquer fase analítica deve prosseguir em sua análise evitando a propagação do efeito do erro. 
 
6 – Como o programa fonte é lido pelo Analisador Léxico? 
R: O programa fonte é fornecido como uma sequencia de caracteres, as quais são organizadas como unidades 
significativas denominadas lexemas. Para cada lexema, é produzido, como saída, um token no formato: 
<nome_token, valor_atributo>, onde nome_token é um símbolo abstrato que será usado durante a análise 
sintática e valor_atributo aponta para uma entrada na Tabela de símbolos referente a esse token. 
 
7 – Qual a função do analisador léxico? 
R: Ler, caractere a caractere, o texto fonte, verificando se os caracteres lidos pertencem ao alfabeto da linguagem 
de programação, identificando tokens e desprezando comentários e brancos desnecessários. 
 
8 – O que são tokens e como podem ser representados? 
R: Os tokens constituem classes de símbolos tais como palavras reservadas, delimitadores, identificadores, etc, e 
podem ser representados, internamente, através do próprio símbolo(como no caso dos delimitadores, palavras 
reservadas,...) ou por um par ordenado(caso dos identificadores, por exemplo). 
 
9 – Cite outras duas funcionalidades do analisador léxico. 
R: Iniciar a Construção da Tabela de símbolos e de Literais. Enviar mensagens de erro caso identifique unidades 
léxicas não aceitas pela linguagem em questão. 
 
10 – Identifique quantos caracteres e quantos tokens há na expressão: 
a)a[index]=4+2; R: contem 13 caracteres e 9 tokens. 
A -> <id, 1> ; [ -> <[> ou <delin, 2>;index - > <id,3>; ] -> <]> ou <delin,4>;= -> <=>;4 -> <numero,5> ou <5>; + -> <+>; 
2 -> <numero,6>; ; -> <;> 
 
11- Como funciona o analisador sintático? 
R: Utiliza os primeiros componentes dos tokens produzidos pelo léxico para criar uma representação 
intermediaria tipo arvore, que mostra a estrutura gramatical da sequencia de tokens. Essa fase analisa a estrutura 
do programa : Determina os elementos estruturais do programa e seus relacionamentos, apresentando os 
resultados como uma árvore de análise sintática ou uma árvore sintática. 
 
12 – Como é representada uma árvore de análise sintática? 
R: Em uma árvore de análise sintática, os nós internos são rotulados pelos nomes das estruturas que elas 
representam e as folhas da árvore representam a sequencia de tokens. 
 
13 – Qual a função da árvore de análise sintática? 
R: É um recurso útil para visualizar a sintaxe de um programa(ou elemento de programa) e assim detectar erros 
sintáticos, identificando onde ocorre e o tipo de erro ocorrido. 
 
14 - Para que são usadas as gramáticas livres de contexto? 
R: São usadas para especificar a estrutura gramatical das linguagens de programação. 
 
15 – Qual a função da analise semântica? 
R: Verificar se as estruturas válidas do programa farão sentido durante a execução. Verifica se os aspectos 
semânticos do programa estão corretos; ou seja, se não existem incoerências quanto ao significado das 
construções utilizadas pelo programador. A analise semântica deve apontar os erros encontrados, bem como o 
tipo de erro e onde ocorre. 
 
16 – Quais tipos de incoerências são procurados pelo analisador semântico? 
R: Tipos de operandos incompatíveis com operadores, variáveis não declaradas, redeclaração de variáveis, 
chamadas de funções ou métodos com o número incorreto de parâmetros e comandos colocados fora de 
contexto. 
 
17 – Qual a função da Tabela de Símbolos? 
R: Na Tabela de Símbolos são armazenadas informações sobre as variáveis declaradas, funções, tipos de dados. 
Sem ela é impossível a validação semântica. 
 
18 – Quais as duas propriedades que um código intermediário deve ter? 
R: ser facilmente produzido e ser facilmente traduzido para a máquina alvo. 
 
19 – Qual a função do otimizador de código? 
R: Independente das arquiteturas de máquina, faz algumas transformações no código intermediário com o 
objetivo de produzir um código objeto melhor. Melhor pode significar mais rápido, código menor ou que 
consuma menos energia, por exemplo. 
 
20 – O que são compiladores otimizadores? 
R: São compiladores que exploram ao máximo as oportunidades de otimização. 
 
21 – Como funciona o Gerador de Código? 
R: Recebe como entrada uma representação intermediaria do programa fonte e o mapeia em uma linguagem 
objeto. Se a linguagem objeto for código de máquina de alguma arquitetura, devem ser selecionados os 
registradores ou localizações de memória para cada uma das variáveis usadas pelo programa. 
 
22 – Qual a diferença do código intermediário e do código objeto final? 
R: O intermediário não especifica detalhes tais como: quais registradores são usados, quais endereços de 
memória serão referenciados... 
 
 
 
2. Descrição de uma linguagem de programação 
 
Cadeias que pertencem á linguagem em questão são chamadas de SENTENÇAS. 
Gramática – Conjunto de regras que, quando seguidas, produzirá uma sentença válida na linguagem. Consiste em 
4 objetos: 
*Alfabeto (Σ), finito e não vazio. Elementos: terminais. Representão: letras minúsculas. 
*Conjunto N, finito e não vazio, de símbolos diferentes dos terminais. Representação: letras maiúsculas. 
*Um elemento S – elemento inicial 
*Conjunto P de regras de produção (ou substituição) 
Forma Sentencial – Qualquer cadeia (inclusive vazia) de símbolos que pertença a união do alfabeto com o 
conjunto dos não terminais(N). 
 L(σ) gerada por σ é a coleção de todas as cadeias possíveis de terminais (ou seja, sentenças) que são geradas a 
partir do símbolo inicial. 
Gramáticas Equivalentes – duas gramáticas que geram a mesma linguagem. Obs: uma mesma linguagem pode 
ser gerada por mais de uma gramática, mas uma gramática gera apenas uma linguagem. 
Gramáticas Ambíguas – existem duas árvores de derivação distintas para a mesma sentença. 
 
Tipo Classe de Linguagem Modelo de Gramática Modelo de Reconhecedor 
0 LRE Irrestrita Maquina de Turing(MT) 
1 LSC Sensível ao contexto MT com fita limitada 
2 LLC Livre de Contexto Autômato com pilha 
3 LRRegular Autômato finito 
LRE – Linguagens estritamente livres de contexto 
LSC – Linguagens estritamente sensíveis ao contexto 
LLC – Linguagens estritamente irrestritas (recursivamente inumeráveis) 
LR - Linguagens Regulares 
 
Autômatos finitos (AF) – São basicamente grafos, com algumas diferenças: 
*são reconhecedores: dizem sim ou não para cada possível cadeia de caractere. 
*são de 2 tipos: 
Deterministas – (AFD ou MEFD) para cada estado e para cada símbolo de seu alfabeto de entrada há exatamente 
1 aresta com esse símbolo saindo desse estado. 
MEFD – Máquina de Estado Finito Determinístico - são maquinas formadas por um número finito de estados, 
junto a um dispositivo de entrada, o qual lê, um por um(da esquerda para a direita), símbolos de uma cadeia de 
caracteres de entrada. É formada por: {Q, Σ,δ,Q0, F} 
Q – conjunto finito e não vazio de estados: {Q0, Q1, Q2...Qn} 
Σ – alfabeto de entrada 
Função de transição – (δ) regra que descreve o próximo estado para o qual a máquina se move. 
Q0 – estado inicial 
F – conjunto de estados finais (estados reconhecedores) 
Não Deterministas – (AFDN) não tem restrições sobre os rótulos de suas arestas. Quando a função de transição, 
para um dado estado e uma entrada, leva a mais de um estado como resultado.

Continue navegando