


Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
Resumo sobre a Análise Semântica (C)
Tipologia: Resumos
1 / 4
Esta página não é visível na pré-visualização
Não perca as partes importantes!
Análise semântica é a terceira fase da compilação nesse momento ocorre a validação de uma série regras que não podem ser verificadas nas etapas anteriores, onde se verificam os erros semânticos, (por exemplo, fazer a divisão de um número inteiro por outro número float, na linguagem C padrão ANSI)) no código fonte e coletam-se as informações necessárias para a próxima fase da compilação, que é a geração de código objeto. Ela verifica e aponta as expressões que quebram qualquer regra determinada pela gramática. Mas o nível de complexidade aumenta quando tratamos de linguagens dependentes de contexto. A análise semântica busca apontar (não resolver) este tipo de erros (dependentes de contexto).
É importante ressaltar que as validações que não podem ser executadas pelas etapas anteriores devem ser executadas durante a análise semântica a fim de garantir que o programa fonte esteja coerente e o mesmo possa ser convertido para linguagem de máquina.
Essa etapa também captura informações sobre o programa fonte para que as fases subsequentes gerar o código objeto, um importante componente da análise semântica é a verificação de tipos, nela o compilador verifica se cada operador recebe os operandos permitidos e especificados na linguagem fonte.
Um exemplo que ilustra muito bem essa etapa de validação de tipos é a atribuição de objetos de tipos ou classe diferentes. Em alguns casos, o compilador realiza a conversão automática de um tipo para outro que seja adequado à aplicação do operador. Por exemplo a expressão.
var s: String; s := 2 + ‘2’;
Veja o exemplo de um código em Object Pascal:
function Soma(a, b : Integer) : Integer; var i : Integer; begin i := a + b; Result := i; end;
No exemplo acima o analisador semântico tem uma série de preocupações para validar o significado de cada regra de produção.
Vamos utilizar como exemplo a regra de atribuição:
i := a + b;
A análise semântica trata a entrada sintática e transforma-a numa representação mais simples e mais adaptada a geração de código. Esta camada do compilador fica igualmente encarregada de analisar a utilização dos identificadores e de ligar cada uma delas a sua declaração. Nesta situação verificar-se que o programa respeita as regras de visibilidade e de porte dos identificadores. Nesta fase é também esperado
que no processo da compilação verifique que cada expressão definida tenha um tipo adequado conforme as regras próprias da linguagem. Um exemplo comum nas linguagens de programação é a análise semântica retornar um erro quando uma variável do tipo numérica (real ou inteira) receber um valor tipo texto (string).
O objetivo da análise semântica é trabalhar nesse nível de inter-relacionamento entre partes distintas do programa. As tarefas básicas desempenhadas durante a análise semântica incluem a verificação de tipos, a verificação do fluxo de controle e a verificação da unicidade da declaração de variáveis. Dependendo da linguagem de programação, outros tipos de verificações podem ser necessários.
A análise semântica engloba duas tarefas principais:
A Análise de contexto e a Geração de código. Verificação de erros em frases que estão sintaticamente corretos.
A saída da fase de análise semântica é anotada na árvore do analisador gramatical. As gramáticas de atributo são usadas para descrever a semântica de estática de um programa.
A fase de geração de código intermediário permite a geração de instruções para uma máquina abstrata, normalmente em código de três endereços, mais adequadas à fase de otimização. Esta forma intermediária não é executada diretamente pela máquina alvo.
A fase de otimização analisa o código no formato intermediário e tenta melhorá-lo de tal forma que venha a resultar um código de máquina mais rápido em tempo de execução, usando as réguas que denotam a semântica da linguagem-fonte. Uma das tarefas executadas pelo otimizador é a detecção e a eliminação de movimento de dados redundantes e a repetição de operações dentro de um mesmo bloco de programa.
E por fim, a fase de geração de código tem como objetivo analisar o código já otimizado é a gerar o um código objeto definitivo para uma máquina alvo. Normalmente este código objeto é um código de máquina realocável ou um código de montagem. Nesta etapa as localizações de memória são selecionadas para cada uma das variáveis usadas pelo programa. Então, as instruções intermediárias são, cada uma, traduzidas numa sequência de instruções de máquina que realizam a mesma tarefa.
Escopo dos identificadores
O compilador deve garantir que variáveis e funções estejam declaradas em locais que podem ser acessados onde esses identificadores estão sendo utilizados.
Uma classe com funções declaradas como privadas e essas funções sendo utilizadas fora da classe.
class Foo { private $x;
private function sum() { return $this->x = 1; }
}
Comandos como continue e break executam saltos na execução de códigos, esses comandos devem ser utilizados em instruções que permitem os saltos.
O processo de verificação dos tipos ocorre em tempo de compilação (checagem estática) ou em tempo de execução (checagem dinâmica). Muitas das linguagens utilizam o sistema estático, esse sistema é predominante em linguagens compiladas, pois essa informação é utilizada durante a compilação como já citado e simplifica o trabalho do compilador.