Prévia do material em texto
AO2 Entrega 22 fev em 23:59 Pontos 6 Perguntas 10 Disponível 29 jan em 23:59 - 22 fev em 23:59 Limite de tempo Nenhum Instruções Este teste não está mais disponível, pois o curso foi concluído. Histórico de tentativas Tentativa Tempo Pontuação MAIS RECENTE Tentativa 1 13 minutos 5,4 de 6 Pontuação deste teste: 5,4 de 6 Enviado 11 fev em 16:41 Esta tentativa levou 13 minutos. Pergunta 1 0,6 / 0,6 pts Importante: Caso você esteja realizando a atividade através do aplicativo "Canvas Student", é necessário que você clique em "FAZER O QUESTIONÁRIO", no final da página. Leia os textos a seguir: Texto I As gramáticas conhecidas como LL são as gramáticas que podem ser analisadas por parser tipo LL. O primeiro L determina que são analisadas da esquerda para a direita, e o segundo L determina que cria a árvore de derivação mais à esquerda. Gramáticas genéricas livres de contexto são processáveis por meio de algoritmos genéricos, por exemplo, o algoritmo de Earley. No entanto, esses algoritmos apresentam, no pior dos casos, um processamento cuja complexidade é O(n ), em que n é o número de símbolos da sequência de entrada. Contudo, existem subconjuntos de gramáticas que podem ser processadas de modo mais eficiente. Essas formas mais simples são ainda suficientemente genéricas em relação a quase todas as linguagens concebidas para o processamento informático. O analisador LR(0) é basicamente um analisador. O objetivo do analisador é processar o fluxo de entrada de tokens (os elementos básicos da linguagem que o analisador léxico produz com base no fluxo de entrada de caracteres). 3 A+ A A- https://famonline.instructure.com/courses/35927/quizzes/178749/history?version=1 A→β. a será um item LR(0). A→βγ será um item LR(0). Correto! A→β . γ será um item LR(0). A alternativa está correta, pois se A →α for uma escolha de produção, e se β e γ forem duas cadeias quaisquer de símbolos (incluindo a cadeia vazia ε) tais que βγ = α então A→β . γ será um item LR(0). A denominação item LR(0) se deve ao fato de as cadeias não conterem referências explícitas a verificação à frente. A→βy. a será um item LR(0). → A. y será um item LR(0). Pergunta 2 0,6 / 0,6 pts Fonte: MONGENSEN, T. Basics of compiler design. Copenhagen: University of Copenhagen, 2010. Torben Mogensen DIKU. Disponível em: http://hjemmesider.diku.dk/~torbenm/Basics/ (http://hjemmesider.diku.dk/~torbenm/Basics/) . Acesso em: 17 abr. 2023. Texto II Imagine a seguinte situação em que A →α for uma escolha de produção, e se β e γ forem duas cadeias quaisquer de símbolos (incluindo a cadeia vazia ε) tais que βγ = α. Considerando as reflexões apresentadas, assinale a opção correta. Leia o texto a seguir: A análise léxica é utilizada essencialmente na categorização dos elementos de uma linguagem em classes de símbolos, em vez de caracteres individuais. O processamento da parte regular de uma linguagem denomina-se análise léxica. A análise léxica tem a vantagem de ser um processo que, podendo ser formalmente descrito através de expressões regulares, pode produzir uma rotina que realiza essa análise. Essa rotina modela um autômato finito derivado matematicamente das expressões regulares especificadas Fonte: SANTOS, P. R.; LANGLOIS, T. Compiladores: Da Teoria à Prática. Grupo GEN, 2018, p. 16. A+ A A- http://hjemmesider.diku.dk/~torbenm/Basics/ http://hjemmesider.diku.dk/~torbenm/Basics/ http://hjemmesider.diku.dk/~torbenm/Basics/ http://hjemmesider.diku.dk/~torbenm/Basics/ II e III, apenas. I, apenas. Correto! I e II, apenas. A alternativa está correta, pois apenas as afirmativas I e II estão corretas. A afirmativa I está correta, pois na prática, uma unidade lexical geralmente possui um único atributo: um ponteiro para a entrada da tabela de símbolos onde as informações da unidade léxica são preservadas; o ponteiro torna-se o atributo da unidade léxica. A afirmativa II está correta, pois o analisador léxico reúne informações sobre unidades lexicais em atributos associados a eles, inserindo informações de alguns tokens, como por exemplo os identificadores. A afirmativa III está incorreta, pois a análise léxica está no início da cadeia de compilação e colabora com a análise gramatical para passar da sintaxe concreta à sintaxe abstrata. I, II e III. III, apenas. Pergunta 3 0,6 / 0,6 pts Considerando o texto apresentado, avalie as afirmações abaixo: I. Uma unidade lexical geralmente possui um único atributo: um ponteiro para a entrada da tabela de símbolos. II. O analisador léxico agrupa informações das unidades lexicais em atributos associados a eles. III. A análise léxica está no final da cadeia de compilação, passando da sintaxe concreta à sintaxe abstrata. É correto o que se afirma em: Leia o texto a seguir: Um analisador léxico é um programa de computador que divide um fluxo de texto em tokens e marca seu tipo. Ele recebe a entrada como uma sequência arbitrariamente longa de caracteres, chamada de string de entrada, e produz a saída como uma ou mais sequências de caracteres, chamadas de sequências de token. A+ A A- I e IV, apenas. I, II e IV, apenas. I e III, apenas. Correto! I, II e III, apenas. A alternativa está correta, pois apenas as afirmativas I, II e III estão corretas. A afirmativa I está incorreta, pois os identificadores são os nomes que o usuário atribui a várias partes do programa. Eles são chamados assim porque "identificam" um endereço de memória específico A afirmativa II está correta, pois do ponto de vista teórico, o analisador léxico não é uma parte obrigatória do compilador. Todas as suas funções podem ser executadas na fase de análise, pois são totalmente reguladas pela sintaxe. A afirmativa III está correta, pois é possível usar uma técnica de análise simples, eficiente e teoricamente bem desenvolvida para selecionar e analisar lexemas no texto, enquanto algoritmos de análise bastante complexos são usados na etapa de análise sintática das construções da língua de origem. A afirmativa IV está incorreta, pois as funções desempenhadas pelo analisador léxico e a composição dos tokens que eles distinguem no texto da fonte do programa podem variar dependendo da versão do compilador. Basicamente, os analisadores léxicos excluem comentários e espaços insignificantes do texto do programa fonte, bem como extraem lexemas dos seguintes tipos: identificadores, string, caracteres e constantes numéricas, sinais de operação, separadores e palavras-chave (de serviço) da linguagem de entrada. II, III e IV, apenas. Considerando o texto, avalie as afirmações abaixo: I. Os identificadores são os nomes que o usuário atribui a várias partes do programa, que identificam um endereço de memória específico. II. O analisador léxico não é uma parte obrigatória do compilador, pois suas funções podem ser executadas na fase de análise. III. É possível usar técnica de análise simples para selecionar e analisar lexemas no texto e algoritmos complexos na etapa de análise sintática. IV. As funções desempenhadas pelo analisador léxico e a composição dos tokens são igualitários de acordo com a versão do compilador. É correto o que se afirma em: A+ A A- Pergunta 4 0,6 / 0,6 pts A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. As asserções I e II são proposições falsas. Correto! As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. A alternativa está correta, pois as asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. A asserção I é verdadeira, pois o código intermediário pode assumir muitas formas – existem quase tantos estilos de código intermediário quanto compiladores. O programador de um compilador pode preferir gerar uma nova forma de representação intermediária, a partir da árvore sintática, que se Leia o texto a seguir: O código intermediárioé particularmente útil quando o objetivo do compilador é produzir código extremamente eficiente, pois isso requer uma quantidade significativa de análise das propriedades do código-alvo, o que é facilitado pelo uso do código intermediário. Fonte: LOUDEN, K. C. Compiladores: princípios e práticas. Cengage Learning Brasil, 2004.p. 401. Refletindo sobre máquina de estados, avalie as seguintes asserções e a relação proposta entre elas. I. O código intermediário pode assumir muitas formas, sendo ele uma estrutura de dados do programa-fonte durante a tradução. PORQUE II. O código intermediário representa alguma forma de linearização da árvore sintática ou DAG em forma serial, determinando coeficientes lineares. A respeito dessas asserções, assinale a opção correta: A+ A A- assemelhe melhor ao código-alvo ou substitua a árvore sintática por essa representação intermediária, e em seguida gerar o código-alvo a partir dessa nova representação. A asserção II é verdadeira e justifica a asserção I, pois representam alguma forma de linearização da árvore sintática, ou seja, uma representação da árvore sintática em forma sequencial. As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. Pergunta 5 0 / 0,6 pts As asserções I e II são proposições falsas. As asserções I e II são verdadeiras, mas a II não é uma justificativa da I. A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. Você respondeu A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. Leia o texto a seguir: Expressões regulares são usadas em quase todas as linguagens. É uma ferramenta muito poderosa que permite verificar se o conteúdo de uma variável tem a forma que se espera. Por exemplo, se recuperarmos um número de telefone, esperamos que a variável seja composta de números e espaços (ou traços), mas nada mais. As expressões regulares permitem não apenas avisá-lo sobre um caractere indesejado, mas também remover/modificar todos aqueles que não são desejáveis. Refletindo sobre expressões regulares, avalie as seguintes asserções e a relação proposta entre elas. I. Na expressão: “re = /abc\d+/” ocorre a compilação quando o script é avaliado. PORQUE II. Se a expressão regular for constante, um inicializador pode ser usado para melhorar o desempenho. A respeito dessas asserções, assinale a opção correta: A+ A A- A alternativa está correta, pois as asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. A asserção I é verdadeira, pois usando um inicializador de objeto: “re = /abc\d+/” os inicializadores de objeto compilam a expressão regular quando o script é avaliado. A asserção II é verdadeira, pois apenas se a expressão regular for constante, um inicializador pode ser usado para melhorar o desempenho. Resposta correta As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. Pergunta 6 0,6 / 0,6 pts Representação intermediária de alto nível. Análise semântica. Código de três endereços. Correto! Código intermediário. A alternativa está correta, pois a geração de código intermediário (ou geração direta de código-alvo sem código intermediário) pode ser vista como uma computação de atributos similar a muitos dos problemas de atributos. Em razão da complexidade da geração de código, um compilador tipicamente quebra essa fase em vários passos, que usam diversas estruturas de dados intermediárias, e frequentemente requerem alguma forma de código abstrato, denominado de geração de código intermediário. Otimização de código. Leia o texto abaixo: A geração de código é a fase mais complexa de um compilador, pois depende não apenas das características da linguagem-fonte, mas também de informações detalhadas da arquitetura-alvo, da estrutura do ambiente de execução e do sistema operacional da máquina-alvo. Fonte: LOUDEN, K. C. Compiladores: princípios e práticas. Cengage Learning Brasil, 2004. p. 415. Em razão da complexidade da geração de código, um compilador tipicamente quebra essa fase em vários passos e frequentemente requerem alguma forma de código abstrato. A que tipo de código o texto faz referência? A+ A A- Pergunta 7 0,6 / 0,6 pts Uma string. Correto! Árvore de sintaxe. A alternativa está correta. Uma FSM pode ser usada para construir uma árvore de sintaxe, que mostra a derivação (ou seja, como a string foi construída) da string. Grafo dirigido. Gramáticas regulares. Estados finais. Pergunta 8 0,6 / 0,6 pts Leia o texto a seguir: Máquinas de estado finito (FSM), também chamadas de autômatos de estado finito (FSA), são modelos conceituais para reconhecer, analisar e gerar strings em uma linguagem formal. O poder do FSM vem da capacidade de definir claramente diferentes comportamentos em diferentes condições. Normalmente, o FSM é usado com scripts comportamentais de loop que avaliam constantemente a situação atual em um loop ou com eventos. Considerando as informações apresentadas, uma FSM pode ser usada para construir o quê? Leia o texto a seguir: Um programa compilado é executado mais rapidamente porque é um código de máquina. No entanto, em computadores modernos, a desaceleração na velocidade de execução durante a interpretação geralmente não é perceptível. Além disso, as linguagens interpretadas apresentam uma série de vantagens, entre elas a ausência de etapas preparatórias para a execução do programa, o que pode ser importante para quem está começando a aprender programação. Refletindo sobre o histórico da compilação, avalie as seguintes asserções e a relação proposta entre elas. A+ A A- Correto! As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. A alternativa está correta. As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. A asserção I é verdadeira, pois muitos sabem que o compilador C foi escrito no próprio C (semelhante a como o grupo Niklaus Wirth implementou o compilador Pascal em Pascal um pouco antes). Muito menos conhecido, no entanto, é o fato de que seus criadores seguiram amplamente os passos do compilador da linguagem B, que foi escrito por Ken Thompson no próprio B. A asserção II é verdadeira e é uma justificativa da I, pois o trabalho de McIlroy resultou no compilador do compilador TMGL. Com sua ajuda, a promoção de software (bootstrapping) foi realizada primeiro na linguagem B e depois na linguagem C. Em outras palavras, os compiladores para essas linguagens foram escritos nas mesmas linguagens. As asserções I e II são proposições falsas. As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. Pergunta 9 0,6 / 0,6 pts I. Muitas pessoas sabem que o compilador C foi escrito no próprio C. Muito menos conhecido, no entanto, é o fato de que seus criadores seguiram amplamente os passos do compilador da linguagem B. PORQUE II. O trabalho de McIlroy resultou no compilador TMGL. Com sua ajuda, a promoção de software (bootstrapping) foi realizado primeiro na linguagem B e depois na linguagem C. A respeito dessas asserções, assinale a opção correta: Leia o texto a seguir: Compilação é a tradução (transformação) de um texto de programa escrito em um idioma (origem) em um texto equivalente (preservando a semântica) em outro idioma (destino). Um compilador é um programa que lê o texto do programa na linguagem fonte e o compila. Uma abordagem alternativa é A+ A A- Correto! A linguagem de destino também pode ser outra linguagem de programação ou uma linguagem de máquina para alguma máquina virtual. Esta alternativa é a correta, pois a linguagem de destino também pode ser outra linguagem de programação (trans-compilação) ou uma linguagem de máquina para alguma máquinavirtual (tal linguagem é geralmente chamada de bytecode). O bytecode, por sua vez, é executado pelo interpretador de bytecode. A linguagem de destino pode ser uma linguagem de máquina, saída do compilador não pode ser executada diretamente pelo interpretador. Para cada lexema, o analisador gera um token, que é uma combinação de um símbolo semantico (o nome do tipo de token) e um outro conjunto de lexemas. Na fase de análise da compilação, o texto fonte do programa é lido, então ele é incluído em um único bloco elementar e feita a sua análise estática. Na fase de síntese da compilação, com base na representação final e outras informações são feitos mapeamentos no código-alvo. Pergunta 10 0,6 / 0,6 pts a interpretação, ou seja, execução direta de operações especificadas no código-fonte do programa. Um interpretador é um programa que lê o código-fonte e o interpreta. Além disso, o compilador pode analisar estaticamente o código-fonte do programa, relatar erros e emitir avisos sobre possíveis problemas. Considerando as reflexões apresentadas, assinale a opção correta. Leia o texto a seguir: As linguagens sensíveis ao contexto são a última classe de linguagens que podem ser efetivamente reconhecidas pelos computadores. Especialistas dirão que eles são permitidos por autômatos não determinísticos linearmente limitados de dois lados. Para admitir cadeias de uma linguagem sem restrições, no caso geral, é necessária uma calculadora universal (máquina de Turing, máquina com número ilimitado de registradores, etc.). Linguagens sensíveis ao contexto e linguagens sem restrições não são usadas na construção de compiladores e não serão mais consideradas. Considerando as informações, avalie as afirmativas abaixo: A+ A A- I e III, apenas. I, apenas. III, apenas. Correto! I, II e III. A alternativa está correta, pois as afirmativas I, II e III estão corretas. A afirmativa I está correta, pois como as ações na análise LL(1) dependem apenas do próximo par de símbolos não terminal-próximo, essa análise é fácil de programar. A descida recursiva é uma maneira de codificar a análise LL(1). A afirmativa II está correta, pois para codificar tabelas o compilador converter as cadeias da linguagem correspondentes à gramática: S: T{+T} T: E {*E} E: |(S) A afirmativa III está correta, pois qualquer gramática LL(k) é única. Uma gramática recursiva à esquerda não pertence a LL(k) para qualquer k.. Às vezes é possível converter uma gramática não LL(1) em sua gramática LL(1) equivalente eliminando a recursão à esquerda e a fatoração. No entanto, o problema da existência de uma LL(k)-gramática equivalente para uma não-LL(k)- gramática arbitrária é indecidível. II e III, apenas. Pontuação do teste: 5,4 de 6 I. Como as ações na análise LL(1) necessitam do próximo par de símbolos não terminal-próximo, facilita a programação. II. A conversão de uma cadeia da linguagem corresponde à gramática: S: T{+T} T: E {*E} E: |(S) III. O Analisador de Gramáticas LL(K) é único. Uma gramática recursiva à esquerda não pertence a LL(k) para qualquer k. É correto o que se afirma em: A+ A A-