Baixe o app para aproveitar ainda mais
Prévia do material em texto
Questão 1/10 - Compiladores Se fossemos reduzir todo o processo de análise semântica e suas funções principais poderíamos dizer que se trata da análise de tipos e de escopo. Primeiro, e mais importante, garantir que todas as declarações, operações e variáveis tenham tipos coerentes e, quando não, proceder a conversão automática ou emitir um erro. Segundo verificar as declarações, variáveis e operações com relação ao escopo. Ainda com relação a verificação de escopo e a linguagem C, qual das opções a seguir é falsa. Nota: 10.0 A Verificar se uma variável foi declarada em duplicidade faz parte das funções do analisador semântico; B Verificar se uma variável foi inicializada antes do uso é parte integrante da verificação de escopo realizada pelo analisador semântico; C Verificar se uma determinada variável foi declarada, mas nunca foi usada está entre as funcionalidades de um analisador semântico; D Verificar se um array, uni ou multidimensional, teve seus limites declarados antes de ser utilizado é parte integrante das funções do analisador semântico; E Verificar se uma função foi declarada antes do seu uso não faz parte das funções do analisador semântico e deve ser verificado pelo analisador sintático durante a formação da árvore sintática. Você acertou! Questão 2/10 - Compiladores O processo de verificação de tipos torna-se mais importante quando consideramos que, em muitas linguagens de programação, existem tipos complexos e tipos compostos. No caso de tipos compostos como um array ou uma struct, caberá ao analisador semântico a análise dos tipos agregados. Há ainda de se considerar a possibilidade de criação de novos tipos, compostos ou complexos, de acordo com a necessidade do programador. Assim, caberá ao analisador semântico, analisar, por exemplo, um tipo struct criado para atender as necessidades específicas de um programa da mesma forma que ele avalia um tipo inteiro ou real. Com relação a verificação de tipos, qual das afirmativas a seguir é incorreta? Nota: 10.0 A A checagem estática de tipos é feita em tempo de compilação, como é o caso da linguagem C, quando compilada; B A checagem de tipos dinâmica é feita em tempo de execução, como é o caso da linguagem PHP, quando interpretada; C Linguagens de programação podem exigir a definição de tipo para cada variável ou estrutura de dados composta ou, podem determinar estes tipos em tempo de execução, dependendo de escolhas realizadas na definição da linguagem; D A definição de tipos complexos, como listas e pilhas, independe da linguagem de programação e, como tal, estes tipos podem ser verificados por qualquer analisador semântico; Você acertou! E Ainda que tipos complexos e compostos tornem o processo de análise semântica mais complexo e demorado, as funcionalidades que são agregadas as linguagens de programação por estes constructors torna sua utilização indispensável. Questão 3/10 - Compiladores O processo de compilação é complexo. Para seu entendimento dividimos este processo em módulos de acordo com suas funcionalidades principais. Desta forma temos o analisador léxico, o analisador sintático, o analisador semântico entre outros dependendo apenas da didática utilizada para explicar cada um destes módulos e suas funcionalidades. Do ponto de vista da manutenção dos dados necessários ao processo de compilação, no entanto, há um módulo que permeia todos os outros, a tabela de símbolos. É nesta estrutura de dados que estão armazenados os tokens, a árvore sintática e a árvore semântica. Considerando as afirmativas a seguir marque a que está correta. Nota: 10.0 A A árvore semântica é a árvore sintática que foi identificada (etiquetada) pelo analisador semântico, contendo correções de tipos, indicações de erro; Você acertou! B A criação da árvore semântica começa antes do processo de criação de tokens; C Chamamos de árvore semântica ao conjunto de linhas que compõe todas as declarações do código na forma em que foram escritas; D A árvore semântica será descartada ao término do processo de análise semântica e não afetará a geração de código; E Eventuais erros detectados pelo analisador semântico provocam a poda da árvore sintática retirando desta as declarações onde os erros foram encontrados facilitando a geração do código executável; Questão 4/10 - Compiladores A principal função do analisador sintático é construir uma estrutura de dados que permitirá a validação do código utilizando as regras de produção, símbolos terminais e não terminais. Para permitir esta análise, qual a estrutura de dados que é utilizada pelos analisadores sintáticos modernos. Nota: 10.0 A um array de símbolos terminais não relacionados com as regras de produção; B uma árvore contendo símbolos terminais e não terminais que obedecem as regras de produção; Você acertou! C um registro (struct), contendo as regras de produção arrumadas em um array de símbolos terminais; D um texto composto apenas dos símbolos não terminais; E um array multidimensional contendo símbolos terminais e não terminais. Questão 5/10 - Compiladores A forma BNF do inglês Backus-Naur Form, pode ser utilizada para simplificar a especificação de regras de produção para a criação de linguagens simplificando o uso de gramáticas livre de contexto. Esta forma, e suas derivações, facilitam a interpretação das regras de produção. Marque, nas alternativas a seguir aquela que não é verdadeira. Nota: 10.0 A O uso de formas alternativas como a BNF simplifica a criação de analisadores sintáticos; B Uma vez que utilizamos a BNF não precisaremos analisar o código sintaticamente; Você acertou! C O uso de formas alternativas, como a BNF, torna dispensáveis o uso dos analisadores léxicos; D Independente da forma escolhida para representar as regras de produção, não poderemos utilizar uma análise botton-up ou ascendente. E Independente da forma escolhida para representar as regras de produção, não poderemos utilizar uma análise top-down ou descendente. Questão 6/10 - Compiladores As gramáticas livres de contexto, utilizadas na definição de linguagens formais, para a criação de linguagens de programação definem, a partir de um conjunto de quatro elementos, todas as regras que determinam a linguagem. Essas regras podem ser expandidas pelo processo chamado de derivação. Sendo assim, marque a alternativa correta. Nota: 10.0 A A derivação consiste na substituição de um símbolo não terminal par uma regra de produção; Você acertou! B A derivação consiste na substituição de um símbolo terminal por uma regra de produção; C A derivação consiste na substituição de um símbolo não terminal por um símbolo terminal; D A derivação consiste na substituição de uma regra de produção por um símbolo terminal; E A derivação consiste na substituição de uma regra de produção por um símbolo não terminal. Questão 7/10 - Compiladores Uma das principais características de uma linguagem formal é a existência de uma estrutura rígida e precisamente especificada. As linguagens formais são utilizadas na programação de computadores há várias décadas principalmente por que sua estrutura rígida torna o processo de compilação possível. Ainda relacionado as linguagens formais qual das afirmativas abaixo é verdadeira? Nota: 10.0 A A língua portuguesa, graças a sua gramática estruturada é um exemplo de linguagem formal; B As linguagens formais não podem ser definidas com o uso de máquinas de estados finitos; C A linguagem de programação Java constitui um exemplo de linguagem natural usada em programação; D Uma das formas de definir uma linguagem formal reside no uso de expressões regulares; Você acertou! A resposta correta é a letra D, o teorema de Kleene declara que só podem ser classificadas como linguagensformais aquelas que podem ser definidas com o uso de máquinas de estados finitos e/ou expressões regulares. E O Teorema de Kleene, para a definição de linguagens naturais, torna mais eficiente o processo de interpretação em máquinas que rodem o Javascript. Questão 8/10 - Compiladores As cadeias de caracteres, ou strings são artefatos de linguagens utilizados com frequência pelas linguagens de programação já que, na maior parte das vezes, se referem a textos que desejamos ler, guardar ou imprimir. Contudo, sua definição formal é mais elucidativa se consideramos sua relação com o alfabeto. Sendo assim, dadas as opções a seguir assinale a alternativa falsa. Nota: 10.0 A Uma string é uma sequência ordenada de símbolos que existem em um determinado alfabeto; B Considerando a string “110110011” podemos dizer que ela faz parte de um alfabeto de números binários; C A string vazia faz parte de todos os alfabetos possíveis; D Podemos usar símbolos que não façam parte de um alfabeto para marcar o começo e o fim de uma string; E Dado um alfabeto qualquer, em linguagens formais, não é possível identificar uma string utilizando uma máquina de estados finitos. Você acertou! Em linguagens formais, as máquinas de estados finitos e as expressões regulares são duas formas eficientes de identificar strings de um alfabeto dado. Questão 9/10 - Compiladores O processo de compilação é fundamental para a eficiência dos programas que executamos todos os dias. Dado que compilar, é uma espécie de tradução, onde uma linguagem própria para uso humano é convertida em uma linguagem própria para uso de máquinas. I. Otimização de Código de Máquina; II. Analisador Sintático; III. Analisador Léxico; IV. Analisador Semântico. Escolha a alternativa que contém a ordem correta de um processo de compilação básico entre as possibilidades acima: Nota: 10.0 A I, II, III, IV; B III, II, IV, I; Você acertou! Letra B Observar, por favor o capítulo 1 do Livro texto da disciplina. C II, I, IV, III; D IV, III, II, I; E I, III, IV, II. Questão 10/10 - Compiladores Levando-se em consideração o processo de compilação padrão da linguagem C/C++, podemos observar a criação de arquivos com a terminação .obj. Entre as alternativas a seguir, assinale a alternativa falsa relativa aos arquivos do tipo .obj deste processo de compilação. Nota: 10.0 A Arquivos .obj contém código de máquina referente a um arquivo de código- fonte específico; B Graças a existência destes arquivos .obj, podemos utilizar bibliotecas pré- compiladas e reduzir o tempo de compilação dos nossos programas; C A principal função do Linker é fazer a junção de todos os arquivos .obj envolvidos no processo de compilação; D Se o arquivo .obj já está em linguagem de máquina, ele pode ser facilmente executado em um sistema operacional; Você acertou! Ainda que o arquivo .obj possa conter código de máquina e, em alguns casos, apenas código de máquina, este arquivo não pode ser executado por não conter as informações específicas de execução necessárias para o sistema operacional. E Sem o uso de arquivos .obj o processo de compilação seria mais lento já que todas as funções e objetos utilizados no seu código teriam que passar por todo o processo de compilação ficando mais lento.
Compartilhar