Compiladores
1. Componente Curricular:
Compiladores.
2. Carga Horária:
60 horas
3. Objetivo:
Tendo como base a execução de atividades práticas e o desenvolvimento de produtos, apresentar ao estudante os principais conceitos relacionados a construção dos compiladores.
4. Ementa Oficial:
Estrutura do Compilador. Análise Léxica. Análise Sintática. Análise Semântica. Geração de Código Intermediário. Otimização. Geração de Código. Geradores de Analisadores Léxicos e Semânticos.
5. Conteúdo Programático:
1. Introdução
Conceitos Básicos e Estrutura dos Compiladores.
Visão Geral do Desenvolvimento dos Compiladores.
2. Análise Léxica
Conceitos Básicos e Expressões Regulares.
Autômatos Finitos e Reconhecedores.
3. Análise sintática
Gramática livre de contexto.
Análise sintática descendente.
Análise sintática ascendente.
4. Análise semântica
Verificação de Tipos e Análise Dirigida.
Gestão de Nomes e Tipos de Dados.
5. Geração de código
Modelos e Ambientes de Execução de Códigos.
Código Intermediário.
Geração de Código Intermediário.
6. Abordagem Metodológica:
Aprender fazendo e fazer aprendendo. As ações implementadas têm como foco o aprendizado do desenvolvimento de Compiladores pelo uso de recursos computacionais - privilegiando o projeto por simuladores e o desenvolvimento prático; seguido de exposições teóricas, apoiadas por: simulações, slides e vídeos. Em resumo, a metodologia tem como base a tríade Conteúdo, Atividade e Produto.
A nota final será dada pelas avaliações dos artefatos (relatório, lista de exercício - manuscritas, apresentação oral, pôster, postagem, vídeo, ...) produzidos durante as aulas e entregues em cada uma das datas especificadas. O aluno também será avaliado através de outros recursos, como p.ex. a frequência e a apresentação de artefatos não obrigatórios - os quais poderão até ter pontuação extra.
7. Plano de Aprendizado:
Aula 1
Conteúdo:
Conceitos Básicos e Estrutura dos Compiladores.
Atividades:
Entendendo um compilador pela observação de suas Fases de Execução.
Discutindo a viabilidade da criação de um "compilador" do K&S Simulator (ISA) para o 8 Bits Assembler.
Máquinas diferentes, mas de mesmo nível, podem ter compatibilidade na execução de atividades?
Diferenças nos modos de endereçamento de dados inviabilizam a tradução entre códigos de máquinas?
Avaliativas:
Especificar uma linguagem simples para cada máquina virtual. Observar as características de cada máquina (1.5 e 1.6).
Para uma máquina PC, desenvolver um "interpretador" para a linguagem especificada.
Iteração para leitura e processamento das instruções (funções), criando tabela de dados e etiquetas; ou
Usar uma linguagem como PHP (via "macro substituição" de código) para "compilar" para esta plataforma.
Criar uma máquina virtual "intermediária" a partir das máquinas citadas. Observar o melhor de cada máquina (1.4).
Especificar uma linguagem simples para esta máquina.
Criar um tradutor do K&S Simulator para o 8 Bits Assembler; e vice-versa.
Produtos:
Aula 2
Conteúdo:
Visão Geral do Desenvolvimento dos Compiladores.
Atividades:
Observando a visão geral do compilador e do seu trabalho.
Uma nova visão para as suas Fases de Execução.
Ressaltando a complexidade do trabalho do compilador.
Em uma linguagem de alto nível podemos ter c = a * 2 + b;
Qual código de linguagem de máquina para o K&S, poderia ser equivalente a expressão anterior?
Avaliando o trabalho dos analizadores léxicos e sintáticos. Onde está o erro na imagem?
Adaptando a expressão anterior para uma inversão de prioridade como no exemplo: x = 2 * 7 + 3.
Como o compilador define as prioridades em uma expressão matemática? Explicando:
Entendendo a Notação infixa para pós-fixa.
Em exemplo com uma abordagem um pouco diferenciada.
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Produzir tutoriais sobre: Lex, Yacc, Padrões e Gramáticas.
Lista de exercícios do capítulo 1.
Produtos:
Aula 3
Conteúdo:
Análise Léxica: Conceitos Básicos e Expressões Regulares.
Atividades:
Observando a Visão Geral da Análise Léxica.
Listar os Tokens para a linguagem simples.
Identificando Tokens e reconstruindo a linha de comando a partir e uma "árvore léxica".
Construindo Expressões Regulares com o Regular Expression 101.
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Objetivando minimizar o trabalho do analisador léxico, quais mudanças poderiam ser feitas na linguagem simples?
Criar um analisador léxico para a linguagem simples, ou para outra linguagem qualquer.
Desenvolver um aplicativo simplificado, e em português, semelhante ao Regular Expression 101.
Produtos:
Aula 4
Conteúdo:
Análise Léxica: Autômatos Finitos e Reconhecedores.
Atividades:
Gerando um Diagrama e uma Tabela de Transição, a partir de uma Expressão Regular.
Desenvolvendo um Analisador Léxico simples (para a STM 0.1), com implementações usando:
Programação orientada a "solução" com autômato finito.
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Com relação a atividade anterior, desenvolver um Analisador Léxico para Programação orientada a "solução" com expressões regulares.
Lista de exercícios do capítulo 2.
Produtos:
Aula 5
Conteúdo:
Revisão de conteúdos e 1ª Avaliação.
Atividades:
Apresentação e Avaliação de trabalhos.
Produtos:
Relatório de Produto 1 e/ou Prova Prática 1.
Aula 6
Conteúdo:
Análise sintática: Gramática livre de contexto.
Atividades:
A Gramática Livre de Contexto (exemplo) no contexto das Linguagens na Hierarquia de Chomsky.
Reconhecendo declarações a partir de definições gramaticais e elementos léxicos: Trecho simplificado da gramática formal para a linguagem de programação C e uma derivação de um trecho de código C do símbolo não terminal.
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Produzir uma Gramáticas para que um programa na linguagem simples (ou outra a sua escolha) seja avaliado pelo Yacc.
Lista de exercícios do capítulo 3.
Produtos:
Aula 7
Conteúdo:
Análise sintática: Análise sintática descendente.
Atividades:
Implementando o Algoritmo da Análise Sintática Descendente.
Quando existir, eliminar recursividade esquerda.
Montar a Tabela de Análise Sintática.
Criar a árvore sintática a partir da tabela.
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Produzir uma Gramáticas para que um programa na linguagem simples (ou outra a sua escolha), de modo que esta seja usada em uma implementação de analisador sintático.
Lista de exercícios do capítulo 4.
Produtos:
Aula 8
Conteúdo:
Análise sintática: Análise sintática ascendente.
Atividades:
Detalhando o Algoritmo da Análise Sintática Ascendente.
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Lista de exercícios do capítulo 5.
Produtos:
Aula 9
Conteúdo:
Análise semântica: Verificação de Tipos e Análise Dirigida.
Atividades:
Definindo os papeis da Análise Semântica.
Detalhando algumas atividades das Verificações Estáticas.
Validação de tipos de dados em expressões e em declarações de sub programas.
A verificação do fluxo de controle tem como foco os alvos das instruções de desvio incondicional.
Tags e outros modos para delimitar blocos também devem ser verificados.
Determinar o escopo de variáveis declaradas em estruturas de controle e blocos.
Resumindo o trabalho do Analisador Semântico.
Usa da árvore de sintaxe e da tabela de símbolos para verificar consistência.
Suporte para geração de código.
Exemplo de Código para Avaliar Expressões.
Uso de ferramentas para a automação do processo.
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Lista de exercícios do capítulo 7 (7.1 a 7.3).
Produtos:
Aula 10
Conteúdo:
Revisão de conteúdos e 2ª Avaliação.
Atividades:
Apresentação e Avaliação de trabalhos.
Produtos:
Relatório de Produto 2 e/ou Prova Prática 2.
Aula 11
Conteúdo:
Análise semântica: Gestão de Nomes e Tipos de Dados.
Atividades:
Revisando o Trabalho do Compilador.
Visão geral da Tradução Dirigida por Sintaxe.
A relação da Gramática com as Ações Semânticas e possibilita a geração da Árvore de Sintaxe Anotada.
Exemplos de Árvores Sintática para suporte à Análise Semântica.
Exemplo de Árvore Sintática para suporte à Tradução (código intermediário).
Observando alguns problemas para compilação.
Verificando compatibilidade de tipos: exemplo de Tabela de Compatibilidade.
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Usar esta Gramática para fazer um programa que implemente a árvores para solução de problemas como: 2+4*6+8 e 2+4+6*8.
Lista de exercícios do capítulo 7 (7.4 a 7.6).
Produtos:
Aula 12
Conteúdo:
Geração de código: Modelos e Ambientes de Execução de Códigos.
Atividades:
Observando algumas dificuldades na gestão de memória da aplicação.
Diferença na alocação de dados das estruturas.
Variáveis Locais e herança múltipla gerando o problema da ambiguidade de nomes.
Verificando como valores são realmente armazenados por um computador.
Como são armazenados os ponteiros, vetores e estruturas?
Passagem de parâmetros por valor e por referência. Um exemplo "funcional".
Descobrindo sobre os registros de ativação.
Quais os dados manipulados por uma função? Verificar pilha de dados da função.
O "referenciamento indireto" dificultando o controle dos dados passados por "valor".
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Diferentemente de C, em Python é possível criar uma função dentro de outra. Crie um programa simples que faça isso.
Lista de exercícios do capítulo 9.
Produtos:
Aula 13
Conteúdo:
Geração de código: Código Intermediário.
Atividades:
Explorando a Geração de Código.
Tipos de código intermediário: HIR, MIR, LIR e EIR.
Representação de cada Tipo.
HIR e MIR: Árvore e grafo de sintaxe; Notações Pré e Pós Fixadas e Representações linearizadas.
LIR e EIR: Instruções Assembly.
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Lista de exercícios do capítulo 10.
Produtos:
Aula 14
Conteúdo:
Geração de código: Geração de Código Intermediário.
Construção de compiladores: Geração de código intermediário.
Atividades:
Exemplo usando Código de Três Endereços.
Comentários sobre chamadas de sistema em um código final real.
Exemplos e execução de códigos fontes, "intermediários", "otimizados" e "finais".
Avaliativas:
Usar o apresentado hoje nas atividades já propostas.
Lista de exercícios do capítulo 11.
Produtos:
Aula 15
Conteúdo:
Revisão de conteúdos e 3ª Avaliação.
Atividades:
Apresentação e Avaliação de trabalhos.
Produtos:
Relatório de Produto 3 e/ou Prova 3.
8. Bibliografia Básica:
Alfred, V.A.; Lam, M.S.; Sethi, R.; Ullman, J.D. Compiladores: Princípios, Técnicas e Ferramentas. Pearson, 2a Edição, 2007.
Louden, K.C. Compiladores: Princípios e Práticas. Cengage, 2006.
Toscani, S.S.; Price, A.M.A. Implementação de Linguagens de Programação: Compiladores. Bookman, 3a Edição, 2008.