Linguagens de Programação -- Compilação e Execução -- Compilação. Paulo Marques. Compilador. Tecnologia dos Computadores 2004/2005

Documentos relacionados
História das Linguagens de Programação. Rosana Braga

Fundamentos de Programação 1

Conceitos de Linguagens de Programação - Características. Paavo Soeiro

DELEGAÇÃO REGIONAL DO ALENTEJO CENTRO DE FORMAÇÃO PROFISSIONAL DE ÉVORA REFLEXÃO 5

Introdução à Programação Aula 03. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Linguagem C Introdução. Contexto Histórico Principais diferenças do Java Funções em C Compilar programas em C no Linux

Informática I. Aula 19. Aula 19-31/10/2007 1

Paradigmas de Linguagens

Curso: Análise e Desenvolvimento de Sistemas. (Introdução a disciplina Algoritmos e Programação)

Programação Estruturada Aula - Introdução a Linguagem C

Conceitos Básicos de C

Programação em Sistemas Computacionais

Introdução à linguagem C

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Introdução as Máquinas de Autômatos

Compiladores. Introdução

Orientação a Objetos. Programação em C++

3. Linguagem de Programação C

LAPRO I. Pontifícia Universidade Católica do Rio Grande do Sul Faculdade de Informática - FACIN. Prof. Dr. Rafael Garibotti

Introdução a lógica e a Linguagem de Programação

Paradigmas de Programação

Projeto de Compiladores

Programação Orientada a Objetos. Programação Funcional

Introdução. Parte 01. Desenvolvimento de Programação Orientada a Objetos. Prof. Pedro Neto

Introdução à linguagem C

Ederson Luiz da Silva Ciência da Computação. Algoritmos e Programação

Licenciatura em Informática

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

Linguagens de Programação

09/05/2017. Técnicas Avançadas de Programação APRESENTAÇÃO

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Aspectos preliminares

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação

PLANO DE UNIDADE DIDÁTICA- PUD

Programação I A Linguagem C. Prof. Carlos Alberto

Fundamentos de Programação 1

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação

Curso Profissional de Gestão e Programação de Sistemas Informáticos. Programação e Sistemas de Informação. Módulo 1. 1ª Parte Prof. Sandra Pais Soares

PROGRAMAÇÃO ORIENTADA A OBJETOS I -CONCEITOS PRELIMINARES. Prof. Angelo Augusto Frozza, M.Sc.

Linguagem C. Brian W. Kernighan, Dennis Ritchie (K&R) Slides adaptados, inspirados, muitos copiados dos slides do professor Pedro Pereira

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Slides trabalhados durante a quinta aula

Aula 4 Introdução ao C

Aula teórica 7. Preparado por eng.tatiana Kovalenko

Compilador de LP3 para C3E e P3

Linguagens de Programação Princípios e Paradigmas

Unidade 1. Introdução e histórico

Linguagens de Programação

Introdução e Conceitos

Programação Imperativa

Introdução as Linguagens de Programação (POO-II) Prof. Responsável Wagner Santos C. de Jesus. www1.univap.br/wagner

1 Introdução à Programação O que é? Para que serve?... 1

A linguagem C (visão histórica)

Programação de Computadores:

Programação I Apresentação

INTRODUÇÃO À LINGUAGEM C

Informática I. Aula 12. Aula 12-29/05/2006 1

AULA TEÓRICA 3 Tema 2. Introdução a programação em Java (JVM, JDK)

Paradigmas. Fortran, Algol, Algol-68, Pascal, C, Cobol, PL/I

PROGRAMAÇÃO I. Introdução

Fundamentos de Programação1

Linguagem de Programação C. Prof. Fabrício Olivetti de França

Questões de Paradigmas de Programação Matéria: Prova 1 4ª EDIÇÃO

ao paradigma imperativo

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

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.

Implementação de Linguagens

Paradigmas de Programação

AULA TEÓRICA 10. Tema 9. Interface. Tema 10. Recursividade

Linguagens de Programação Funcional

Noções de compilação

Noções de compilação

Compiladores. Eduardo Ferreira dos Santos. Fevereiro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 38

Informática I. Aula 9. Aula 9-17/05/2006 1

Linguagens de Programação Conceitos e Técnicas. Amarrações

Reinaldo Gomes Análise/projeto estruturado

Introdução. PCO / PPO Departamento de Informática Faculdade de Ciências da Universidade de Lisboa

Informática I. Aula 9. Aula 9-27/09/2006 1

Capítulo 6: Linguagens de Programação

Estrutura e funcionamento básico de um computador

Computação e Programação

Linguagens de Programação

Introdução à Computação

Ferramentas Programação. UDESC - Prof. Juliano Maia 1

Introdução à Programação

Introdução à Programação. Conceitos Básicos de Orientação a Objetos

Instituto Superior de Engenharia de Lisboa

Capítulo 1. Aspectos Preliminares

Figura 3.1 Modelo da programação estruturada

Compiladores Aula 1. Celso Olivete Júnior.

Programação. MEAer e LEE. Bertinho Andrade da Costa. Instituto Superior Técnico. Argumentos da linha de comando Funções recursivas

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.

ÍNDICE. PREFÁCIO xv. 3 PROCESSOS GERADOS POR PROCEDIMENTOS Recursão Linear Cálculo de potências Cálculo de factoriais 91

AJProença, Sistemas de Computação, UMinho, 2017/18 1

Computação e Programação MEMec - LEAN

Transcrição:

Linguagens de Programação -- Compilação e Execução -- Paulo Marques Moth found trapped between points at Relay # 70, Panel F, of the Mark II Aiken Relay Calculator while it was being tested at Harvard University, 9 September 1945. The operators affixed the moth to the computer log, with the entry: First actual case of bug being found. They put out the word that they had debugged the machine, thus introducing the term debugging a computer program. In 1988, the log, with the moth still taped by the entry, was in the Naval Surface Warfare Center Computer Museum at Dahlgren, Virginia. pmarques@dei.uc.pt http://www.dei.uc.pt/~pmarques Tecnologia dos Computadores 2004/2005 U.S. Naval Historical Center Photograph. http://www.history.navy.mil/index.html Compilação Programa numa Linguagem de Alto Nível (calendario.c) Compilador (gcc) Programa em Código Máquina (calendario.exe)

Compilador Programa de Alto Nível em Pascal Traduz uma linguagem de alto nível na linguagem máquina da arquitectura destino Depois de compilado, o programa é específico da máquina onde corre Program gcd(input, Output); Var i, j : Integer; Begin Read(i, j); Calcula o Máximo Divisor Comum entre dois números. As linguagens de programação de alto nível é fornecerem ao programador um conjunto de instruções que estão próximo da sua forma de pensar e do seu domínio de aplicação Em 1995 estavam inventariadas cerca de 2300 linguagens (comp.lang.misc) End. While i<>j Do If i>j Then i := i - j; Else j := j - i; WriteLn(i) Funcionamento de um Compilador Análise Lexical A análise lexical reconhece a estrutura de um programa sem olhar ao seu significado. O compilador lê os caracteres do programa e agrupa-os em tokens, que são as unidades mais pequenas significativas de um programa Compiler tokens do programa Program gcd ( Input, Output ) ; Var i, j : Integer ; Begin Read ( i, j ) ; While i <> j Do If i > j Then i := i - j ; Else j := j - i ; WriteLn ( i ) End.

Parsing A fase seguinte do compilador é organizar os tokens numa árvore de parsing que representa a estrutura de alto nível do programa. Os tokens têm de ser compatíveis com a gramática da linguagem. Árvore de parsing Geração de código O último passo consiste na geração de código. O compilador percorre a árvore, gerando as instruções máquina A geração de código pode ser feita: Para assembly do processador. Nesse caso é necessário correr um assembler sobre o ficheiro resultante. Directamente para código máquina. Nesse caso obtém-se directamente o executável da máquina. Para uma máquina virtual. Nesse caso a máquina virtual traduz just-in-time de uma linguagem intermédia para código máquina. Exemplo de Código Final (ou quase!) Código Assembly Código Máquina

Máquinas Virtuais Máq. Virtuais Portabilidade de Código (2) Na máquina virtual existe um just-in-time compiler (JIT) que antes de executar o código o traduz em código máquina do processador alvo Gcd.java Compilador javac Gcd.class Gcd.class Máquina Virtual java JIT Máq. Virtuais Portabilidade de Código Máquinas Virtuais A favor Permitem independência da arquitectura da máquina onde o código vai correr Permitem fazer verificações de segurança sobre o código Na maioria das vezes oferecem gestão automática de memória Carregamento dinâmico de código Contra Em muitos casos existe perda de performance ao utilizar uma máquina virtual No caso do Java, fica-se limitado a uma linguagem (o que não acontece em.net!)

» I don t know what the language of the year 2000 will look like, but I know it will be called FORTRAN «C.A.R. Hoare Paradigmas de Programação Actualmente existem quatro paradigmas de linguagens de programação em uso comum: Imperativas (e.g. C, Pascal, Fortran) Funcionais (e.g. LISP, Scheme) Lógicas/Declarativas (e.g. Prolog) Orientadas-aos-Objectos (e.g. Java, C++, C#) Hoje em dia a indústria é dominada pelos paradigmas Imperativo e Orientado-aos-Objectos Evolução das Linguagens de Programação Linguagens de Programação -- Paradigmas -- Paulo Marques pmarques@dei.uc.pt http://www.dei.uc.pt/~pmarques Tecnologia dos Computadores 2004/2005

Linguagens Imperativas Para programar um computador diz-se que PROGRAMA = ESTRUTURAS DADOS + ALGORITMOS No programa existem variáveis que representam os dados Existe um conjunto de instruções que sucessivamente, a cada instrução, altera o valor das variáveis, manipulando os dados Segue de forma bastante próxima o modelo básico de funcionamento do processador Exemplos: C, Pascal, Fortran Tipos de Instruções Declaração de variáveis Controlo de fluxo - Selecção (if, switch, ) Iteração (for, while, do-while, ) Chamada de Funções e Procedimentos Estrutura Típica de uma Linguagem Imperativa Funções e Procedimentos int factorial; int n; int i; void main() { scanf( %d, &n); factorial = 1; for (i=1; i<=n; i++) factorial = factorial*i; printf( %d, factorial); A primeira parte do programa consiste na declaração dos dados A segunda parte do programa consiste nas instruções que manipulam os dados Procedimento: É um pequeno sub-programa dentro de um programa. Não tem valor de retorno. Função: É como se fosse um procedimento, mas tem um valor de retorno, calcula algo. Nota: apesar de não mostrado aqui, normalmente existem variáveis (dados) locais e globais

Passagem por Valor e por Referência Passagem por Referência (C++) As funções/procedimentos têm parâmetros de entrada. Os parâmetros podem ser passados por valor ou por referência. Na passagem por valor, apenas o valor é passado. Dentro da rotina, alterações na variável não afectam a variável original. Na passagem por referência, a variável que se encontra no parâmetro representa a variável original. Alterações na variável são reflectidas na variável original. void factorial(int& n) { for (int i=n-1; i>1; i--) n = n*i; printf( n! = %d\n, n); void main() { int n = 5; factorial(n); printf( n = %d\n, n); Ao chamar-se a função factorial(), a variável n representa a variável original com a qual se chama o programa (note-se que não têm de ter o mesmo nome). Alterações feitas sobre variável na função reflectem-se na variável original! Imprime n! = 120 n = 120 Passagem por Valor (C++) Personalidades John Backus void factorial(int n) { for (int i=n-1; i>1; i--) n = n*i; printf( n! = %d\n, n); void main() { int n = 5; factorial(n); printf( n = %d\n, n); Ao chamar-se a função factorial(), o valor de n é copiado para dentro da função. Não existe nenhuma relação entre a variável n do factorial e a variável n do programa principal excepto o seu valor inicial. Imprime n! = 120 n = 5 John Backus, desenvolveu o FORTRAN circa 1957, na IBM Foi a primeira linguagem de alto nível digna desse nome Era suposto levar 6 meses a fazer, levou mais de 2 anos ninguém sabia as técnicas básicas de implementar um compilador, aprenderam aqui. BNF: Backus-Naur Form

Dennis Ritchie (& Brian Kernighan) Exemplo: Factorial em LISP Dennis Ritchie Brian Kernighan Em 1967, M. Richards desenvolve a linguagem BCPL Em 1970, Ken Thompson implementa o núcleo sistema operativo UNIX em Assembly! A primeira linguagem/compilador escrita para Unix foi a B, uma variante do BCPL Dennis Ritchie (Bell Labs) reconhece a necessidade de implementar o próprio sistema operativo usando uma linguagem de alto nível: inventa o C, uma evolução do B A linguagem C é altamente apropriada para programação de sistema Dennis Ritchie e Brian Kernighan escrevem a bíblia do C: The C Programming Language (defun fact (x) (if (<= x 0) 1 (* x (fact (- x 1))) ) ) Não tem definição de tipos/variáveis Não tem instruções de iteração Não tem instruções de atribuição (Quase) Tudo são definições de funções Uso forte de recursividade A primitiva básica é a lista! (+ (* 2 4) (/ 4 3)) Linguagens Funcionais LISP Não existem atribuições de variáveis: tudo é feito invocando funções Tradicionalmente são utilizadas em cálculo simbólico / Inteligência Artificial Tipicamente tem suporte directo para trabalharem com Listas de Símbolos Exemplos: LISP, ML, Scheme Em termos de indústria não tiveram grande aceitação, embora se encontrem alguns locais (e.g. AutoCAD, Emacs ) Criado por John McCarthy em 1959 A principal ideia era a manipulação de símbolos utilizando listas directamente na linguagem LISP = LIST PROCESSING (+ 5 (* 2 5)) A primeira tentativa chamava-se FLPL (Fortran List Processing Language) As funcionalidades que McCarthy queria eram: Expressões condicionais (ifs) Recursividade Listas Garbage Collection Escreveu um artigo onde definia o LISP e a sua função base eval Uma aluno dele notou que era possível implementar o eval na prática, o que deu origem ao LISP!

Programação Lógica O programador não diz como é que se resolve um problema. Apenas diz: Quais são os factos Quais são os teoremas que descrevem o sistema O interpretador/compilador encarrega-se de encontrar a solução para as interrogações feitas ao programa Isto implica que na sua forma pura: Não existem atribuições Não existe controlo de fluxo Linguagem mais conhecida: PROLOG Também é fortemente baseada em listas Utilização: Inteligência Artificial PROLOG Calcular um Factorial Factos e Teoremas fact(n,1) :- N =:= 1. fact(n, Resultado) :- N > 1, K is N-1, fact(k, FactK), Resultado is N*FactK. PROLOG Raciocinar sobre Famílias Factos e teoremas (o que é dado ao sistema): pai(carlos, antonio). pai(antonio, jose). pai(miguel, antonio). avo(x,y) :- pai(x,z), pai(z,y). irmao(x,y) :- pai(x,z), pai(y,z). Interrogações (o que perguntamos ao sistema):?- pai(carlos, X). X = antonio; no?- avo(carlos, X). X = jose; no Programação Orientada aos Objectos Os grandes problema da programação imperativa, estruturada: Grande Acoplamento! Baixa Coesão! f() g() h() f() f() j() f() f() m() f() l() f() f() f() k() p() Dados (/Estruturas de Dados)?- irmao(carlos, X). X = miguel; no Temos os dados, e o programa é constituído por milhares de funções que -- Ou manipulam directamente esses dados -- Ou trocam imensos valores por parâmetro

Programação Orientada aos Objectos Em OOP (Object-Oriented Programming), as funções estão encapsuladas juntamente com os dados a que podem (e devem aceder) Fundamentos da OOP Noção de Classe e Objecto Herança Dados h() f() g() Dados q() l() m() Polimorfismo Dados h() f() g() Programação Orientada aos Objectos A principal ideia das objectos é que: Apenas as funções relacionadas com os dados lhes podem aceder Reduzir o acoplamento e aumentar a coesão Isto é, permitir a construção de software em projectos de larga escala, de forma consistente e fácil de gerir Para além disso, é muito mais natural pensar em termos de objectos e suas relações do que em termos de dados e algoritmos Programação estruturada: PROGRAMA = DADOS + ALGORITMOS Programação orientada aos Objectos PROGRAMA = OBJECTOS + RELAÇÕES Noção de Classe e Objecto Uma classe representa um grupo de coisas Exemplo: Pessoa, Automóvel É sempre um NOME Uma classe tem operações associadas: métodos Os métodos representam acções sobre uma entidade, logo são VERBOS Um objecto (ou instância) representa uma coisa em particular de um grupo. Exemplo: Paulo Marques, 43-23-XM

Classes e Objectos (Java) Polimorfismo class Pessoa { private String nome; private int idade; Capacidade de objectos diferentes se comportarem de forma diferente face à mesma chamada de método Pessoa(String nomepessoa, int idadepessoa) { nome = nomepessoa; idade = idadepessoa; public void identifica() { System.out.println(nome + : + idade); Pessoa cliente1 = new Pessoa( António, 32); Pessoa cliente2 = new Pessoa( José, 23); cliente1.identifica(); cliente2.identifica(); class Patrao extends Pessoa { public void identifica() { System.out.println( --- PATRAO --- ); System.out.println(nome + : + idade); class Empregado extends Pessoa { public void identifica() { System.out.println( --- EMPREGADO --- ); System.out.println(nome + : + idade); ( ) Pessoa p; p = patrao; p.identifica(); p = ze_ninguem; p.identifica(); Herança Um pouco de História Alan Kay É possível definir especializações de uma classe base. Chama-se a isso classe derivada. A classe derivada contém tudo o que a base contém, mas com informação/métodos adicionais class Patrao extends Pessoa { private String codigocofreempresa; public void abrecofre() { class Empregado extends Pessoa { private String balcao; public void abrebalcao() { Patrao boss = new Patrao( António, 32); Empregado ze_ninguem = new Empregado( José, 23); boss.identifica(); ze_ninguem.identifica(); boss.abrecofre(); ze_ninguem.abrebalcao(); Um dos pais da programação orientada aos objectos SmallTalk, Laboratórios da XEROX em Palo Alto, 1972 Também inventou o conceito de computador pessoal, GUI e Portátil (sim, para além da programação orientada aos objectos ) A ideia de computador pessoal era RADICAL! "There is no reason anyone would want a computer in their home." (Ken Olsen, Digital Equipment Corp, 1977) As ideias da programação orientada aos objectos, de Kay, vêm da Biologia!!!

Um pouco de História Bjarne Stroustrup Bjarne Stroustrup queria ter classes e objectos na linguagem C Criou um pré-processador que compilava a sua linguagem C with Classes para C 1984, Bell Labs, C++ Leitura Recomendada Niklaus Wirth Criador, entre outras coisas, do Algol-W, Pascal, MODULA e Oberon. A linguagem Pascal foi extremamente influente em termos de linguagens de programação Alguns dos problemas do C++ é que é horrivelmente grande, complicada de utilizar e muito fácil de cometer erros/gerar código de baixa qualidade Niklaus Wirth é conhecido pela sua determinação em tornar as coisas o mais simples e elegantes possíveis Um pouco de História JAVA Em 1991 a Sun começa um projecto para construir uma linguagem para sistemas embebidos Linguagem Oak, James Gosling, Sun Microsystems Para saber mais Computer Science An Overview Capítulo 5 (5.1, 5.2, 5.3, 5.4, 5.5, 5.7) Em 1994 a Internet começava a mostrar sinais promissores. O projecto Oak é adaptado para a Internet Nasce o Java em 1995 Filosofia do JAVA: Ser parecido com o C/C++ Eliminar radicalmente tudo o que há de mau (ou considerado mau) no C++ Adicionar ideias brilhantes de outros sistemas (Carregamento dinâmico de código, Máquina Virtual, Garbage Collection, Threads, ) Computer Science Illuminated Capítulo 8 (8.1, 8.2, 8.3, 8.4)