Com relação aos softwares básicos envolvidos no processo d...
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Resposta correta: A
Para entender o processo de transformação de um código escrito em linguagem de alto nível para um código executável ou interpretado, é essencial compreender a função de cada componente envolvido neste processo. Ao abordar este tema, a questão destaca o papel de diversos softwares básicos, como compiladores, montadores (assemblers), link-editores (linkers) e outros. Vamos explicar o porquê da alternativa A ser a correta:
A análise semântica é uma fase dentro do processo de compilação que tem como objetivo verificar se as operações e expressões têm sentido lógico de acordo com as regras da linguagem. Por exemplo, garantindo que variáveis de tipos diferentes não sejam usadas de maneira inadequada em operações aritméticas. Portanto, quando a alternativa A menciona a verificação da consistência dos tipos de variáveis envolvidas em operações aritméticas, ela está se referindo a uma das responsabilidades da análise semântica, o que está correto.
Uma visão geral de cada componente mencionado nas alternativas pode ajudar a entender por que as outras estão incorretas:
- Montadores (assemblers) traduzem o código de linguagem de montagem (assembly) para código de máquina, mas não são responsáveis por buscar rotinas em bibliotecas externas.
- Compilação se refere a traduzir o código de uma linguagem de alto nível para linguagem de montagem ou diretamente para código de máquina, enquanto montagem é o processo de converter a linguagem de montagem em código de máquina, sendo o segundo bem menos complexo que o primeiro.
- Link-editores (linkers) são utilizados após a compilação e montagem para combinar diferentes unidades de programa, como módulos e bibliotecas, para formar um único programa executável, resolvendo referências externas, e não apenas símbolos internos.
- Analisadores léxicos e sintáticos analisam respectivamente a estrutura dos tokens (léxico) e a estrutura gramatical (sintaxe) de um programa, mas não se envolvem com a semântica ou significados do programa, que é tarefa da análise semântica.
Compreender bem esses componentes e suas responsabilidades é fundamental para desenvolvedores de software, bem como para aqueles que se preparam para concursos na área de tecnologia da informação, especialmente quando se trata de Arquitetura de Computadores e Compiladores.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Análise Sintática (Parsing):análise da sintática do código, organização, como é escrito, ou seja, das expressões, e estrutura destas. Ex. análise da estrutura de atribuição de algum valor. Verificação do uso de uma variável somente se esta estiver declarada.
Árvore:
X:= y+ 100
Análise Semântica:Analisa os erros semânticos como, por exemplo, o recebimento de uma variável diferente do seu tipo.
Análise sintática (parser), hierárquica ou gramatical: os caracteres ou tokens são agrupados hierarquicamente em coleções aninhadas com significado coletivo. Em outras palavras agrupam-se os tokens em frases gramaticais. Estas frases são usadas pelo compilador para sintetizar uma saída. As frases gramaticais são representadas por árvores. Determina a estrutura gramatical de uma sequência de entrada de dados, segundo uma determinada gramática formal. Ex.: Parentese sem correspondência.
Análise semântica: verificações são realizadas para assegurar que componentes de um programa se combinam de forma significativa. Esta fase verifica erros semânticos no programa fonte e captura informações de tipo para a fase subseqüente de geração de código. Utiliza a estrutura hierárquica determinada pela fase de análise sintática, a fim de identificar os operadores e operandos das expressões e enunciados.
Na montagem, há uma relação de 1:1 entre as instruções de linguagem de montagem e as instruções de máquina, enquanto na compilação isto não acontece, pois um único comando em Pascal, por exemplo, pode gerar várias instruções de máquina.
Inicialmente, o compilador realizará uma análise do código-fonte por meio de um módulo chamado front-end. A análise é dividida em três fases:
- análise léxica -> decompõe o programa-fonte em seus elementos individuais distintos (comandos, operadores, variáveis etc.) e verifica que eles estão de acordo com as regras da linguagem.
- análise sintática -> cria as estruturas (em geral uma árvore) de cada comando, verifica a correção dessas estruturas e alimenta a tabela de símbolos com as informações geradas. A tabela de símbolos gerada contém entradas para cada identificador e cada literal usado no programa-fonte, com as informações de seus atributos.
- análise semântica -> verifica as regras semânticas estáticas (durante o processo de compilação) da linguagem, produzindo, da mesma forma que os demais analisadores, mensagem de erro para as incorreções ou inconsistências semânticas.
Basicamente, o processo de compilação é dividido em analise e sintese. Supomos que eu tenho um código fonte em linguagem de alto nível;
Objetivo da análise: entender o código fonte e representá-lo em uma estrutura intermediária.
1) Análise Léxica - le o código fonte, caracter a caracter, e identifica seus elementos como tokens; elimina elementos "decorativos"(formatação, comentários etc).
2) Análise Sintática - determina se uma cadeia de símbolos léxicos pode ser gerada por uma gramática.
3) Análise Semântica; assegura que regras sensíveis ao contexto da linguagem estejam analisadas e verificadas quanto à sua validade.
Objetivo da síntese é construir o código objeto a partir dessa representação intermediária.
1) Geração de código intermediário (em java, bytecode, por exemplo);
2) Otimizador de código - examina o código intermediário para produzir um código que execute com eficiência.
3) Montagem de código objeto - Verifica a arquitetura específica;
4) Link Edição: linca o programa com recursos externos(bibliotecas, por exemplo);
5) Geração de código final;
Com essas definições em mente, vamos às alternativas:
a) No processo de análise semântica da compilação, é verificada a consistência dos tipos de variáveis envolvidas em operações aritméticas. Errado. Verifica o contexto das regras quanto a sua validade. Ex.: Verifica se a variável "int a" vai receber um valor inteiro, ao invés de uma String.
b) Os montadores buscam referências externas em rotinas de bibliotecas e inserem-nas no código-objeto. Errado. Quem faz isso é o linker.
c) Compilação e montagem são processos semelhantes; contudo, o processo de montagem é bem mais complexo. Errado. Na montagem ocorre a tradução do programa em assembly para um executável. Já a compilação tem todo um processo extra, como já explicado, análise e síntese, sendo mais complexo.
d) Os link-editores são usados para resolver as referências aos símbolos internos de um programa, produzindo um código-objeto simplificado. Errado. A questão fala do montador. Os link editores fazem referência e endereços das bibliotecas referenciadas no programa.
e) No processo de compilação, o analisador léxico e o sintático estão preocupados com a semântica e os significados dos programas como um todo. Errado. O analisador léxico le os caracteres, separando e identificando tokens; o sintático pega esses tokens e constroi a "gramatica" do codigo fonte. A questao está falando da análise semantica.
GABARITO A
No processo de análise semântica da compilação, é verificada a consistência dos tipos de variáveis envolvidas em operações aritméticas. (CERTO). A análise semântica faz as checagens dos tipos das variáveis... int, float, char, string...
A maioria dos comentários só me confundiram ao invés de me ajudar...
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo