Prévia do material em texto
QUESTÃO 1 A seleção de registradores, o uso dos caches disponíveis e a seleção das instruções mais adequadas a uma determinada arquitetura são características de um dos blocos do processo de tradução de uma linguagem de programação em um código, ou linguagem, de máquina. Marque, entre as alternativas as seguir, qual o bloco que apresenta essas características. a ) Bloco de análise semântica. b ) Bloco de análise sintática. c ) Bloco de geração de código intermediário. d ) Bloco da análise léxica. e ) Bloco de geração de código de máquina. Ver justificativa da resposta QUESTÃO 2 Uma linguagem formal é composta de um conjunto de símbolos, o alfabeto, e um conjunto de strings, as palavras, frases e textos. Esse é o caso de linguagens como a música. Considerando esses dois conceitos básicos, podemos afirmar que: 1. o alfabeto tem que ser finito; 2. o conjunto de strings pode ser infinito; 3. não há relação entre o alfabeto e o conjunto de strings. Considerando as afirmações apresentadas, marque a alternativa correta. a ) Apenas a afirmativa 2 está correta. b ) Apenas as afirmativas 1 e 2 estão corretas. c ) Apenas a afirmativa 1 está correta. d ) Apenas a afirmativa 3 está correta. e ) Apenas as afirmativas 1 e 3 estão corretas. Ver justificativa da resposta QUESTÃO 3 A existência de tipos e suas formas de verificação deu origem a uma discordância entre os programadores e desenvolvedores de linguagens de programação. Enquanto uns preferem linguagens cuja análise semântica é estática, outros preferem linguagens cuja análise semântica é dinâmica. Isso ocorre, principalmente, porque, em um caso, os tipos precisam ser anotados ou inferidos em tempo de compilação e, em outro, os tipos podem ser apenas inferidos em tempo de execução. Considerando as seguintes afirmações, preencha as lacunas com as palavras corretas e assinale a alternativa com a sequência correta. 1. Linguagens estaticamente tipadas são ______ suscetíveis a erros em tempo de ___________. 2. A análise __________ permite que o código seja escrito em _______ tempo já que o programador precisa escrever ________. 3. A análise dinâmica requer o uso de ________ recursos computacionais durante o processo de __________. a ) menos/ compilação/ dinâmicas/ menos/ menos/ mais/ execução b ) mais/ execução/ estática/ mais/ menos/ mais/ compilação c ) menos/ execução/ estática/ menos/ menos/ mais/ execução d ) menos/ compilação/ estática/ mais/ menos/ menos/ interpretação e ) mais/ execução/ dinâmica/ menos/ menos/ mais/ compilação Ver justificativa da resposta QUESTÃO 4 O projeto LLVM disponibiliza uma estrutura de compilação baseada no uso de uma representação intermediária, um código intermediário. Assim foi possível criar um conjunto de módulos de front-end para cada linguagem de programação desejada e um conjunto de módulos de back-end para cada arquitetura alvo desejada. A força do projeto LLVM está, justamente, na representação intermediária. Considere as seguintes afirmativas. 1. O código intermediário do projeto LLVM é uma linguagem desenhada para permitir otimização manual, se for necessário. 2. A representação intermediária do projeto LLVM não pode ser considerada uma linguagem de programação por não ter uma estrutura de tipos. 3. A representação intermediária do projeto LLVM tem três formas distintas, uma textual, uma estrutura de memória e uma espécie de código binário parecido com o Bytecode do Java. a ) Apenas a afirmativa 2 está correta. b ) Apenas as afirmativas 1 e 2 estão corretas. c ) Apenas as afirmativas 1 e 3 estão corretas. d ) Apenas a afirmativa 3 está correta. e ) Apenas a afirmativa 1 está correta. Ver justificativa da resposta QUESTÃO 5 A principal função da otimização de código é garantir que o binário gerado com base no processo de tradução da linguagem de programação rode o mais eficientemente possível. Considerando as divisões didáticas do processo de compilação e a existência de um módulo nesse processo, responsável por essa otimização, avalie as afirmativas. 1. Toda a otimização realizada no código intermediário deve ser feita de maneira a não alterar o algoritmo codificado. 2. Os processos de otimização realizados no gerador de código intermediário são independentes da arquitetura alvo. 3. As linguagens utilizadas para a geração de código intermediário estão mais próximas da linguagem de programação que do Assembly. Marque, entre as alternativas a seguir, aquela que está correta. a ) Apenas as afirmativas 1 e 2 estão corretas. b ) Apenas as afirmativas 1 e 3 estão corretas. c ) Apenas a afirmativa 2 está correta. d ) Apenas a afirmativa 1 está correta. e ) Apenas a afirmativa 3 está correta. Ver justificativa da resposta QUESTÃO 6 Máquinas executam linguagem de máquina e apenas ela. Esse é o motivo que forçou a criação das linguagens de programação, entendidas pelo ser humano e que podem ser traduzidas em linguagem de máquina. Assim, podemos afirmar que: 1. os núcleos de processamento de notebooks utilizam o código binário como linguagem; 2. o Assembly é a verdadeira linguagem de máquina; 3. uma linguagem de programação é artificial. Considerando as afirmações, marque a alternativa correta. a ) Apenas a afirmativa 3 está correta. b ) Apenas a afirmativa 1 está correta. c ) Apenas a afirmativa 2 está correta. d ) Apenas as afirmativas 1 e 2 estão corretas. e ) Apenas as afirmativas 1 e 3 estão corretas. Ver justificativa da resposta QUESTÃO 7 O processo de otimização de código é complexo e inclui um conjunto diversificado de técnicas de ordenação, de substituição e de ordenação de instruções na busca de um conjunto eficiente. Entre as alternativas a seguir, marque aquela que apresenta um conjunto de otimizações comuns durante a otimização de código intermediário. a ) Eliminação de tipos errados, simplificação de laços de repetição, exclusão de expressões algébricas. b ) Simplificação de laços de repetição, substituição de constantes, exclusões de expressões algébricas. c ) Eliminação de código intangível, simplificação de laços de repetição, eliminação de tipos errados. d ) Eliminação de instruções redundantes, eliminação de código inatingível, simplificação de expressões algébricas. e ) Simplificação de expressões algébricas, eliminação de laços desnecessários, eliminação de tipos errados. Ver justificativa da resposta QUESTÃO 8 Durante o processo de tradução, os módulos de análise léxica e sintática não têm como avaliar eventuais erros de codificação que tenham relação com o contexto em que uma declaração de programa se encontra. Cabe ao analisador semântico avaliar o contexto da declaração em busca do sentido de cada comando. Considerando as tarefas do analisador semântico, marque como verdadeiro (V) ou falso (F) as seguintes declarações. ( ) Cabe ao analisador semântico identificar erros nos parâmetros de uma função. ( ) Erros como variável utilizada antes de ser declarada são detectados pelos analisadores semânticos de linguagens, que exigem esse procedimento. ( ) O uso de tipos diferentes não será detectado pelo analisador semântico. ( ) O analisador semântico irá criar a árvore sintática abstrata fornecida pelo analisador sintático. Selecione, entre as alternativas a seguir, aquela que corresponde a sequência correta de verdadeiros (V) e falsos (F). a ) F/ V/ V/ F b ) V/ F/ V/ V c ) F/ F/ F/ F d ) V/ V/ F/ F e ) F/ F/ V/ V QUESTÃO 1 Depois do Assembly, criamos as linguagens de nicho, como o Cobol, para aplicações comerciais, e o Fortran, para aplicações matemáticas. Com o tempo, as linguagens de programação ficaram genéricas e deixaram de ter aplicações específicas. Nesse momento, o ser humano agregou as técnicas de programação em grandes famílias, os paradigmas de linguagensde programação. Considerando essa evolução, marque a alternativa correta. a ) Linguagens lógicas de programação são linguagens que permitem a escrita de algoritmos usando premissas lógicas. b ) Uma linguagem funcional é aquela que usa os métodos de objetos para representar o algoritmo. c ) Não existe diferença entre linguagens imperativas e funcionais. d ) Uma linguagem imperativa descreve o algoritmo usando funções matemáticas. e ) Todas as linguagens de programação estão no paradigma lógico, e a lógica é a base da programação. Ver justificativa da resposta QUESTÃO 2 Linguagens de programação são artificiais e formais, desenvolvidas pelo ser humano com o objetivo de resolver um problema específico: usar máquinas para resolver outros problemas. Sobre essa afirmação, selecione a alternativa correta. a ) Linguagens naturais evoluem com o tempo e sofrem alterações, já as linguagens formais não. b ) A linguagem natural é uma característica exclusiva dos seres humanos. c ) Usamos as linguagens naturais, como a matemática, para representar algoritmos. d ) As linguagens formais foram criadas para substituir as naturais na comunicação entre dois seres vivos. e ) As linguagens naturais são limitadas em tamanho enquanto as formais não são. Ver justificativa da resposta QUESTÃO 3 A validação do código escrito em uma linguagem de programação será realizada por um parser, artefato de software que utilizará uma gramática como referência e, caso a validação seja possível, criará uma árvore sintática abstrata. Com relação a esse processo, podemos afirmar que: 1. um parser LL(1) precisa de uma gramática especial para ser criado, a qual não permita ambiguidade; 2. um parser obedece à sua gramática de modo a remover qualquer ambiguidade que exista nela; 3. um parser LL(1) varre as declarações da esquerda para a direita e avalia o primeiro não terminal à esquerda. Considerando as afirmações, marque a alternativa correta. a ) Apenas as afirmativas 1 e 2 estão corretas. b ) Apenas a afirmativa 3 está correta. c ) Apenas as afirmativas 1 e 3 estão corretas. d ) Apenas a afirmativa 2 está correta. e ) Apenas a afirmativa 1 está correta. Ver justificativa da resposta QUESTÃO 4 O processo de tradução de uma linguagem de programação, criada para uso humano, em uma linguagem de máquina, criada para uso por máquinas, é complexo. Para reduzir essa complexidade e melhorar sua compreensão, dividimos esse processo em módulos funcionais, cada um responsável por uma parte. Considerando as divisões e as tarefas que devem ser executadas, marque a alternativa que contém uma ordem possível. a ) Analisador léxico, analisador semântico e analisador sintático. b ) Analisador semântico, analisador sintático e analisador léxico. c ) Analisador sintático, analisador léxico e geração de código intermediário. d ) Analisador léxico, geração de código intermediário e analisador sintático. e ) Analisador léxico, analisador sintático e analisador semântico. Ver justificativa da resposta QUESTÃO 5 O uso de tipos em linguagens de programação é complexo e requer atenção, tanto durante a anotação quando durante a validação. Isso é verdade para a validação estática e para a validação dinâmica. Essa complexidade é provocada pelo conjunto de artefato de código disponível nas linguagens mais modernas. Não é difícil encontrar linguagens com funções, objetos, records e templates. Além, é claro, de variáveis e ponteiros. Tendo em vista essa complexidade, os tipos foram divididos em classe para análise e compreensão. Considere a seguir as seguintes afirmações. 1. Tipos primitivos são aqueles que estão mais próximos das características físicas da máquina. 2. Tipos compostos são agregações de tipos primitivos, como os tipos double, float e arrays. 3. Tipos complexos são aqueles que precisam de tipos compostos, como as unions e as classes. Entre as alternativas as seguir marque aquela que estiver correta. a ) A afirmativa 1 está correta. b ) A afirmativa 2 está correta. c ) A afirmativa 3 está correta. d ) As afirmativas 1 e 2 estão corretas. e ) As afirmativas 1 e 3 estão corretas. Ver justificativa da resposta QUESTÃO 6 Para que um programa possa ser executado em uma máquina, os softwares responsáveis pela tradução de linguagens precisam encontrar formas de adequar os artefatos da linguagem de programação à linguagem de máquina. Nesse caso, podemos afirmar que: a ) a performance do programa em execução não tem relação com a linguagem utilizada para criar o algoritmo. b ) a linguagem de programação não tem impacto na segurança do código em execução. c ) algumas linguagens têm performance melhor que outras, como no caso do Rust comparado ao Go. d ) o programa em execução ou o binário em memória - a verdadeira linguagem de máquina - depende da máquina na qual será executado. e ) todas as linguagens de programação criam o mesmo código de máquina, cuja única diferença é o algoritmo implementado. Ver justificativa da resposta QUESTÃO 7 A atribuição de valores, para a criação de conteúdo semântico nos vértices da árvore sintática abstrata, é a forma mais comum de acrescentar conteúdo semântico a uma estrutura de dados que foi criada com base em uma gramática livre de contexto. Sendo assim: 1. os atributos que serão adicionados podem ser sintetizados ou herdados. 2. o uso de atributos herdados implica na criação de um processo de translação sintática direta. 3. os atributos de um vértice são utilizados para determinar se os atributos de outro vértice são válidos. Considerando as afirmativas, marque a opção correta nas alternativas a seguir. a ) Apenas as afirmativas 1 e 2 estão corretas b ) Apenas a afirmativa 3 está correta c ) Apenas as afirmativas 1 e 3 estão corretas. d ) Apenas a afirmativa 1 está correta. e ) Apenas a afirmativa 2 está correta. Ver justificativa da resposta QUESTÃO 8 Analisadores sintáticos são artefatos de software desenvolvidos para validar a estrutura das declarações de uma linguagem de programação. Para isso, usam gramáticas. Sobre isso, considere as afirmativas a seguir e marque a alternativa correta. a ) A classificação das gramáticas de Chomsky exclui justamente as gramáticas que precisamos definir para linguagens livres de contexto. b ) Linguagens livres de contexto são definidas por gramáticas regulares. c ) Gramáticas são um conjunto finito de regras que permite definir como as declarações de uma linguagem são formadas. d ) O uso de gramáticas limita a criação de linguagens de programação a linguagens regulares. e ) As gramáticas são ferramentas de análise sintática cujo uso é limitado às linguagens naturais. Ver justificativa da resposta QUESTÃO 9 A existência de tipos e suas formas de verificação deu origem a uma discordância entre os programadores e desenvolvedores de linguagens de programação. Enquanto uns preferem linguagens cuja análise semântica é estática, outros preferem linguagens cuja análise semântica é dinâmica. Isso ocorre, principalmente, porque, em um caso, os tipos precisam ser anotados ou inferidos em tempo de compilação e, em outro, os tipos podem ser apenas inferidos em tempo de execução. Considerando as seguintes afirmações, preencha as lacunas com as palavras corretas e assinale a alternativa com a sequência correta. 1. Linguagens estaticamente tipadas são ______ suscetíveis a erros em tempo de ___________. 2. A análise __________ permite que o código seja escrito em _______ tempo já que o programador precisa escrever ________. 3. A análise dinâmica requer o uso de ________ recursos computacionais durante o processo de __________. a ) menos/ execução/ estática/ menos/ menos/ mais/ execução b ) menos/ compilação/ estática/ mais/ menos/ menos/ interpretação c ) mais/ execução/estática/ mais/ menos/ mais/ compilação d ) mais/ execução/ dinâmica/ menos/ menos/ mais/ compilação e ) menos/ compilação/ dinâmicas/ menos/ menos/ mais/ execução Ver justificativa da resposta QUESTÃO 10 Na JVM, o código em execução é constantemente monitorado para o recolhimento de estatísticas de número de execuções e tempo de execução. Esse monitoramento serve para a criação de um perfil de execução de cada fragmento de código. Sempre que um determinado número de chamadas a um fragmento é encontrado, ou sempre que um fragmento de código demora mais que um valor específico, o código desse fragmento é compilado por um compilador JIT. Entre as alternativas a seguir, marque a alternativa correta. a ) Os processos de monitoramento para a criação do perfil de uso são executados pelo interpretador antes do início da execução do código e armazenados para uso posterior. b ) Programas interpretados, com o uso de ciclos de otimização JIT, tendem a ficar mais eficientes com o uso. c ) O ciclo de compilação JIT aplica sobre um determinado fragmento de código as mesmas técnicas de otimização utilizadas durante a interpretação. d ) O custo do monitoramento de fragmentos de código faz com que programas que usem essa técnica tenham sempre a mesma performance, independentemente da quantidade de vezes que um fragmento é chamado. e ) O compilador JIT da JVM é o único compilador JIT que utiliza módulos capazes de monitorar código em memória: os módulos perfiladores. Ver justificativa da resposta QUESTÃO 11 O projeto LLVM disponibiliza uma estrutura de compilação baseada no uso de uma representação intermediária, um código intermediário. Assim foi possível criar um conjunto de módulos de front-end para cada linguagem de programação desejada e um conjunto de módulos de back-end para cada arquitetura alvo desejada. A força do projeto LLVM está, justamente, na representação intermediária. Considere as seguintes afirmativas. 1. O código intermediário do projeto LLVM é uma linguagem desenhada para permitir otimização manual, se for necessário. 2. A representação intermediária do projeto LLVM não pode ser considerada uma linguagem de programação por não ter uma estrutura de tipos. 3. A representação intermediária do projeto LLVM tem três formas distintas, uma textual, uma estrutura de memória e uma espécie de código binário parecido com o Bytecode do Java. a ) Apenas a afirmativa 1 está correta. b ) Apenas as afirmativas 1 e 3 estão corretas. c ) Apenas a afirmativa 3 está correta. d ) Apenas a afirmativa 2 está correta. e ) Apenas as afirmativas 1 e 2 estão corretas. Ver justificativa da resposta QUESTÃO 12 Algumas características do formato de executáveis do Windows, o formato PE, foram mantidas apenas por compatibilidade com o antigo formato dos executáveis do MSDOS. Hoje essas características são usadas apenas para indicar que um determinado programa não é compatível com o MSDOS. Considere as afirmativas a seguir. 1. Os únicos arquivos que precisam utilizar o formato PE para serem reconhecidos como executáveis, no Windows, são do tipo .exe. 2. No formato PE, o seu binário, executável no Windows, será armazenado em uma seção que não tem relação com as seções compatíveis com o MSDOS. 3. O formato PE usa a seção DOS Stub para disparar o seu programa, sempre que ele for executado em uma máquina MSDOS. Marque, entre as alternativas a seguir, aquela que está correta. a ) Apenas a afirmativa 2 está correta. b ) Apenas a afirmativa 3 está correta. c ) Apenas a afirmativa 1 está correta. d ) Apenas as afirmativas 1 e 3 estão corretas. e ) Apenas as afirmativas 1 e 2 estão corretas. Ver justificativa da resposta QUESTÃO 1 O processo de otimização de código é complexo e inclui um conjunto diversificado de técnicas de ordenação, de substituição e de ordenação de instruções na busca de um conjunto eficiente. Entre as alternativas a seguir, marque aquela que apresenta um conjunto de otimizações comuns durante a otimização de código intermediário. a ) Eliminação de instruções redundantes, eliminação de código inatingível, simplificação de expressões algébricas. b ) Eliminação de tipos errados, simplificação de laços de repetição, exclusão de expressões algébricas. c ) Eliminação de código intangível, simplificação de laços de repetição, eliminação de tipos errados. d ) Simplificação de expressões algébricas, eliminação de laços desnecessários, eliminação de tipos errados. e ) Simplificação de laços de repetição, substituição de constantes, exclusões de expressões algébricas. Ver justificativa da resposta QUESTÃO 2 Talvez a maior contribuição do projeto da linguagem Java seja exatamente o seu código intermediário, o Bytecode, e a estrutura de interpretação com compilação JIT implementada na JVM para execução desse código intermediário. Considerando a arquitetura criada para a linguagem Java, marque, entre as alternativas a seguir, a correta. a ) O processo de compilação, realizado no front-end dos compiladores Java, tem as mesmas funcionalidades de qualquer compilador até a geração do código intermediário. b ) O Bytecode do Java não sofre nenhum tipo de otimização até que seja submetido à interpretação. c ) A linguagem Java só é realmente compilada quando um determinado fragmento de código precisa ser otimizado pelo JIT. d ) O processo de interpretação do Bytecode do Java, na máquina virtual, usa como referência o código escrito originalmente. e ) O back-end do processo de interpretação da linguagem executa processos de otimização simples de um passo, característicos do processo de interpretação, e não os processos complexos, característicos do processo de compilação. Ver justificativa da resposta QUESTÃO 3 Em 1960, John McCarthy publicou um artigo sobre a linguagem Lisp em que comentava sobre fragmentos de código que poderiam ser armazenados entre funções diferentes para uso mais eficiente dos processos de execução. Esse artigo é relevante por plantar as sementes da compilação dinâmica. Marque como verdadeiro (V) ou falso (F) as seguintes afirmações e depois indique a alternativa que apresenta a sequência correta. ( ) O termo compilação dinâmica acabou sendo substituído pelo termo JIT, que significa que a compilação será utilizada quando necessário. ( ) Os processos JIT recorrem ao uso do monitoramento do código em execução para determinar quando e se um fragmento de código precisa ser recompilado. ( ) O compilador JIT da JVM utiliza duas estruturas de compilação. ( ) A função do módulo perfilador é determinar quais fragmentos de código devem ser otimizados. a ) V/ V/ F/ F b ) V/ F/ F/ F c ) V/ V/ V/ F d ) F/ F/ F/ F e ) V/ V/ V/ V Ver justificativa da resposta QUESTÃO 4 O teorema de Kleene relaciona as expressões regulares e as máquinas de estado finito. Essas duas abstrações matemáticas podem ser usadas, indistintamente, para reconhecer dada linguagem, validadas suas strings em relação ao alfabeto que a define. Considerando as linguagens regulares, as expressões regulares e as máquinas de estado finito, marque a alternativa correta. a ) A operação de união, quando aplicada a linguagens, resulta no produto vetorial entre os elementos desses conjuntos. b ) Expressões regulares são expressões algébricas formadas pelas operações de união, concatenação e fechamento de Kleene. c ) O fechamento de Kleene é uma operação binária que deve ser realizada entre duas linguagens. d ) Não é possível realizar a concatenação entre linguagens quando uma delas é o resultado da aplicação do fechamento de Kleene. e ) A concatenação é o resultado da operação do fechamento de Kleene quando aplicado a duas linguagens distintas. Ver justificativa da resposta QUESTÃO 5 As máquinas de estados finitos precisam apenas da definição do alfabeto,dos estados e da função de transição para identificar se determinado conjunto de símbolos de entrada (string) faz parte ou não de uma linguagem regular. Considerando as máquinas de estados finitos e um alfabeto composto apenas de 0 e 1, marque entre as alternativas a seguir aquela que representa uma máquina de estados finitos capaz de reconhecer strings de uma linguagem em que todas as strings devem ser terminadas em três números 1. a ) b ) c ) d ) e ) Ver justificativa da resposta QUESTÃO 6 Para que um programa possa ser executado em uma máquina, os softwares responsáveis pela tradução de linguagens precisam encontrar formas de adequar os artefatos da linguagem de programação à linguagem de máquina. Nesse caso, podemos afirmar que: a ) algumas linguagens têm performance melhor que outras, como no caso do Rust comparado ao Go. b ) a linguagem de programação não tem impacto na segurança do código em execução. c ) a performance do programa em execução não tem relação com a linguagem utilizada para criar o algoritmo. d ) todas as linguagens de programação criam o mesmo código de máquina, cuja única diferença é o algoritmo implementado. e ) o programa em execução ou o binário em memória - a verdadeira linguagem de máquina - depende da máquina na qual será executado. Ver justificativa da resposta QUESTÃO 7 O conceito de tipos é fundamental para a criação de programas seguros e eficientes. Cabe ao analisador semântico avaliar a aplicação dos tipos em declarações e operações. Essa não é uma tarefa trivial e requer o entendimento de alguns conceitos importantes. Considere as afirmativas a seguir e as marque como verdadeiras (V) ou falsas (F). ( ) Os tipos existem para identificar os códigos binários que estarão armazenados em memória. ( ) Os tipos existem para garantir que os processos de interpretação e compilação possam manipular os dados corretamente. ( ) Os tipos determinam a forma como os dados devem ser armazenados em memória e um conjunto de regras determina como realizar esse armazenamento. ( ) Números inteiros, números de ponto flutuantes e caracteres são exemplos de tipos. Marque a alternativa que apresenta a sequência correta. a ) V/ V/ V/ F b ) F/ F/ F/ F c ) V/ V/ V/ V d ) F/ F/ V/ F e ) F/ V/ V/ V Ver justificativa da resposta QUESTÃO 8 Analisadores sintáticos são artefatos de software desenvolvidos para validar a estrutura das declarações de uma linguagem de programação. Para isso, usam gramáticas. Sobre isso, considere as afirmativas a seguir e marque a alternativa correta. a ) Linguagens livres de contexto são definidas por gramáticas regulares. b ) Gramáticas são um conjunto finito de regras que permite definir como as declarações de uma linguagem são formadas. c ) A classificação das gramáticas de Chomsky exclui justamente as gramáticas que precisamos definir para linguagens livres de contexto. d ) O uso de gramáticas limita a criação de linguagens de programação a linguagens regulares. e ) As gramáticas são ferramentas de análise sintática cujo uso é limitado às linguagens naturais. Ver justificativa da resposta QUESTÃO 9 Não é raro encontrar um livro ou artigo que se refere ao Assembly como uma linguagem de baixo nível por estar mais próxima da máquina que do ser humano, nem que programar em Assembly permite conseguir o máximo de desempenho possível de determinado sistema computacional. Ainda que seja a primeira linguagem de programação, com origem na década de 1950, justamente graças a sua especificidade, ainda é uma das mais desconhecidas. Considerando o Assembly e o ambiente de desenvolvimento de programas, marque a alternativa correta. a ) O uso de recursos como os macros não faz sentido em programas escritos em Assembly. b ) Já que a linguagem Assembly é específica de uma arquitetura, não podemos programar nela a arquitetura Intel para gerar executáveis Arm. c ) O Assembly não pode ser considerado uma linguagem de programação, e sim uma forma diferente de linguagem de máquina. d ) Chamamos de assembler o artefato de software responsável por traduzir o Assembly em linguagem de máquina. e ) O processo de tradução do Assembly em código de máquina é mais complexo que o de tradução do Java ou do C++. Ver justificativa da resposta QUESTÃO 10 Um dos objetivos de criarmos linguagens de programação é tornar mais simples para os seres humanos o processo de utilizar máquinas para resolver problemas. Nesse esforço, também simplificamos as expressões regulares, abstraindo conceitos matemáticos complexos em símbolos mais simples. Por exemplo, usamos o símbolo | (barra vertical) para representar a união, o ? (ponto) para representar a concatenação e o * (asterisco) para representar o fechamento de Kleene. Com essas informações em mente, marque a alternativa correta. a ) b ) c ) d ) e ) Ver justificativa da resposta QUESTÃO 1 Sistemas embarcados, geralmente sistemas simples em que uma CPU tem acesso direto aos seus dispositivos de memória, entrada e saída e que, geralmente, rodam apenas um programa de cada vez, não precisam de qualquer tipo de encapsulamento do binário gerado em um processo de tradução de linguagem de programação para linguagem de máquina. Isso não pode ser dito de máquinas que executam sistemas operacionais. Marque como verdadeiro (V) ou falso (F) as afirmativas. ( ) Encapsular um binário é o processo de incluir as informações necessárias para que o sistema operacional saiba como executá-lo. ( ) O processo de encapsulamento é idêntico para todos os sistemas operacionais desde os tempos do Unix. ( ) O processo de encapsulamento do Windows permite gerar diversos tipos diferentes de executáveis. ( ) Graças ao encapsulamento podemos executar binários executáveis do Windows no Linux e no Unix. Agora assinale a alternativa que apresenta a sequência correta. a ) V/ V/ F/ F b ) F/ F/ V/ V c ) V/ V/ V/ F d ) V/ F/ V/ F e ) F/ V/ F/ V Ver justificativa da resposta QUESTÃO 2 A criação de analisadores léxicos e sintáticos é um trabalho não trivial e frequentemente longo. Alguns programadores, quando criam suas próprias linguagens de programação, preferem usar programas geradores de analisadores léxicos e sintáticos. Sobre isso, marque a alternativa correta. a ) O uso de programas geradores é a única forma de utilizarmos parsers LL(1). b ) O Flex é um aplicativo que gera analisadores léxicos, enquanto o Bison gera analisadores sintáticos. c ) O Antlr gera analisadores léxicos e sintáticos com base em um conjunto de código de máquinas. d ) Programas como o Flex geram parsers LR(1). e ) Programas como o Bison geram analisadores léxicos para parsers LL(1). Ver justificativa da resposta QUESTÃO 3 Um dos objetivos de criarmos linguagens de programação é tornar mais simples para os seres humanos o processo de utilizar máquinas para resolver problemas. Nesse esforço, também simplificamos as expressões regulares, abstraindo conceitos matemáticos complexos em símbolos mais simples. Por exemplo, usamos o símbolo | (barra vertical) para representar a união, o ? (ponto) para representar a concatenação e o * (asterisco) para representar o fechamento de Kleene. Com essas informações em mente, marque a alternativa correta. a ) b ) c ) d ) e ) Ver justificativa da resposta QUESTÃO 4 Para que uma máquina possa executar um algoritmo, temos duas opções: ou escrevemos o código usando o código binário ou traduzimos uma linguagem de programação nesse binário. A tradução tornou a programação simples e permitiu a criação de toda a tecnologia que temos hoje. Levando em conta esses conceitos, considere as afirmativas a seguir. 1. Programar em Assembly permite obtermos o máximo de performance sem conhecimento daarquitetura da máquina. 2. O código de máquina gerado para uma arquitetura, como já está otimizado, pode ser utilizado em arquiteturas diferentes. 3. O processo de compilação gerará um código de máquina diferente para arquiteturas diferentes. Agora marque a alternativa correta. a ) Apenas as afirmativas 1 e 2 estão corretas. b ) Apenas a afirmativa 1 está correta. c ) Apenas a afirmativa 3 está correta. d ) Apenas as afirmativas 1 e 3 estão corretas. e ) Apenas a afirmativa 2 está correta. Ver justificativa da resposta QUESTÃO 5 O processo de análise semântica pode ser feito de forma dinâmica, em tempo de execução, ou estática, em tempo de compilação. A escolha, pelos criadores da linguagem, das técnicas de anotação e validação de tipos definirá se a análise semântica será estática ou dinâmica. Considere as seguintes afirmações. 1. Independentemente de a análise semântica ser estática ou dinâmica, só existem duas ações possíveis: correção do erro ou aviso do erro. 2. Na análise sintática ou dinâmica, se você usar um compilador, deverá configurá-lo para apresentar todos os warnings. 3. Existe apenas uma validação que não pode ser realizada de forma dinâmica: a validação dos tipos. Selecione, entre as alternativas a seguir, aquela que está correta. a ) Apenas a afirmativa 2 está correta. b ) Apenas a afirmativa 1 está correta. c ) Apenas as afirmativas 1 e 2 estão corretas. d ) Apenas as afirmativas 1 e 3 estão corretas. e ) Apenas a afirmativa 3 está correta. Ver justificativa da resposta QUESTÃO 6 Uma forma interessante de analisar a aplicação de tipos utiliza como base o cálculo de sequentes. Nesse cálculo, determinamos axiomas e operações e, para cada operação realizada no código, tentamos aplicar uma regra que permita deduzir se a operação está correta ou não. Considere as seguintes afirmações. 1. Um axioma é uma verdade relativa que depende do resultado das operações que serão realizadas com os tipos analisados. 2. O cálculo de sequentes se baseia em um contexto definido por uma catraca, as operações à esquerda da catraca são chamadas de conclusões, e as operações à direita são chamadas de suposições. 3. O cálculo de sequentes é uma forma de implicação simples, precisa e não ambígua de validar um tipo, encontrando a verdade de um conjunto de operações lógicas. Analisando as afirmativas anteriores, marque, entre as alternativas a seguir, aquela que está correta. a ) A afirmativa 3 está correta. b ) As afirmativas 1 e 2 estão corretas. c ) As afirmativas 2 e 3 estão corretas. d ) A afirmativa 2 está correta. e ) A afirmativa 1 está correta. Ver justificativa da resposta QUESTÃO 7 O processo de análise semântica é um processo contextual. Isso quer dizer que, para validar uma determinada declaração, precisamos levar em consideração o código que foi escrito antes dessa declaração e, em algumas linguagens, o código que foi escrito depois da declaração, até mesmo em outros arquivos. Nessa análise, a determinação de escopos é indispensável. Considerando a análise semântica e o conceito de escopo, marque a alternativa correta. a ) A definição de uma função cria um espaço de código onde não existe um escopo específico. b ) A análise de escopo pelo analisador semântico requer o uso de uma tabela de símbolos. c ) A existência de escopos torna impossível validar uma variável antes do seu uso. d ) Os escopos são definidos pelo analisador sintático e não têm relação com o código ou com a análise semântica. e ) O C, C++ e Java são exemplos de linguagens de programação que não usam o conceito de escopo. Ver justificativa da resposta QUESTÃO 8 O projeto LLVM disponibiliza uma estrutura de compilação baseada no uso de uma representação intermediária, um código intermediário. Assim foi possível criar um conjunto de módulos de front-end para cada linguagem de programação desejada e um conjunto de módulos de back-end para cada arquitetura alvo desejada. A força do projeto LLVM está, justamente, na representação intermediária. Considere as seguintes afirmativas. 1. O código intermediário do projeto LLVM é uma linguagem desenhada para permitir otimização manual, se for necessário. 2. A representação intermediária do projeto LLVM não pode ser considerada uma linguagem de programação por não ter uma estrutura de tipos. 3. A representação intermediária do projeto LLVM tem três formas distintas, uma textual, uma estrutura de memória e uma espécie de código binário parecido com o Bytecode do Java. a ) Apenas a afirmativa 1 está correta. b ) Apenas as afirmativas 1 e 3 estão corretas. c ) Apenas a afirmativa 2 está correta. d ) Apenas as afirmativas 1 e 2 estão corretas. e ) Apenas a afirmativa 3 está correta. Ver justificativa da resposta QUESTÃO 9 Algumas características do formato de executáveis do Windows, o formato PE, foram mantidas apenas por compatibilidade com o antigo formato dos executáveis do MSDOS. Hoje essas características são usadas apenas para indicar que um determinado programa não é compatível com o MSDOS. Considere as afirmativas a seguir. 1. Os únicos arquivos que precisam utilizar o formato PE para serem reconhecidos como executáveis, no Windows, são do tipo .exe. 2. No formato PE, o seu binário, executável no Windows, será armazenado em uma seção que não tem relação com as seções compatíveis com o MSDOS. 3. O formato PE usa a seção DOS Stub para disparar o seu programa, sempre que ele for executado em uma máquina MSDOS. Marque, entre as alternativas a seguir, aquela que está correta. a ) Apenas as afirmativas 1 e 2 estão corretas. b ) Apenas as afirmativas 1 e 3 estão corretas. c ) Apenas a afirmativa 2 está correta. d ) Apenas a afirmativa 1 está correta. e ) Apenas a afirmativa 3 está correta. Ver justificativa da resposta QUESTÃO 10 A principal função da otimização de código é garantir que o binário gerado com base no processo de tradução da linguagem de programação rode o mais eficientemente possível. Considerando as divisões didáticas do processo de compilação e a existência de um módulo nesse processo, responsável por essa otimização, avalie as afirmativas. 1. Toda a otimização realizada no código intermediário deve ser feita de maneira a não alterar o algoritmo codificado. 2. Os processos de otimização realizados no gerador de código intermediário são independentes da arquitetura alvo. 3. As linguagens utilizadas para a geração de código intermediário estão mais próximas da linguagem de programação que do Assembly. Marque, entre as alternativas a seguir, aquela que está correta. a ) Apenas as afirmativas 1 e 2 estão corretas. b ) Apenas as afirmativas 1 e 3 estão corretas. c ) Apenas a afirmativa 2 está correta. d ) Apenas a afirmativa 3 está correta. e ) Apenas a afirmativa 1 está correta. Ver justificativa da resposta