Um Compilador Em Java Para Fins Didáticos
|
|
- Diogo da Rocha Paixão
- 6 Há anos
- Visualizações:
Transcrição
1 Universidade de São Paulo Instituto de Matemática e Estatística MAC0499 Trabalho de Formatura Supervisionado Um Compilador Em Java Para Fins Didáticos Iniciação Científica Aluno: Daniel Sguillaro Orientador: Prof. Dr. Alan M. Durham
2 I Parte objetiva Introdução Cursos de graduação em Ciência da Computação normalmente possuem em seu currículo uma disciplina que trata dos diferentes paradigmas de programação. Ao cursá-la, o aluno costuma ter dificuldades no aprendizado de tais paradigmas pois geralmente só teve contato com uma forma de programação até então. Como os paradigmas são ensinados através das linguagens que os representam, surge uma dificuldade adicional: o aluno precisa se familiarizar com diferentes sintaxes, nomes de funções, uso de compiladores, etc. Esta monografia apresenta a proposta de implementação de um compilador para o sistema de interpretação de linguagens utilizado no curso MAC0316 (Conceitos Fundamentais de Linguagens de Programação) do IME-USP. Esse sistema tem fins didáticos e visa resolver o problema descrito no parágrafo anterior. Foi desenvolvido em Java pelo Prof. Alan Durham, tendo sido baseado em sistema de funcionalidade semelhante originalmente desenvolvido por Samuel Kamin.
3 Para resolver o problema descrito acima, implementou-se uma série de interpretadores, um para paradigma de programação a ser estudado. Os interpretadores possuem a mesma sintaxe básica (da linguagem LISP) e podem ser facilmente extendidos para acomodar os diferentes conceitos presentes em cada paradigma diferente de programação. Por causa dessa facilidade em extender o sistema, consideramos que ele seja um arcabouço para construção de tradutores. Daqui em diante, chamaremos o sistema desenvolvido de arcabouço Java, ou simplesmente arcabouço. Um dos principais pontos fortes do arcabouço é a possibilidade do usuário poder estudar e alterar/extender a implementação da linguagens apresentadas. Além disso, sua arquitetura deixa bem claro as semelhanças e diferenças entre cada um dos interpretadores desenvolvidos. Os paradigmas implementados são para linguagens funcionais (incluindo avaliação sob demanda), orientadas a objetos, e lógicas. Existe também um interpretador básico para que o usuário possa primeiro se familiarizar com a sintaxe, com a principal estrutura de dados disponível (as listas) e com o uso de recursão como principal método de controle de fluxo. Inicialmente, iremos apresentar os conceitos básicos de compilação. Em seguida introduziremos o conceito de interpretação, e mostraremos sua diferença em relação à compilação. Feito isso, podemos mostrar a estrutura do arcabouço Java
4 e explicar o que deve ser modificado nele para adicionar as funcionalidades propostas. O processo de compilação Um compilador pode ser definido como um programa que lê outro programa escrito em uma certa linguagem (chamado programa-fonte) e o traduz para outro programa equivalente, porém escrito em outra linguagem (chamado programaobjeto). Independentemente dessas duas linguagens, os conceitos básicos de compilação são essencialmente os mesmos, e iremos expor esses conceitos aqui. Compilar um programa não é uma tarefa fácil. Dividir o processo de compilação em partes é essencial. Esse processo pode ser dividido nas seguintes partes: análise: decompõe o programa-fonte em suas partes básicas. Essa fase pode por sua vez ser subdividida nas seguintes partes: o análise léxica: o analisador léxico recebe como entrada o próprio programa-fonte, que nada mais é que um stream de caracteres e lê o programa linearmente. O analisador léxico deve identificar os elementos mais básicos do programa, como nomes de variáveis, constantes, palavras-chave, constantes, operadores, etc, que constituem classes da linguagem fonte. Deve também remover
5 conteúdo irrelevante para o processo de compilação, como por exemplo os espaços em brancos e os comentários. O resultado deste processo é um stream de tokens, onde cada um dos tokens é um representante de uma das classes descritas acima. o análise sintática: o analisador sintático recebe como entrada o stream de tokens gerado pelo analisador léxico. Sua função é agrupar os tokens de uma forma hierárquica, determinando a estrutura do programa-fonte. O resultado deste processo é uma árvore sintática, representando a estrutura do programa. o análise semântica: o analisador semântico recebe como entrada a árvore sintática gerada pelo analisador sintático. Sua função é verificar o significado do programa-fonte, por exemplo verificando se um operador recebeu o número correto de operando. O resultado deste processo é um código em algum formato intermediário, como por exemplo o formato de quádruplas, descrito a seguir. síntese: usa a decomposição feita no processo de análise para gerar o programa-objeto. Pode ser subdividida nas seguintes partes
6 o geração de código: recebe como entrada o código em formato intermediário e gera (geralmente) código assembler ou código de máquina. o otimização de código: recebe como entrada o código gerado e faz otimizações nesse código com o intuito de tornar o programa-objeto mais eficiente. Compilação vs. Interpretação A compilação não é a única forma de tradução de código. Existem também uma forma chamada interpretação. No processo de interpretação, o tradutor processa o código fonte juntamente com os dados fornecidos pelo usuário. Assim, ele atua de maneira interativa, executando o programa na medida que os comandos e/ou expressões são lidos (fig. 1). Figura 1 Processo de interpretação
7 Já na compilação. o código é traduzido em um primeiro momento (chamado tempo de compilação), gerando o programa-objeto. Em um segundo momento (chamado tempo de execução) o programa-objeto é executado diretamente pelo processador da máquina (fig. 2). Figura 2 Processo de compilação Ambas as formas são de tradução possuem suas vantagens e desvantagens, e são amplamente utilizadas na prática. O arcabouço Java O arcabouço Java traduz código usando a interpretação. Sua implementação foi feita da seguinte forma:
8 As classes TokenStream e Token (e suas subclasses) implementam o módulo de análise léxica. A classe ExpressionParser implementa o módulo de análise sintática A classe Environment é responsável por armazenar o estado de execução do interpretador. Essa classe contém os valores associados às variáveis, escopo de nomes, etc. São implementados usando estruturas que contém elementos do tipo par chave-valor, onde a chave é o nome do identificador (tipo String) e o valor é um Object que pode ser qualquer valor associado àquele nome em um dado momento da execução. A classe Expression e suas subclasses são implementada usando o padrão Interpreter, onde cada classe implementa a semântica de um elemento da árvore abstrata gerada pelo analisador sintático. A hierarquia de classes com raiz em Expression é mostrada na fig. 3. Essas subclasses representam números (NumberExp), cadeias de caracteres (SymbolExp), listas (CellExp), operações primitivas (OperationClosure), funções de usuário (Closure), chamadas de função (ApplicationExp), nomes de identificadores (VariableExp), etc. O interpretador avalia a árvore abstrata gerada chamando o método Expression.evaluate() do elemento na raiz da árvore abstrata. Esse método
9 retorna para o interpretador um Expression que é impresso usando o seu método tostring(). etc... Figura 3 Hierarquia de classes com raiz em Expression O compilador Como a compilação é uma forma de tradução de código muito usada, seria interessante que o usuário do arcabouço também tivesse contato com essa forma de tradução. Por isso, estamos extendendo-o de forma que também possa compilar o código-fonte. Um dos principais objetivos da elaboração inicial do arcabouço em Java foi mostrar de forma clara quais as semelhanças e diferenças na implementação de cada uma das linguagens apresentadas. Seguindo essa mesma filosofia, o
10 compilador está sendo implementado de forma que sejam aproveitados vários módulos do arcabouço. Isso irá mostrar ao aluno quais as semelhanças e diferenças entre a compilação e a interpretação. Assim, todo o front-end, do qual fazem parte os módulos de análise léxica, sintática e semântica pôde ser usado sem modificações. A compilação se dá através da adição do método compile() às classes da hierarquia de Expression. O código objeto que estamos gerando não é um código de máquina específico, nem linguagem de montagem ( assembly language ). O formato escolhido foi o de quádruplas. As instruções tem o seguinte formato: <operador>, <operando1>, <operando2>, <resultado>. Esse formato foi escolhido por dois motivos. Portabilidade do código gerado: podemos traduzir facilmente quádruplas para qualquer linguagem assembly, já que elas são quase uma forma neutra de assembly. Alternativamente, podemos implementar máquinas virtuais que interpretam as quádruplas. A vantagem em usarmos máquinas virtuais é que caso se queira mover o compilador para outra máquina, é muito mais fácil reescrever a máquina virtual do que o compilador inteiro. Esta é a abordagem que escolhemos para executar o código. Otimização de código: o formato de quádruplas é ideal para realizarmos otimizações
11 Tabelas de símbolos As tabelas de símbolos (TS) são a estrutura de dados do compilador que substituem os ambientes do interpretador. Sua função é auxiliar o compilador na geração de código objeto. Na verdade, essas tabelas são bem semelhantes aos ambientes. Assim como os ambientes, elas também contém elementos do tipo par chave-valor; as operações também são semelhantes - inserção, alteração, busca e remoção; e finalmente, elas também possuem uma estrutura hierárquica, ou seja, tabelas podem conter sub-tabelas. O que as difere dos ambientes é conteúdo que armazenam. Enquanto nos interpretadores os ambientes armazenam o estado da execução do programa, ou seja, o valor associado a cada identificador em cada momento, nos compiladores isso não faz sentido já que o programa não será executado e sim apenas traduzido. Assim, as TS irão armazenar uma série de atributos associados às variáveis usadas no programa. No caso de variáveis globais, a TS irá armazenar o endereço da variável, ou seja, o local da memória onde seu valor será ramazenado. No caso de palavras reservadas para as operações primitivas será armazenado o objeto que
12 implementa essa primitiva já que este sabe se compilar através do método compile(). Para variáveis locais a funções, armazenamos a sua posição no registro de ativação, pois o espaço destinado a essa variável será alocado somente em tempo de execução, não tendo posição fixa de memória. Como foi dito anteriormente, as tabelas de símbolo contém objetos do tipo par chave-valor. A chave é um objeto do tipo String, representando o nome do identificador. O valor é um objeto do tipo SymbolTableEntry que contém os atributos descritos acima. Máquina Virtual O modelo da máquina virtual ainda está sendo estudado pelo autor, e ainda não foi implementado. A divisão da memória provavelmente será feita da seguinte forma: existirão duas áreas distintas, uma para o código que armazena as instruções do programa, e outra para os dados do programa. A área de dados por sua vez, é dividida em três partes: as áreas de dados estáticos, pilha e heap. Haverão três registradores, dois acumuladores genéricos (acc1 e acc2) e um registrador para gerenciar a pilha (topo_pilha).
13 Finalmente, a linguagem da máquina virtual será a linguagem de quádruplas descrita anteriormente. Depuração Programas executados em qualquer um dos interpretadores do arcabouço podem ser depurados com qualquer depurador Java. Isto não acontece com os programas compilados, pois estes são executados em uma máquina virtual criada pelo autor. Por isso, será criado um depurador para os programas compilados. Infelizmente, até o momento o depurador não foi implementado. Otimização de código Idealmente um compilador deveria gerar código tão bom quanto código escrito à mão. Porém, isso é quase impossível de ser alcançado. Por isso, precisamos lançar mão de técnicas de otimização de código. O arcabouço terá um otimizador de código compilado mas, novamente, infelizmente este ainda não foi implementado. Conclusões
14 O arcabouço java é uma ecelente ferramenta didática para o aprendizado dos diferentes paradigmas de programação pelos alunos. Conhecer e alterar sua implementação o torna ainda mais interessante, e este projeto está sendo especificamente importante nesse ponto. O usuário pode conhecer a implementação de um compilador e ver as diferenças e semelhanças entre a compilação e a interpretação. Além disso, pode conhecer as técnicas para otimizar o código gerado. Referências bibliográficas [1] DURHAM, A. M. ; CONCEICAO, A. F. ; SUSSUMU, E. ; LIMA, A. M. ; TEGLIA, J. ; SANTOS, M. B. - A Framework for Building Language Interpreters. In: Educator's Symposium - OOPSLA' 03, 2003, Anaheim. OOPSLA'03 Companion, p [2] KAMIN, SAMUEL N. - Programming Languages: An Interpreter Based Approach. Addison-Wesley, [3] AHO, A. V. ; SETHI, R. ; ULLMAN, J. D. - Compilers: Principles, Techniques, and Tools. Addison-Wesley, [4] TREMBLAY, J. P. ; SORENSON P. G. - The Theory And Practice Of Compiler Writing. McGraw-Hill, 1985
15 [5] GAMMA, E. ; HELM, R. ; JOHNSON, R. ; VLISSIDES, J. - Design Patterns: Elements of Reusable Software. Addison Wesley, II - Parte subjetiva Escolha do Tema Ao ingressar em um estágio no início de 2005 imaginava fazer o trabalho de formatura baseado nessa experiência. Porém, conforme o tempo ia passando vi que a área de desenvolvimento era um pouco tediosa por não oferecer muitos desafios, ou pelo menos desafios que não me causavam muito interesse. Comecei a considerar a opção de seguir carreira acadêmica, e para ter certeza que essa esta a opção correta decidi fazer uma iniciação científica (IC). Nos últimos anos tive a curiosidade de estudar compiladores, principalmente por sua complexidade e por o tema ter um ótimo balanço entre teoria e prática. Esse
16 desejo não foi saciado pois a disciplina não é oferecida há alguns anos, já que é optativa. Assim, a escolha desse tema para a IC foi algo natural. Procurei o Prof. Alan Durham para ser meu orientador por saber do seu interesse na área e por ser seu aluno na disciplina MAC0316 (Conceitos Fundamentais de Linguagens de Programação) na época. Desafios e frustrações Um dos principais desafios do projeto foi ter que aprender um tema tão complexo quanto compiladores. Consequentemente, implementar o compilador também está sendo uma tarefa complexa e certamente é um desafio. Outro desafio foi ter que extender o arcabouço (ao invés de fazer uma implementação completa) pois a arquitetura do arcabouço existente é excelente, o que fez com que eu quisesse manter essa qualidade. Assim, por muitas vezes me vi gastando horas e horas analisando se a arquitetura do compilador estava em um nível tão bom quanto o restante do arcabouço. Em uma situação dessas, você não segue tanto os instintos, está sempre analisando cada pequena coisa que faz, e isso faz a sua produtividade diminuir. Mas certamente a qualidade final é melhor.
17 Como principais frustrações, posso citar o fato de não ter conseguido dedicar o tempo que gostaria ao projeto no segundo semestre. Como consequência, não consegui terminar a implementação no tempo proposto. Mas tenho certeza que terminarei o projeto até a data da recuperação. Interação com o orientador A leitura dos textos sugeridos por meu orientador foram essencias para que o projeto tomasse forma, pois a princípio o projeto seria fazer uma refatoração total no interpretador Prolog. A leitura e a discussão desses textos com ele foi o que nos fez mudar de idéia e trocar o tema para o que estamos fazendo hoje. Além disso, os textos lidos foram e estão sendo de enorme ajuda para minha implementação. Durante o primeiro semestre tivemos reuniões semanais sempre em um horário fixo, pois eu tinha pouco tempo disponível já que trabalhava em tempo integral. Essas reuniões eram praticamente o único momento disponível para discutirmos os temas estudados, e eu precisava aproveitar essas reuniões da melhor forma possível. Com a minha saída do estágio no meio do ano as reuniões passaram a ter caráter mais informal, já que o meu tempo na faculdade já não era mais escasso. O fato de poder passar em sua sala quando estava emperrado em alguma parte da implementação, ou mesmo para tirar pequenas dúvidas está sendo de grande ajuda.
18 Meu orientador está sendo um grande incentivador para que o projeto termine. O fato de ele desejar usar meu trabalho na disciplina MAC0316 também é um grande incentivo, e até um motivo de orgulho para mim. Colocando um pouco o projeto de lado, gostaria de mencionar que também estou recebendo seu incentivo para ingressar no mestrado (a princípio na área de bioinformática), algo que estou considerando seriamente. BCC vs. IC Conciliar o BCC com a IC não é uma tarefa fácil. As disciplinas que cursamos exigem uma grande dedicação, principalmente no que diz respeitos aos exercícios-programa (EPs). Fazer IC exige uma dedicação tão grande quanto as disciplinas. Mesmo assim não tenho reclamações, pois é uma experiência gratificante. A forma de trabalho na IC é bem diferente em relação às matérias do curso. No BCC temos que nos dedicar a várias disciplinas ao mesmo tempo enquanto na IC nos dedicamos a um único tema. Outra diferença é que no BCC temos o professor explicando toda a matéria e passando o conteúdo na lousa, enquanto na IC temos que ler uma boa quantidade de material por conta própria. Porém nas disciplinas o contato para tirar dúvidas com o professor geralmente é pequeno, enquanto na IC o contato com o orientador é bem maior.
19 O grau de exigência na IC também é bem maior. No curso podemos entregar um EP com qualidade duvidosa e mesmo assim tirar uma nota alta. Na IC a qualidade dos trabalhos deve ser sempre excelente. Disciplinas do BCC mais relevantes para o projeto MAC Estrutura de Dados: o aprendizado de estruturas como árvores e tabelas de símbolos foi fundamental para o entendimento do arcabouço existente e sua ampliação. Fica apenas uma crítica: cursei a disciplina duas vezes pois na primeira vez não tive tempo de fazer todos os exercícios-programa, e posso afirmar que o conteúdo da segunda vez foi um pequeno subconjunto do conteúdo do ano anterior. Na minha opinião os alunos que cursaram a disciplina nesse ano tiveram um grande buraco em sua formação. MAC0211 Laboratório de Programação I: O contato com uma linguagem de baixo nível como o assembler me ajudou muito no projeto, já que o nosso compilador traduz o código para uma linguagem muito parecida com esta. MAC0242 Laboratório de Programação II: Nesta disciplina, assim como em MAC0211, há um grande projeto em grupo em várias fases. No ano que cursei o projeto consistia de três módulos: compilador, máquina virtual e ambiente gráfico.
20 A experiência que tive desenvolvendo os dois primeiros módulos mencionados foi de grande ajuda no projeto, apesar de ter sido algo bem mais simples. Também tive contato com analisadores léxicos e sintáticos, que apesar de não serem usados no nosso projeto, são de grande ajuda no desenvolvimento de compiladores em geral. MAC0316 Conceitos Fundamentais de Linguagens de Programação: Tive contato com o arcabouço e com as linguagens que devem ser compiladas. Além disso é uma disciplina essencial por mostrar ao aluno as diferentes formas de programar. MAC0441 Programação Orientada a Objetos: O arcabouço faz grande uso das boas práticas de POO, como o uso de padrões de projeto. Tive contato com várias dessas técnicas nesta disciplina. MAC0414 Linguagens Formais e Autômatos: Expressões regulares, linguagens regulares e linguagens livres de contexto são fortemente usadas na construção de compiladores.
INE5421 LINGUAGENS FORMAIS E COMPILADORES
INE5421 LINGUAGENS FORMAIS E COMPILADORES PLANO DE ENSINO Objetivo geral Conhecer a teoria das linguagens formais visando sua aplicação na especificação de linguagens de programação e na construção de
Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang
Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES Introdução geovanegriesang@unisc.br Processadores de linguagem Linguagens de programação são notações para se descrever
Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores
Motivação Prof. Sérgio Faustino Compiladores Conhecimento das estruturas e algoritmos usados na implementação de linguagens: noções importantes sobre uso de memória, eficiência, etc. Aplicabilidade freqüente
Projeto de Compiladores
Projeto de Compiladores FIR Faculdade Integrada do Recife João Ferreira 12 e 13 de fevereiro de 2007 Questionário 1. Em quais linguagens de programação você já programou? 2. O que você sabe sobre compiladores?
Programação de Sistemas (Sistemas de Programação) Semana 10, Aula 17
PCS3616 Programação de Sistemas (Sistemas de Programação) Semana 10, Aula 17 Linguagens e Compiladores Programação em linguagem de alto nível Escola Politécnica da Universidade de São Paulo Roteiro 1.
Linguagens e Compiladores
Linguagens e Compiladores Aula 1: a) Critérios b) Noções de Compiladores e Interpretadores c) Usos da tecnologia de compilação d) Compiladores, filtros e pré-processadores e) Estruturação lógica de compiladores
CP Compiladores I Prof. Msc.. Carlos de Salles
CP 5017.9 Prof. Msc.. Carlos de Salles 1 - EMENTA O Processo de Compilação. Deteção e Recuperação de Erros. Introdução à geração de Código Intermediário. Geração de Código de Máquina. Otimização. Uma visão
Compiladores. Introdução à Compiladores
Compiladores Introdução à Compiladores Cristiano Lehrer, M.Sc. Introdução (1/2) O meio mais eficaz de comunicação entre pessoas é a linguagem (língua ou idioma). Na programação de computadores, uma linguagem
Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.
Apresentação Universidade dos Açores Departamento de Matemática www.uac.pt/~hguerra/!! Aquisição de conceitos sobre a definição de linguagens de programação.!! Familiarização com os métodos de construção
Introdução à Programação
Introdução à Programação Linguagens de Programação: sintaxe e semântica de linguagens de programação e conceitos de linguagens interpretadas e compiladas Engenharia da Computação Professor: Críston Pereira
Compiladores I Prof. Ricardo Santos (cap 1)
Compiladores I Prof. Ricardo Santos (cap 1) Compiladores Linguagens de programação são notações que permitem descrever como programas devem executar em uma máquina Mas, antes do programa executar, deve
Conceitos de Linguagens de Programação
Conceitos de Linguagens de Programação Aula 03 Processo de Compilação Edirlei Soares de Lima Métodos de Implementação Arquitetura de Von Neumann: A linguagem de máquina de um computador
Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação
Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação Para executar uma tarefa qualquer, um computador precisa receber instruções precisas sobre o que fazer. Uma seqüência adequada
INE5318 Construção de Compiladores. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:
INE5318 Construção de Compiladores Ricardo Azambuja Silveira INE CTC UFSC E Mail: silveira@inf.ufsc.br URL: www.inf.ufsc.br/~silveira Identificação da disciplina Código: INE 5426 Nome: Construção de Compiladores
Autômatos e Linguagens
Autômatos e Linguagens Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Agosto, 2016 1 / 41 Sumário 1 Compiladores 2 Linguagens de programação 3 Ciência dos compiladores
Especificações Gerais do Compilador e Definição de FRANKIE
Especificações Gerais do Compilador e Definição de FRANKIE 1. Especificações Gerais do Compilador (Decisões de projeto) 2. Especificações da Linguagem Fonte Definição Informal Considerações Léxicas Considerações
Universidade Federal do ABC Rua Santa Adélia, Bairro Bangu - Santo André - SP - Brasil CEP Telefone/Fax:
Universidade Federal do ABC Rua Santa Adélia, 166 - Bairro Bangu - Santo André - SP - Brasil CEP 09.210-170 - Telefone/Fax: +55 11 4996-3166 1. CÓDIGO E NOME DA DISCIPLINA MC3201 - COMPILADORES 2. DISCIPLINA
Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.
Construção de Compiladores Capítulo 1 Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2014.2 1/22 1 Linguagens de programação 2 Compilação 2/22 Tópicos 1
3. Linguagem de Programação C
Introdução à Computação I IBM1006 3. Linguagem de Programação C Prof. Renato Tinós Departamento de Computação e Matemática (FFCLRP/USP) 1 Principais Tópicos 3. Linguagem de programação C 3.1. Conceitos
Linguagens de Programação Aula 3
Aula 3 Celso Olivete Júnior olivete@fct.unesp.br Na aula passada... Classificação das LPs (nível, geração e paradigma) Paradigmas Imperativo, OO, funcional, lógico e concorrente 2/33 Na aula de hoje...
Noções de compilação
Noções de compilação Compilador: o que é, para que serve e estrutura geral Parentes do compilador e programas correlatos Prof. Thiago A. S. Pardo 1 Compilação: por que estudar? (parte 1) Compiladores:
Noções de compilação
Noções de compilação Compilador: o que é, para que serve e estrutura geral Parentes do compilador e programas correlatos Prof. Thiago A. S. Pardo 1 Exercício em duplas Para esquentar... 2 1 Compilação:
Desenvolvimento de Aplicações Desktop
Desenvolvimento de Aplicações Desktop Conceitos Básicos de Programação Professor: Charles Leite O Desenvolvimento de Programas A programação consiste em indicar como o computador (hardware) deve trabalhar
PROGRAMAÇÃO I. Introdução
PROGRAMAÇÃO I Introdução Introdução 2 Princípios da Solução de Problemas Problema 1 Fase de Resolução do Problema Solução na forma de Algoritmo Solução como um programa de computador 2 Fase de Implementação
Compiladores. Conceitos Básicos
Compiladores Conceitos Básicos Processadores de Linguagem De forma simples, um compilador é um programa que recebe como entrada um programa em uma linguagem de programação a linguagem fonte e o traduz
Linguagens de Programação
Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Linguagens de Programação DCA0800 - Algoritmos e Lógica de Programação Heitor Medeiros 1 Tópicos da aula
Introdução à Computação
Introdução à Computação Jordana Sarmenghi Salamon jssalamon@inf.ufes.br jordanasalamon@gmail.com http://inf.ufes.br/~jssalamon Departamento de Informática Universidade Federal do Espírito Santo Agenda
EA876 - Introdução a Software de Sistema
A876 - Introdução a Software de Sistema Software de Sistema: conjunto de programas utilizados para tornar o hardware transparente para o desenvolvedor ou usuário. Preenche um gap de abstração. algoritmos
Introdução aos Compiladores
Universidade Católica de Pelotas Introdução aos Compiladores André Rauber Du Bois dubois@ucpel.tche.br 1 MOTIVAÇÃO Entender os algor ıtmos e estruturas usados para se implementar linguagens de programação
Linguagens de Programação
O estudante estuda muito. Regras: 7 9 12 14. . Regras: 2 4 . Regras: 1 Representar através de uma árvore de derivação. 77 O estudante estuda muito.
Compiladores. Eduardo Ferreira dos Santos. Fevereiro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 38
Compiladores Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Fevereiro, 2017 1 / 38 Sumário 1 Compiladores 2 Linguagens de programação 3 Ciência dos compiladores
Projeto de Compiladores
Projeto de Compiladores FIR Faculdade Integrada do Recife João Ferreira 26 e 27 de fevereiro de 2007 Agenda da Aula Revisão Linguagem de Programação Tradutores Compilador As Fases de Um Compilador Linguagem
COMPILAÇÃO. Ricardo José Cabeça de Souza
COMPILAÇÃO Ricardo José Cabeça de Souza www.ricardojcsouza.com.br Programas Código-fonte escrito em linguagem de programação de alto nível, ou seja, com um nível de abstração muito grande, mais próximo
FACULDADE LEÃO SAMPAIO
FACULDADE LEÃO SAMPAIO Paradigmas de Programação Curso de Análise e Desenvolvimento de Sistemas Turma: 309-5 Semestre - 2014.2 Paradigmas de Programação Prof. MSc. Isaac Bezerra de Oliveira. 1 PARADIGMAS
Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores
Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores 2013-2 Compilador para a Linguagem Cafezinho Especificação dos trabalhos: T2 (Geração da Representação Intermediária e Análise
Métodos de implementação de linguagens. Kellen Pinagé
Métodos de implementação de linguagens Kellen Pinagé Sumário Métodos de implementação de linguagens Compilação Interpretação pura Híbrido Métodos de implementação de linguagens Principais componentes de
Compiladores Aula 1. Celso Olivete Júnior.
Aula 1 Celso Olivete Júnior olivete@fct.unesp.br Tópicos da disciplina Introdução à compilação Analisador léxico Analisador sintático descendente Analisador sintático ascendente Análise semântica Geração
Introdução à Programação Aula 03. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação
Aula 03 Prof. Max Santana Rolemberg Farias max.santana@univasf.edu.br Colegiado de Engenharia de Computação Linguagens de Programação A primeira linguagem de programação foi criada por Ada Lovelace. Amiga
AULA 03: FUNCIONAMENTO DE UM COMPUTADOR
ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES I AULA 03: FUNCIONAMENTO DE UM COMPUTADOR Prof. Max Santana Rolemberg Farias max.santana@univasf.edu.br Colegiado de Engenharia de Computação O QUE É UM COMPUTADOR?
Pró-Reitoria Acadêmica Diretoria Acadêmica Assessoria Pedagógica da Diretoria Acadêmica
FACULDADE: CENTRO UNIVERSITÁRIO DE BRASÍLIA UniCEUB CURSO: CIÊNCIA DA COMPUTAÇÃO DISCIPLINA: CONSTRUÇÃO DE COMPILADORES CARGA HORÁRIA: 75 H. A. ANO/SEMESTRE: 2016/02 PROFESSOR: EDUARDO FERREIRA DOS SANTOS
FACULDADE ZACARIAS DE GÓES SISTEMAS DE INFORMAÇÃO ADRIEL ALMEIDA CAFÉ PROCESSO DE COMPILAÇÃO
0 FACULDADE ZACARIAS DE GÓES SISTEMAS DE INFORMAÇÃO ADRIEL ALMEIDA CAFÉ PROCESSO DE COMPILAÇÃO Valença Bahia Novembro 2010 1 ADRIEL ALMEIDA CAFÉ PROCESSO DE COMPILAÇÃO Trabalho apresentado como requisito
Programação: Compiladores x Interpretadores PROF. CARLOS SARMANHO JR
Programação: Compiladores x Interpretadores PROF. CARLOS SARMANHO JR Introdução Compiladores e interpretadores são formas de tradução de um código geralmente de alto nível (escrito em uma linguagem de
Paradigmas de Linguagem de Programação. Aspectos Básicos
Paradigmas de Linguagem de Programação Aspectos Básicos Introdução Nesta segunda etapa de nossos estudos, veremos: aspectos básicos de programa e linguagem de programação; revisão de conceitos de compilador
Compiladores. Introdução
Compiladores Introdução Apresentação Turma Noite Continuada I 20/03 Continuada II 22/05 Atividades Regimental 05/06 Total 1 Ponto 1 Ponto 1 Ponto 7 Pontos 10 Pontos Aulas expositivas teórico-práticas Exercícios
II.1 Conceitos Fundamentais. Uma delas é programar o =>
II.1 Conceitos Fundamentais II.2 Gerações das Linguagens de Programação II.3 Linguagem de Programação II.4 Sistema Operacional II.5 Tradutores II.5.1 Estrutura de um tradutor II.5.1.1 Análise Léxica II.5.1.3
Pró-Reitoria Acadêmica Diretoria Acadêmica Assessoria Pedagógica da Diretoria Acadêmica
FACULDADE: CENTRO UNIVERSITÁRIO DE BRASÍLIA UniCEUB CURSO: CIÊNCIA DA COMPUTAÇÃO DISCIPLINA: CONSTRUÇÃO DE COMPILADORES CARGA HORÁRIA: 75 H. A. ANO/SEMESTRE: 2017/02 PROFESSOR: EDUARDO FERREIRA DOS SANTOS
Infraestrutura de Hardware. Funcionamento de um Computador
Infraestrutura de Hardware Funcionamento de um Computador Computador: Hardware + Software Perguntas que Devem ser Respondidas ao Final do Curso Como um programa escrito em uma linguagem de alto nível é
CAP. VI ANÁLISE SEMÂNTICA
CAP. VI ANÁLISE SEMÂNTICA VI.1 Introdução Semântica SIGNIFICADO, SENTIDO LÓGICO, COERÊNCIA,... Diferença entre SINTAXE e SEMÂNTICA Sintaxe : descreve as estruturas de uma linguagem; Semântica : descreve
Construção de Compiladores
Construção de Compiladores Parte 1 Introdução Linguagens e Gramáticas F.A. Vanini IC Unicamp Klais Soluções Motivação Porque compiladores? São ferramentas fundamentais no processo de desenvolvimento de
Universidade Católica de Pelotas Bacharelado em Ciência da Computação Linguagens Formais e Autômatos TEXTO 6 Introdução à Compilação
Universidade Católica de Pelotas Bacharelado em Ciência da Computação 364018 Linguagens Formais e Autômatos TEXTO 6 Introdução à Compilação Prof. Luiz A M Palazzo Maio de 2011 Um COMPILADOR é um programa
Ferramentas Programação. UDESC - Prof. Juliano Maia 1
Ferramentas Programação UDESC - Prof. Juliano Maia 1 Índice Seção 1 Linguagens de Programação Seção 2 Interpretador Seção 3 Compilador / Linkeditor Seção 4 Ambientes de Desenvolvimento UDESC - Prof. Juliano
Linguagens de Programação Classificação
Classificação Classificação A proximidade que a linguagem de programação tem com a humana determina sua classe (o nível): Linguagem de máquina (primeira geração) Linguagem assembly - de montagem (segunda
CAP. VII GERAÇÃO DE CÓDIGO
CAP. VII GERAÇÃO DE CÓDIGO VII. 1 - INTRODUÇÃO Léxica Análise Sintática Semântica Compilação G.C. intermediário Síntese Otimização de código Geração de código Síntese Tradução do programa fonte (léxica,
INE5317 Linguagens Formais e Compiladores. Ricardo Azambuja Silveira INE-CTC-UFSC URL:
INE5317 Linguagens Formais e Compiladores Ricardo Azambuja Silveira INE-CTC-UFSC E-Mail: silveira@inf.ufsc.br URL: www.inf.ufsc.br/~silveira Plano de Ensino OBJETIVO GERAL: Estudar a teoria das linguagens
Programação I A Linguagem C. Prof. Carlos Alberto
Programação I A Linguagem C Prof. Carlos Alberto carlos.batista@facape.br carlos36_batista@yahoo.com.br 2 Origem A linguagem C foi desenvolvida em 1972, nos Laboratórios Bell, por Dennis Ritchie. Implementada
Conclusões. Baseado no Capítulo 9 de Programming Language Processors in Java, de Watt & Brown
Conclusões Baseado no Capítulo 9 de Programming Language Processors in Java, de Watt & Brown QUESTÕES FUNDAMENTAIS 1. Correção do código gerado 2. Desempenho do compilador: a. Notificação de erros; b.
CAP. VII GERAÇÃO DE CÓDIGO
CAP. VII GERAÇÃO DE CÓDIGO VII. 1 - INTRODUÇÃO Léxica Análise Sintática Semântica Compilação G.C. intermediário Síntese Otimização de código Geração de código Síntese Tradução do programa fonte (léxica,
Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 32. Instituto de C
ompiladores Introdução Bruno Lopes Bruno Lopes ompiladores 1 / 32 Apresentação Em que período estão? O quanto sabem de programação? Quais linguagens? O quanto sabem de unix? O quanto sabem de Linguagens
Compiladores Geração de Código
Compiladores Geração de Código Fabio Mascarenhas - 2013.2 http://www.dcc.ufrj.br/~fabiom/comp O Back-end Até agora vimos as fases do front-end do compilador: Análise Léxica Análise Sintática Análise Semântica
Programação de Computadores:
Instituto de C Programação de Computadores: Introdução a Linguagens de Programação Luis Martí Instituto de Computação Universidade Federal Fluminense lmarti@ic.uff.br - http://lmarti.com Seis Camadas Problema
INE5622 INTRODUÇÃO A COMPILADORES
INE5622 INTRODUÇÃO A COMPILADORES PLANO DE ENSINO Objetivo geral Conhecer o processo de especificação e implementação de linguagens de programação, a partir do estudo dos conceitos, modelos, técnicas e
Prof. Adriano Maranhão COMPILADORES
Prof. Adriano Maranhão COMPILADORES LINGUAGENS: INTERPRETADAS X COMPILADAS Resumo: Linguagem compilada: Se o método utilizado traduz todo o texto do programa, para só depois executar o programa, então
Capítulo 1 Linguagens e processadores
1. Linguagens Capítulo 1 Linguagens e processadores 2. Processamento de Linguagens: DI-UBI 2017/2018 1/28 Linguagens Linguagens Processamento de Linguagens: DI-UBI 2017/2018 2/28 Linguagens 1. Definição
Compiladores. Análise Léxica
Compiladores Análise Léxica Cristiano Lehrer, M.Sc. Introdução (1/3) Análise léxica é a primeira fase do compilador. A função do analisador léxico, também denominado scanner, é: Fazer a leitura do programa
Sâmia Rodrigues Gorayeb. Arquitetura de Computadores Linguagem de Máquina
Sâmia Rodrigues Gorayeb Arquitetura de Computadores Linguagem de Máquina Arquitetura de Computadores Agenda: Linguagem de máquina 1. Introdução 2. Característica 3. Programas Compilados 4. Programas Interpretados
Sistema Computacional
Algoritmos e Lógica de Programação Conceitos Básicos Abstração Reinaldo Gomes reinaldo@cefet-al.br O que é um? Integração de componentes atuando como uma entidade, com o propósito de processar dados, i.e.
Interfaces de Vanguarda do Compilador
Interfaces de Vanguarda do Compilador Stefani Henrique Ramalho¹, Prof Mário Rubens Welerson Sott¹ ¹DCC Departamento de Ciência da Computação Universidade Presidente Antônio Carlos (UNIPAC) Barbacena MG
Organização e Arquitetura de Computadores I
Organização e Arquitetura de Computadores I Conjunto de Instruções Slide 1 Sumário Características de Instruções de Máquina Tipos de Operandos Tipos de Operações Linguagem de Montagem Slide 2 Características
Conceitos básicos sobre computadores (continuação)
SSC0101 - ICC1 Teórica Introdução à Ciência da Computação I Conceitos básicos sobre computadores (continuação) Prof. Vanderlei Bonato Prof. Cláudio Fabiano Motta Toledo Sumário O que é um computador e
Compiladores. Geração de Código Objeto
Compiladores Geração de Código Objeto Cristiano Lehrer, M.Sc. Atividades do Compilador Arquivo de origem Arquivo de destino Análise Otimização Geração de Código Intermediário Geração de Código Final Síntese
Introdução parte II. Compiladores. Mariella Berger
Introdução parte II Compiladores Mariella Berger Sumário Partes de um compilador Gerador da Tabela de Símbolos Detecção de erros As fases da análise As fases de um compilador Montadores O que é um Compilador?
Ferramenta para Desenvolvimentode Sistemas EmbarcadosUtilizando Linguagem de Alto Nível p.1/25
Universidade Federal do Rio Grande do Sul Escola de Engenharia - Instituto de Informática Graduação em Engenharia de Computação Ferramenta para Desenvolvimento de Sistemas Embarcados Utilizando Linguagem
Sistemas Operacionais
Sistemas Operacionais CAP 2: Conceitos de Hardware e Software Prof. MSc. Diego R. Moraes diegorm@anhanguera.com Download de todo conteúdo da disciplina https://sites.google.com/site/diegorafaelmoraes/downloads
DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE
DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE Jeferson MENEGAZZO 1, Fernando SCHULZ 2, Munyque MITTELMANN 3, Fábio ALEXANDRINI 4. 1 Aluno 5ª fase do Curso de Ciência da Computação do Instituto
Identificadores Nome de variáveis, constantes, métodos, etc...
IV.2 Aspectos Léxicos Convencionais Classes de símbolos Genéricos Token genérico / Lei de formação bem definida Podem possuir limitações de tamanho e/ou valor Possuem valor semântico o token deve ser acompanhado
Programação de Computadores
Programação de Computadores Instituto de Computação UFF Departamento de Ciência da Computação Otton Teixeira da Silveira Filho Conteúdo Alguns Conceitos sobre Linguagens Conceito de Algoritmo Pseudocódigo
Capítulo 1. Aspectos Preliminares
Capítulo 1 Aspectos Preliminares Tópicos do Capítulo 1 Razões para estudar conceitos de linguagens de programação Domínios de programação Critérios de avaliação de linguagens Influências no projeto de
Introdução. Tradutores de Linguagens de Programação
Introdução Compiladores 1 Linguagens de programação são notações para se descrever computações para pessoas e para máquinas. Todo software executado em todos os computadores foi escrito em alguma linguagem
Programação de Computadores
Programação de Computadores Instituto de Computação UFF Departamento de Ciência da Computação Otton Teixeira da Silveira Filho Conteúdo Alguns Conceitos sobre Linguagens Paradigmas para linguagens de Programação
As fases de um compilador
As fases de um compilador Compilando um programa simples estrutura de um compilador formas de organização de um compilador processo de execução de uma linguagem de alto-nível Compilando um programa simples
Introdução à plataforma Java
Introdução à plataforma Java Apresentação: Professor: Galvez Gonçalves prof.gago@gmail.com O que estudaremos 1. Os conceitos de programação orientada a objetos através de uma linguagem de programação que
FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS
FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS Acadêmico: Roger Anderson Schmidt Orientador : Marcel Hugo Supervisor : Ricardo de Freitas Becker Empresa
Introdução a orientação a objetos
2 Introdução a orientação a objetos Introdução 2 Linguagens procedimentais 2 Um pouco de história 2 Idéias básicas da POO 2 Classe, atributo e método 2 Herança 3 Polimorfismo 3 Vantagens e desvantagens
Tecnólogo em Análise e Desenvolvimento de Sistemas. Sistemas Operacionais (SOP A2)
Tecnólogo em Análise e Desenvolvimento de Sistemas Sistemas Operacionais (SOP A2) Conceitos de Hardware e Software Referências: Arquitetura de Sistemas Operacionais. F. B. Machado, L. P. Maia. Editora
Compiladores Ambiente de Execução
Compiladores Ambiente de Execução Fabio Mascarenhas 2015.1 http://www.dcc.ufrj.br/~fabiom/comp O Back-end Até agora vimos as fases do front-end do compilador: Análise Léxica Análise Sintática Análise Semântica
As fases de um compilador
As fases de um compilador Paradigmas de LP Métodos de Implementação de LP Compilando um programa simples estrutura de um compilador formas de organização de um compilador processo de execução de uma linguagem
Classificação das linguagens de programação
Introdução Linguagem É um meio de comunicação entre pessoas. Faculdade de expressão audível e articulada do homem. Conjunto de sinais falados, escritos ou gesticulados de que se serve o homem para demonstrar
Conceitos Básicos de Programação
BCC 201 - Introdução à Programação Conceitos Básicos de Programação Guillermo Cámara-Chávez UFOP 1/53 Conceitos básicos I Variável 2/53 Conceitos básicos II Posição de memoria, identificada através de
COMPILADORES PROGRAMA E BIBLIOGRAFIA
COMPILADORES PROGRAMA E BIBLIOGRAFIA Mariza A. S. Bigonha e Roberto S. Bigonha UFMG 27 de maio de 2008 Todos os direitos reservados Proibida cópia sem autorização dos autores OBJETIVOS DO CURSO Ensinar
Programação Estruturada Aula - Introdução a Linguagem de Programação
Programação Estruturada Aula - Introdução a Linguagem de Programação Prof. Flávio Barros flavioifma@gmail.com www.flaviobarros.com.br ORGANIZAÇÃO BÁSICA DE UM COMPUTADOR 2 ORGANIZAÇÃO BÁSICA DE UM COMPUTADOR
Compiladores II. Fabio Mascarenhas
Compiladores II Fabio Mascarenhas 2018.1 http://www.dcc.ufrj.br/~fabiom/comp2 Máquinas Virtuais Uma máquina virtual é uma técnica de implementação de linguagens de programação que é um meio termo entre
Algoritmos e Programação
ESTADO DE MATO GROSSO SECRETARIA DE ESTADO DE CIÊNCIA E TECNOLOGIA UNIVERSIDADE DO ESTADO DE MATO GROSSO CAMPUS UNIVERSITÁRIO DE SINOP FACULDADE DE CIÊNCIAS EXATAS E TECNOLÓGICAS Algoritmos e Programação
Tratamento dos Erros de Sintaxe. Adriano Maranhão
Tratamento dos Erros de Sintaxe Adriano Maranhão Introdução Se um compilador tivesse que processar somente programas corretos, seu projeto e sua implementação seriam grandemente simplificados. Mas os programadores
PLANO DE APRENDIZAGEM
PLANO DE APRENDIZAGEM 1. DADOS DE IDENTIFICAÇÃO Curso: Bacharelado em Sistemas de Informação Disciplina: Linguagens Formais e Compiladores Código: SIF5N191 Professor: Jamilson Ramalho Dantas e-mail: jamilson.dantas@fasete.edu.br
Conteúdo. Introdução a compiladores Tradução x Interpretação Processo de Compilação
Compiladores Conteúdo Introdução a compiladores Tradução x Interpretação Processo de Compilação Quando se inventou o computador criou se uma máquina a mais, quando se criou o compilador criou se uma nova
1.1 Linguagens de Programação
Fundamentos Procurando fazer com que haja uma melhor compreensão para o estudo e desenvolvimento utilizando linguagens de programação, este capítulo apresenta conceitos básicos sobre como um programa pode
Compiladores. Análise Léxica
Compiladores Análise Léxica Regras Léxicas Especificam o conjunto de caracteres que constituem o alfabeto da linguagem, bem como a maneira que eles podem ser combinados; Exemplo Pascal: letras maiúsculas
Introdução à Programação Aula 02. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação
Introdução à Programação Aula 02 Prof. Max Santana Rolemberg Farias max.santana@univasf.edu.br Colegiado de Engenharia de Computação QUAIS SÃO OS COMPONENTES BÁSICOS DO HW DE UM SISTEMA COMPUTACIONAL?