Interpretação e Compilação de Linguagens de Programação



Documentos relacionados
Compiladores INTRODUÇÃO.

Interpretação e Compilação de Linguagens de Programação Sintaxe e Semântica

Construção de Compiladores. Construção de Compiladores. Motivação. Motivação. Contexto Histórico. Classificações: Gerações 09/03/2010

FAP - Faculdade de Apucarana Curso de Sistemas de Informação RESUMO EXPANDIDO DE TRABALHO DE CONCLUSÃO DE CURSO -

Capítulo 8. Software de Sistema

Introdução. Hardware X Software. Corpo Humano Parte Física. Capacidade de utilizar o corpo em atividades especificas explorando seus componentes

UNIVERSIDADE DO OESTE DE SANTA CATARINA CAMPUS DE SÃO MIGUEL DO OESTE

Curso Técnico em Redes

Desenvolvendo uma Arquitetura de Componentes Orientada a Serviço SCA

Curso de Eng. Informática Linguagens de Programação. C Sharp University Data Processing. (C Sharp Universidade de Processamento de Dados) Docente:

SISTEMAS OPERACIONAIS. Maquinas Virtuais e Emuladores

CURSO DE PROGRAMAÇÃO EM JAVA

PROJETO LÓGICO DE COMPUTADORES Prof. Ricardo Rodrigues Barcelar

Carga horária : 4 aulas semanais (laboratório) Professores: Custódio, Daniel, Julio foco: introdução a uma linguagem de programação Linguagem Java

Sistemas Operacionais. Prof. M.Sc. Sérgio Teixeira. Aula 05 Estrutura e arquitetura do SO Parte 2. Cursos de Computação

Arquitetura do conjunto de instruções (ISA); características de instruções de máquina; tipos de operandos

Fundamentos de Java. Prof. Marcelo Cohen. 1. Histórico

Introdução à Arquitetura de Computadores. Renan Manola Introdução ao Computador 2010/01

Capítulo 1. Introdução. 1.1 Linguagens. OBJETIVOS DO CAPÍTULO Ao final deste capítulo você deverá ser capaz de:

Figura 1 - O computador

3. O NIVEL DA LINGUAGEM DE MONTAGEM

Programação de Computadores III

Sistemas Operacionais

PROGRAMAÇÃO JAVA. Parte 1

COMPILADORES E INTERPRETADORES

Introdução à Lógica de Programação

Universidade da Beira Interior Cursos: Engenharia Informática, Matemática /Informática e Ensino da Informática

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

ATIVIDADES PRÁTICAS SUPERVISIONADAS

DESENVOLVIMENTO DE SOFTWARE AULA 1

Organização e Arquitetura de Computadores I. de Computadores

build UNIP Sistemas de Informação Análise Essencial de Sistemas 3 Prof.Marcelo Nogueira A produção de Software é uma atividade build and fix.

Universidade Federal de Santa Maria Curso de Arquivologia. Disciplina de Banco de Dados Aplicados à Arquivística. Versao 1.

Sistemas Operacionais 1/66

15 Computador, projeto e manufatura

Na medida em que se cria um produto, o sistema de software, que será usado e mantido, nos aproximamos da engenharia.

Arquitetura de Computadores Paralelismo, CISC X RISC, Interpretação X Tradução, Caminho de dados

Sistemas Distribuídos Arquitetura de Sistemas Distribuídos I. Prof. MSc. Hugo Souza

Engenharia de Software Sistemas Distribuídos

Introdução. Sistemas Operacionais. Introdução. Roteiro (1 / 2) Por que Máquinas Virtuais Existem? Roteiro (2 / 2)

UML 01. Curso Superior de Tecnologia em Banco de Dados Disciplina: Projeto de Banco de Dados Relacional 1 Prof.: Fernando Hadad Zaidan

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento NetBeans Introdução à Linguagem de Programação JAVA

Memórias Prof. Galvez Gonçalves

Programação Estruturada e Orientada a Objetos. Fundamentos Orientação a Objetos

Roteiro 2 Conceitos Gerais

ENIAC. Introdução aos Computadores e à Programação (Noções Básicas)

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular PRODUÇÃO DE DESIGN MULTIMÉDIA Ano Lectivo 2014/2015

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Java. Marcio de Carvalho Victorino

Programa de Monitorização da Lagoa de Óbidos e do Emissário Submarino da Foz do Arelho

Adriano Reine Bueno Rafael Barros Silva

11/3/2009. Software. Sistemas de Informação. Software. Software. A Construção de um programa de computador. A Construção de um programa de computador

Conjunto de instruções do CPU. Arquitectura de um computador. Definição das instruções (1) Definição das instruções (2)

Sistemas Operacionais. Roteiro. Sistemas de Computadores. Os sistemas de computadores são projetados com basicamente 3 componentes: Marcos Laureano

1.1. Organização de um Sistema Computacional

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES

Entrada e Saída. Prof. Leonardo Barreto Campos 1

ESTUDO DE CASO: LeCS: Ensino a Distância

Engenharia de Software: conceitos e aplicações. Prof. Tiago Eugenio de Melo, MSc tiagodemelo@gmail.com

SISTEMAS OPERACIONAIS

Introdução. à Linguagem JAVA. Prof. Dr. Jesus, Edison O. Instituto de Matemática e Computação. Laboratório de Visão Computacional

Introdução a Informática. Prof.: Roberto Franciscatto

LINGUAGENS E PARADIGMAS DE PROGRAMAÇÃO. Ciência da Computação IFSC Lages. Prof. Wilson Castello Branco Neto

1 O que é um computador? Definição uma máquina que lê dados, efectua cálculos e fornece resultados.

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

Introdução à Linguagem Java

UMA BREVE INTRODUÇÃO AO ESTUDO E IMPLEMENTAÇÃO DE COMPILADORES

O que é o JavaScript?

Grupo I [6v] Considere o seguinte extracto de um programa de definição de uma calculadora apenas com a função soma de dois valores reais

O modelo do computador

INF1621 Linguagens de Programação I

ISO 9000:2000 Sistemas de Gestão da Qualidade Fundamentos e Vocabulário. As Normas da família ISO As Normas da família ISO 9000

Engenharia de Sistemas Computacionais

Arquiteturas RISC. (Reduced Instructions Set Computers)

1. Apresentação Objetivos

Especificação do 3º Trabalho

Programação Funcional. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2015.

Aspectos técnicos do desenvolvimento baseado em componentes

Tópicos em Engenharia de Software (Optativa III) AULA 2. Prof. Andrêza Leite (81 )

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Arquitetura de Sistemas Operacionais Machado/Maia. Arquitetura de Sistemas

Orientação a Objetos

12 EXCEL MACROS E APLICAÇÕES

Introdução aos Sistemas Operativos

Informática I. Aula 6. Aula 6-12/09/2007 1

Fundamentos de Sistemas Operacionais

Sistemas de Bases de Dados

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software

Sistemas Operacionais

UNIVERSIDADE FEDERAL DE SANTA MARIA CENTRO DE TECNOLOGIA AULA 14 PROFª BRUNO CALEGARO

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento Eclipse Introdução à Linguagem de Programação JAVA

Introdução. Capítulo Breve sinopse

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS

Transcrição:

Interpretação e Compilação de Linguagens de Programação 28 de Fevereiro de 2013 Esta unidade curricular pretende transmitir ao longo de um semestre as noções fundamentais sobre o desenho e implementação de linguagens de programação. Muitos dos conceitos estudados são essenciais, não só no desenvolvimento de linguagens de programação, mas também na resolução de problemas de forma computacional [Win06]. Pretende-se ao mesmo tempo aprofundar o conhecimento acerca do funcionamento de linguagens de programação já existentes através do conhecimento profundo dos seus mecanismos de construção. If you don t understand interpreters, you can still write programs; you can even be a competent programmer. But you can t be a master. (Hal Abelson, in prefácio de [FW08]) Durante esta unidade curricular serão apresentados os componentes fundamentais de construção de linguagens de programação, o seu modelo de execução, verificação e transformação, tendo como foco uma linguagem de alto nível de abstracção. Ao longo de um semestre serão desenvolvidos de forma incremental algoritmos interpretadores, que serão os veículos privilegiados para a aprendizagem da semântica de linguagens, dos sistemas de tipos e das técnicas de compilação. Nesta primeira versão das notas de apoio serão descritos brevemente os tópicos abordados em aula, algum código de apoio, e alguns apontadores para outros recursos de estudo e aprofundamento de conhecimentos. Nesta primeira aula descreve-se a arquitetura geral dos interpretadores e compiladores e a sua utilidade no contexto de um sistema de software. Estes tópicos podem ser mais explorados na bibliografia recomendada (nomeadamente em [AP02, AVAU06]). 1

Executable program compiler addl popq %edi, -4(%rbp) -4(%rbp), %eax $1, %eax %eax, -12(%rbp) -12(%rbp), %eax %eax, -8(%rbp) -8(%rbp), %eax %rbp ret machine Figura 1: Compilador ICL 2012-2013 1 Interpretadores / compiladores 31 Qual a diferença entre um compilador e um interpretador? o que é uma linguagem máquina? ou uma linguagem intermédia? o que é um JIT compiler? Cada uma destas ferramentas tem a sua utilidade específica e contexto de utilização adequado. Os interpretadores e compiladores são essencialmente programas cujo comportamento (ou output) não está estabelecido à partida, o seu resultado é definido através de um programa dado como input, escrito numa linguagem de programação. São programas cujos dados são outros programas. Dentro desta categoria encontram-se ainda programas como ferramentas de verificação de programas, ambientes de desenvolvimento, etc. Invariavelmente, os dados de entrada de um compilador e de um interpretador é um programa expresso numa linguagem de programação (linguagem fonte). O mais usual é um programa ser expresso por intermédio de um texto, podendo ser expresso de outras formas, usando linguagens visuais por exemplo. Embora a maioria dos conceitos sejam genéricos, no contexto desta unidade curricular focamos em linguagens expressas em texto. A distinção entre interpretadores e compiladores faz-se essencialmente a nível da forma de execução e interação que proporcionam. Existe depois uma miríade de alternativas e combinações sobre as verificações que são feitas sobre o código, e sobre a eficiência na execução, e na produtividade da atividade de programação. Os compiladores, cuja interação é representada na Figura 1, transformam 2

interpreter Figura 2: Interpretador código de uma linguagem tipicamente comicl 2012-2013 um nível de abstração alto para uma linguagem com um nível de abstração mais baixo. Esse programa alvo é executado ou interpretado por uma máquina cujas instruções são de uma granularidade mais baixa e adaptadas às suas estruturas internas. De uma forma simplificada representamos essa interação, nas Figuras 1 e 2, pela transformação de dados de entrada em dados de saída. Esta forma de interação pode sem perca de generalidade ser extendida para aplicações interativas mais ricas. Os interpretadores (simples) processam diretamente o programa na linguagem fonte e os dados de entrada para produzir os seus resultados ou efeitos, Figura 2. Uma configuração mais realista e sofisticada como é o caso da máquina virtual Java (JVM) ou a máquina virtual da plataforma.net combina compilação e interpretação. A sua arquitetura inclui a compilação para código numa linguagem intermédia que depois é interpretado, e nessa altura ainda pode ser compilado para código nativo (máquina) e executado diretamente no processador. Comparando os dois modos de execução, podemos dizer que os compiladores produzem código cuja execução é mais eficiente do que a interpretação do mesmo código. Esta realidade deve-se ao que o processamento offline do código oferece como oportunidades de optimização e verificação que a interpretação de código tipicamente não permite. Por outro lado, aos interpretadores são associadas as características de flexibilidade no desenvolvimento, permitindo inclusivamente a execução de programas, cuja compilação para código nativo seria impossível, sem incorporar de alguma forma o algoritmo interpretador no resultado (e.g. Javascript). 32 3

compiler intermediate language define i32 @f(i32 %x) nounwind readnone ssp { entry: %0 = add nsw i32 %x,1 ret i32 %0 virtual machine Just in time compiler Executable code %edi, -4(%rbp) -4(%rbp), %eax addl $1, %eax %eax, -12(%rbp) -12(%rbp), %eax %eax, -8(%rbp) -8(%rbp), %eax popq %rbp ret Figura 3: Interpretador ICL com 2012-2013 compilador JIT 32 A flexibilidade oferecida pela utilização de um interpretador (da linguagem intermédia) é aproveitada no caso das linguagens Java e C# para possibilitar a portabilidade de código. No caso de linguagens como OCaml, Haskell ou Scala, à flexibilidade dada pelo modo interpretação, acrescenta uma verificação de tipos completa e optimizações como a utilização de tail recursion. Na sua estrutura interna, os compiladores e interpretadores partilham alguns componentes, nomeadamente no seu front-end. Na Figura 4, são descritos os blocos que tipicamente compõem o processo de transformação feito por um interpretador. Os dois primeiros blocos, análise lexicográfica e sintática, transformam o formato de entrada (texto) numa representação interna do programa (tipo de dados) que pode ser mais facilmente tratado por um algoritmo (esta representação será o tema da próxima aula). Essa representação, que pode ou não ser analisada e anotada, é depois interpretada. A arquitetura interna de um compilador é composta por um front-end como aquele descrito para os interpretadores, e por mais duas camadas. Uma camada intermédia e uma camada de saída. A camada intermédia 4

Análise Lexicográfica tokens Análise Sintática AST Análise Semântica AST anotada Interpretador Figura 4: Arquitetura de um interpretador ICL 2012-2013 de um Luís compilador Caires, João Costa típico, Seco faz o tratamento de uma linguagem intermédia. Esta divisão entre front-end e back-end, com um ponto comum numa camada intermédia, permite com uma única ferramenta, criar uma família de compiladores. Compilando e integrando um conjunto de linguagens, e podendo produzir código de qualquer destas linguagens para um conjunto de processadores. A Figura 5 mostra os principais blocos que compõem um compilador. Os componentes do front-end de um compilador são basicamente os mesmos do que os de um interpretador. A diferença começa na geração de código numa linguagem intermédia que permite normalmente a realização de operações de análise e optimização de código, e que é agnóstica quanto ao processador para o qual se vai gerar código nativo. O back-end do processador pode então gerar código específico para diferentes processadores, tirando partido das particularidades de cada um. 37 5

Executable program addl popq ret %edi, -4(%rbp) -4(%rbp), %eax $1, %eax %eax, -12(%rbp) -12(%rbp), %eax %eax, -8(%rbp) -8(%rbp), %eax %rbp Análise Lexicográfica tokens intermediate language define i32 @f(i32 %x) nounwind readnone ssp { entry: %0 = add nsw i32 %x,1 ret i32 %0 assembler/linker tokens Análise Sintática Alocação de registos AST Selecção de instruções Optimizações AST Análise Semântica AST anotada Ling Intermédia Selecção de instruções Figura 5: Arquitetura de um compilador (adaptado de [Pfe]) Referências ICL 2012-2013 38 [AP02] A.W. Appel and J. Palsberg. Modern Compiler Implementation in Java. Cambridge University Press, 2002. [AVAU06] Ravi Sethi Alfred V. Aho, Monica S. Lam and Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools. Pearson Education, Inc, 2006. [FW08] [Pfe] [Win06] D.P. Friedman and M. Wand. Essentials of programming languages. Essentials of Programming Languages. MIT Press, 2008. Frank Pfenning. Lecture notes: compiler design, overview. Jeannette M. Wing. Computational thinking. Commun. ACM, 49(3):33 35, March 2006. 6