Buscar

ATIVIDADE_CONHECIMENTOS

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 5 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

UNIUBE – UNIVERSIDADE DE UBERABA
ATIVIDADE DE CONHECIMENTOS - COMPILADORES
Prof. Luciano Rodrigo Ferreira
Nome: Jonatas Bernardes de Oliveira. RA: 5141098.
CONSIDERAÇÕES:
Esta atividade deverá ser realizada durante o horário de aula e será considerada atividade avaliativa. Ao final postar este arquivo respondido no diário de bordo com título: “Atividade de Conhecimentos em Compiladores”.
QUESTÕES:
1 – Considere que, em uma linguagem de programação hipotética, um comando condicional IF exija o uso de THEN, representando a clausula então. Nesse caso, se a instrução THEN não for usada no código fonte, uma resposta do compilador na identificação do erro de programação estará
a) Nível léxico
b) Nível Sintático
c) Nível Semântico
d) Nível Lógico
e) Nível Assimétrico
2 - Considere a gramática string -> string + string | string – string |0|1|2|3|4|5|6|7|8|9 e a string como um único nó não terminal, que pode ser um dígito ou uma sentença. Nessa situação, a expressão 
10 – 4 + 3 possibilita criar quantas árvores de derivação distintas.
a) 3
b) 4
c) 5
d) 2
e) 1
3 - Dado o seguinte trecho de um programa em linguagem C:
A análise Léxica efetuada pelo compilador apontará a existência de tipos de itens léxicos tokens, tais como:
a) 6 identificadores, 3 de atribuição e 6 de pontuação
b) 2 identificadores, 2 de atribuição e 8 de pontuação
c) 3 identificadores, 1 de atribuição e 7 de pontuação
d) 5 identificadores, 2 de atribuição e 10 de pontuação
e) 4 identificadores, 1 de atribuição e 9 de pontuação
4 - A construção de um compilador deve ter como meta alguns objetivos, dentre os quais podemos citar: 
1. A produção de um código que gere um objeto eficiente
1. A minimização do tempo de compilação
1. A definição de tipos de variáveis de forma a não permitir alterações do seu tipo
1. A obrigatoriedade de procedimentos procedurais e lineares.
1. Somente as afirmativas I e III estão corretas
1. Somente as afirmativas II e III estão corretas
1. Somente as afirmativas I e IV estão corretas
1. Somente as afirmativas I e II estão corretas
1. Somente as afirmativas III e IV estão corretas
5 - No âmbito das linguagens formais, no processo de compilação, a fase de análise é composta pelas subfases: Análise Léxica, Análise Sintática e Análise Semântica. Assim, considere:
I. Durante a análise léxica, as palavras ou lexemas são guardados na tabela de símbolos e classificados de acordo com a linguagem, em palavras reservadas, comandos, variáveis e tipos básicos.
II. A Análise Sintática é responsável pela verificação da boa formação dos comandos da linguagem, de acordo com as regras especificadas pela gramática da linguagem, pois sentenças mal formadas, geralmente, interrompem o processo de compilação e são apresentadas como mensagens de erro.
III. No fim da análise sintática, temos a representação do programa original de forma hierárquica, onde o programa é representado por uma árvore sintática.
IV. A análise semântica mais comum consiste na verificação da consistência de tipos dos operandos envolvidos em operações aritméticas ou dos parâmetros passados a procedimentos.
É correto o que consta em:
a) I e II, apenas.
b) III e IV, apenas.
c) I, II e III, apenas.
d) II, III e IV, apenas.
e) I, II, III e IV.
6 - A verificação de uma frase para saber se a mesma faz parte da linguagem gerada pela gramática envolve sucessivas substituições da cadeia de símbolos, que ocorre do lado esquerdo da produção pela sua construção sintática correspondente, partindo do símbolo inicial. Estamos falando de: 
a) Gramática 
b) Derivação
c) Dicionário de Dados
d) Idioma
e) Autômatos
.
7 - A programação em linguagens de alto nível pressupõe a utilização de alguma ferramenta que permita a transformação do programa original em instruções que o processador da máquina seja capaz de executar. Compiladores e Interpretadores são dois desses tipos de programa, que têm como principal diferença o fato de que os compiladores:
a) geram, a partir do código fonte, um novo programa, chamado programa executável, que só então poderá ser executado; já os interpretadores fornecem um ambiente que permite a leitura e tradução direta do programa fonte, permitindo sua execução sem a necessidade de gerar um novo programa executável.
b) são capazes de operar em diversos ambientes, por exemplo, em máquinas virtuais, o que não é possível com interpretadores, que são feitos para uma determinada plataforma. 
c) são dependentes da linguagem utilizada, enquanto os interpretadores podem ser utilizados para qualquer linguagem de programação, já que não precisam gerar código e sim traduzir o código fonte. 
d) são mais confiáveis, pois o resultado final fica armazenado em um novo programa; já os interpretadores podem ocasionar a perda de informações.
e) são mais genéricos do que interpretadores, porque podem ser utilizados para qualquer tipo de linguagem de programação, ao contrário dos interpretadores, que só podem ser construídos para tipos específicos de linguagens.
8 – No trabalho prático que envolvendo a construção de um compilador foi utilizado como exemplo o site: http://webcomp.herokuapp.com/ onde demonstrava passo a passo, inclusive com os códigos fontes, a criação de um compilador, neste exemplo foram utilizadas ferramentas (bibliotecas) de apoio, quais são elas ?
a) Java e C++
b) Lex e Yacc
c) Python e Django
d) Léxica e Sintática
e) AFD e AFN 
9) Observe o trecho a seguir criado utilizando uma linguagem de programação “x” e comente onde é possível notar:
· O trecho do algoritmo que seja capaz de demonstrar a análise léxica 
· O trecho do algoritmo que seja capaz de demonstrar a análise sintática 
· O trecho do algoritmo que seja capaz de demonstrar a análise semântica
 
Programa “prova”
variáveis
 p : inteiro
começo
 p <- 1
 sempreque p < 5 execute
 tela (“olá mundo!”)
 p <- p + 1
 fimsempre
fim
A parte cinza é a análise léxica, pois é o processo de converter uma sequência de caracteres em uma sequência de tokens.
A parte rosa é a análise sintática, pois é onde se analisa uma sequência que foi dada entrada, para verificar sua estrutura gramatical segundo uma determinada gramática formal.
A parte verde é a análise semântica, pois é onde ocorre a verificação de tipos.
10 - Os métodos de análise sintática, comumente usados em compiladores, são classificados como: 
a) top-down / bottom-up
b) upside down / trash
c) cats / get 
d) mget / mput
e) cp / mv
11 – Ao realizar testes durante a elaboração de um compilador, um analista descobriu que havia, no compilador, um erro na checagem de tipos de variáveis em expressões, permitindo, por exemplo, a multiplicação entre tipos de dados que não poderia ocorrer. Em compiladores, a checagem de tipos de variáveis em expressões é uma função do:
a) Analisador Léxico
b) Analisador Semântico
c) Otimizador de código
d) Scanner
e) Linker
12 - Um analista está responsável pelo projeto de um compilador para uma nova linguagem que sua empresa está desenvolvendo. Este compilador deverá receber como entrada o código fonte do programa e gerar como saída o código de linguagem de máquina para um determinado processador e sistema operacional. O analista sabe que um processo de compilação é dividido em fases e que seu compilador deverá possuir todas as fases de um típico processo de compilação mesmo que elas NÃO sejam obrigatórias em outros compiladores. A fase que não faz parte de um processo de compilação e que, portanto, não seria necessária no projeto do analista é a:
a) Análise Léxica
b) Análise Sintática
c) Geração de código intermediário
d) Ligação de módulos
e) Otimização de código
13 - A linguagem regular pode ser reconhecida por um Autômato: 
a) Finito
b) Infinito
c) Gaussiano
d) Determinante
e) Independente
14 – Realize uma pesquisa e depois defina as diferenças entre Linguagem de Programação Estática (LPE) e Linguagem de Programação Dinâmica (LPD).
Estática
A definição básica da tipagem estática que uma linguagem de programação pode ter como característicaé que há uma verificação dos tipos usados em dados e variáveis para garantir que sempre está sendo usado um tipo que é esperado em todas as situações. Esta verificação é feita no código fonte pelo processo de compilação. Esta análise ajuda na chamada segurança de tipos na utilização dos dados pelo programa permitindo que o programador se preocupe menos com esta questão. O compilador fornece garantias que alguns problemas não poderão ocorrer após o programa passar por esta verificação, ou seja, erros são detectados logo, antes do programa ser efeticamente executado.
Uma variável não pode mudar seu tipo.
No entanto a tipagem estática pode causar uma falsa sensação de segurança. Só uma parte dos erros podem ser descobertos antecipadamente.
Exemplo (está em C# mas poderia bem ser pseudocódigo):
var x = 1;x = "1"; //erro de compilação, não pode trocar o tipo da variável
Dinâmica
Na tipagem dinâmica esta verificação também ocorre mas ela é feita em cima do dado em si, já que as variáveis podem conter qualquer tipo de dado. Claro que em determinado momento uma variável só pode conter um tipo de dado e isto é verificado. Mas a principal diferença é que a esta verificação é feita em tempo de execução. Isto é feito através de uma infraestrutura auxiliar (uma máquina virtual ou uma biblioteca normalmente chamada de runtime). É comum o programador ter que fazer suas próprias verificações no programa ou em códigos externos de teste para garantir que todos os tipos estão corretos nos momentos certos. O programador tem que se preocupar mais com os tipos embora em soluções simples pode parecer que a preocupação não seja necessária.
O que é dinâmico efetivamente é o tipo da variável. Entender e documentar os tipos ainda são necessários. Há linguagens que incentivam fazer a documentação no código com notação húngara.
Dados precisam ser representados concretamente no computador. Variável é um design pattern. Portanto é uma abstração. Dados não podem assumir várias formas, no máximo pode ser interpretados de formas diferentes em casos específicos. Variáveis podem se referenciar a tipos de diferentes. Portanto a tipagem dinâmica costuma ser um caso especial da tipagem estática. Segundo Bob Harper, um dos criadores da linguagem Standard ML, “uma linguagem dinamicamente tipada é uma linguagem estaticamente tipada com apenas um tipo estático”.
Na prática a tipagem dinâmica é uma abstração também. Há uma ilusão que você pode se referenciar a um dado que possui diferentes tipos mas na prática existe apenas um marcador e há um apontamento para um dado estático diferente.
As técnicas mais comuns para alcançar esta ilusão é o uso de um tipo união (union em C/C++) e/ou ponteiros sem especificação de tipo (void * em C/C++). Todos os dados terão algum overhead de memória.
Exemplo (está em JavaScript mas poderia ser pseudocódigo, note que a sintaxe é idêntica ao exemplo anterior mas a semântica é diferente)
var x = 1;x = "1"; //operação normal, o tipo que era um number passa ser string
15 - A construção de um compilador deve ter como meta alguns objetivos, dentre os quais podemos citar:
1. A produção de um código que gere um objeto eficiente
1. A minimização do tempo de compilação
1. A definição de tipos de variáveis de forma a não permitir alterações do seu tipo
1. A obrigatoriedade de procedimentos procedurais e lineares.
a) Somente as afirmativas I e III estão corretas
b) Somente as afirmativas II e III estão corretas
c) Somente as afirmativas I e IV estão corretas
d) Somente as afirmativas I e II estão corretas
e) Somente as afirmativas III e IV estão corretas

Continue navegando