Baixe o app para aproveitar ainda mais
Prévia do material em texto
20/11/2021 Rio de Janeiro, RJ Disciplina: Compiladores Aluno: André Luiz Braga Vasco de Paula Matrícula: 20201103664 A A2 foi dividida em 4 trabalhos individuais. O presente documento foi dividido então em partes iguais para a resolução de cada trabalho. Para facilitar a navegação, utilize os seguintes links para navegar pelo documento: Trabalho 1 Trabalho 2 Trabalho 3 Trabalho 4 Trabalho 1 de 4 (29/10/2021) 1. Cite e explique os princípios que fundamentam a compilação just-in-time e sua evolução ao longo dos anos. O compilador JIT é executado após o início do programa e compila o código (normalmente bytecode ou algum tipo de instrução da máquina virtual) em tempo real (ou just-in-time, como é chamado) em um formato geralmente mais rápido. O JIT tem acesso a informações em tempo de execução dinâmico, enquanto que um compilador padrão não, permitindo que ele faça otimizações no código, como funções embutidas que são usadas com frequência, levando a códigos mais rápidos; É um claro contraste com o compilador tradicional que compila todo o código em linguagem de máquina antes da execução do programa. UVA Tijuca Aluno: André Luiz Braga Vasco de Paula - 20201103664 2. Faça uma análise da figura abaixo e explique sua arquitetura e o processo do compilador “just-in-time”. Compilador Otimizador é responsável, como seu nome sugere, por aplicar otimizações no código, que podem utilizar algumas informações como tipo de dados, que são coletadas em tempo de compilação, pelo offline profiler, ou execução, pelo online profiler, para especializar o código e deixá-lo mais eficiente; Online Profiler: Coleta as informações do programa e monitora as unidades de código executadas, permitindo assim a geração de código focado nas unidades; Offline Profiler: Coleta informação de tempo de inicialização de programas e da compilação que serão utilizadas pelo compilador no processo de geração e análise de código; Gerente de compilação: Encarregado de criar um planejamento de compilação para o compilador otimizador utilizado durante a geração de código. Pode utilizar as informações obtidas pelo online e offline profilers para isto. UVA Tijuca Aluno: André Luiz Braga Vasco de Paula - 20201103664 Compilador base: Gera código nativo em tempo de execução para todas unidades invocadas. Gerente de código: Como o nome sugere, ele gerencia as áreas do código do programa. Possui duas tarefas: Enviar a versão correta da unidade de código acionada para execução e enviar uma unidade de código para recompilação ou compilação. Monitor: Tem como objetivo atualizar os parâmetros de frequência. 3. Quais ou qual é a vantagem de se utilizar um compilador JIT? A grande vantagem do compilador JIT é que ele permite o aumento do desempenho na execução de programas, uma vez que os ambientes de execução compilam o código em tempo de execução para código de máquina, aumentando a performance, no lugar de avaliar e executar linha por linha como em interpretadores tradicionais. Como citado anteriormente, o compilador JIT utiliza estratégias de compiladores e interpretadores, buscando sempre otimizar a execução. Trabalho 2 de 4 (05/09/2021) 1. Julgue o item que se segue a respeito das características da linguagem PHP e de compiladores. Compilador é o programa que traduz o código fonte de uma linguagem de programação de alto nível para uma linguagem de programação de baixo nível. ( X ) Certo () Errado UVA Tijuca Aluno: André Luiz Braga Vasco de Paula - 20201103664 2. Com relação a linguagens de programação e compiladores, julgue os itens subsequentes. A etapa de análise semântica de um compilador tem como objetivo verificar os inter-relacionamentos de um programa, validando tipologias, fluxos de controle e unicidade na declaração de variáveis. ( X ) Certo ( ) Errado 3. Com relação a linguagens de programação e compiladores, julgue os itens subsequentes. Chama-se cruzado o compilador que gera um programa que seja executável em pelo menos um sistema operacional diferente daquele onde o compilador tenha sido executado. ( X ) Certo ( ) Errado 4. Com relação a linguagens de programação e compiladores, julgue os itens subsequentes. Em um compilador, os tokens são identificados na fase de análise léxica e são representados por três propriedades: classe, valor e posição. ( X ) Certo ( ) Errado 5. No que se refere à compilação e interpretação de programas, julgue os próximos itens. Os interpretadores, em vez de produzirem um programa objeto, fruto da tradução, executam diretamente as operações especificadas no código fonte. ( ) Certo ( X ) Errado UVA Tijuca Aluno: André Luiz Braga Vasco de Paula - 20201103664 6. No que se refere à compilação e interpretação de programas, julgue os próximos itens. Compilador é um utilitário responsável por executar um programa objeto diretamente na máquina. ( ) Certo ( X ) Errado 7. A respeito de softwares básicos e aplicativos, julgue os itens subsecutivos. O interpretador é considerado um tradutor que não gera código-objeto, mas que, diferentemente do compilador, traduz o programa linha a linha, ou seja, o programa é executado à medida que é traduzido. ( X ) Certo ( ) Errado 8. Assinale a opção correta, LEVANDO EM CONSIDERAÇÃO AS QUESTÕES ACIMA a) ( ) A conversão da representação física das instruções para código lógico é feita pelo Gerador. b) ( X ) O compilador é responsável por gerar um programa em linguagem de máquina não executável, a partir de um programa escrito em uma linguagem de alto nível. c) ( ) A conversão da representação simbólica das instruções para código criptografado é feita pelo Registrador. d) ( ) O compilador é responsável por gerar um programa em linguagem de alto nível não executável, a partir de um programa escrito em uma linguagem de máquina executável. e) ( ) O cointerpretador é responsável por gerar um programa em linguagem de máquina não interpretável, a partir de um programa escrito em uma linguagem de usuário UVA Tijuca Aluno: André Luiz Braga Vasco de Paula - 20201103664 Trabalho 3 de 4 (12/11/2021) 1. Dê uma definição para os termos seguintes: a. Símbolo Terminal; São os componentes básicos encontrados pelo léxico. Em alguns casos são chamados por “token names”, por exemplo, o primeiro componente do token produzido pelo léxico. b. Símbolo Inicial; Um símbolo não terminal que forma a raiz da árvore de análise; c. Símbolo não Terminal; Variáveis sintáticas que ajudam a definir a estrutura sintática da linguagem d. Produção; Uma regra que quando aplicada reescreve a sequência do fim para o início; 2. Considere a estrutura seguinte: struct { char type; int count; short size; double value; char swap[2]; float number; }; a. Qual a dimensão da estrutura em uma máquina de 32 bits com um alinhamento de 4 bytes? 28 bytes; b. Reorganize a estrutura de modo a otimizar o espaço ocupado sem perder o alinhamento; struct { double value; float number; int count; short size; UVA Tijuca Aluno: André Luiz Braga Vasco de Paula - 20201103664 char swap[2]; char type; }; c. Qual a dimensão da estrutura em uma máquina sem alinhamento (packed struct)? 21 bytes Trabalho 4 de 4 (19/11/2021) 1. De acordo com o exposto, crie um esquema. Como se fosse um mapa mental para resumir o conteúdo acima. Você pode utilizar e acrescentar outra referência, caso julgue necessário. O analisador usa um CFG (Gramática livre de contexto) para validar a string de entrada e produzir saída para a próxima fase do compilador. A saída pode ser uma árvore de análise ou uma árvore de sintaxe abstrata (ASG) Árvore de Análise ASG Uma árvore de instruções é uma representação gráfica do processo de troca durante a derivação. Uma ASG é uma forma condensada de uma Árvore de Análise. Numa Árvore de Análise: - Cada nó interno representa uma regra gramática; - Cada nó folha representa um terminal; Numa ASG: - Cada nó interno representa um operador; - Cada nó folha representa um operando; Árvores de Análise representam todo e cada detalhe da sintaxe real. ASGs não representamtodos os detalhes da sintaxe real (por isso são chamadas de abstratas). Árvores de Análise são menos densas do que ASGs para o mesmo construto de linguagem. ASGs são mais densas que Árvores de Análise. UVA Tijuca Aluno: André Luiz Braga Vasco de Paula - 20201103664 2. De acordo com o exposto, você deve colocar um trecho de código na linguagem C ou na linguagem Java. Depois, separar uma instrução e montar a árvore sintática para exemplificar o seu esquema de resumo public void function exemplo( ){ int a = 5; int b = 8; int c = 14; int resultado; resultado = (a+b) * (c-a)+( (b/a) * (a + b) ) } O primeiro passo que devemos fazer é transformar a expressão armazenada na variável resultado (que está em notação Infix, utilizada em expressões lógicas e aritméticas) e devemos convertê-la para uma notação Postfix, uma vez que desta forma a análise se torna mais rápida. Portanto, temos que: (INFIX) (a+b) * (c-a)+( (b/a) * (a + b) ) → (POSTFIX) a b + c a - * b a / a b + * + Podemos então construir nossa árvore; Passo 1: Passo 2: UVA Tijuca Aluno: André Luiz Braga Vasco de Paula - 20201103664 Passo 3: Passo 4: Passo 5: Passo 6: Passo 7: UVA Tijuca Aluno: André Luiz Braga Vasco de Paula - 20201103664
Compartilhar