o essencial sobre linguagens de programação artur miguel dias março 2006 fct/unl

38
O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Upload: internet

Post on 17-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

O Essencial sobre Linguagens de Programação

Artur Miguel DiasMarço 2006

FCT/UNL

Page 2: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Índice

Um Pouco de História 3 Computação, Algoritmos e Programas

13 Critérios de avaliação de linguagens

21 Paradigmas de Programação

27 Conceitos básicos 31

Page 3: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Um Pouco de História: Linguagem Máquina

Datas No final da década de 40, não existiam

alternativas ao uso de linguagem máquina.

Principais características Instruções especificadas por meio de

códigos numéricos, em binário. Utilização directa de endereços

absolutos nos programas.

Page 4: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Um Pouco de História: Linguagem Máquina Discussão

Programas difíceis de escrever e quase impossíveis de ler.

Grande facilidade em cometer erros. Os programas só funcionam no tipo

específico de hardware para que foram escritos.

Dificuldade em inserir ou remover instruções nos programas, por causa dos endereços absolutos (a instrução nop ajuda um minorar um pouco este problema).

Page 5: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Um Pouco de História: Assemblers Datas

Assemblers começaram a surgir no início dos anos 50.

Características mais importantes Permitem atribuir nomes a códigos de operação

(mnemónicas), a localizações de memória (etiquetas) e a constantes.

Um tradutor – chamado assembler – traduz instruções assembler em instruções máquina.

Um programa pode conter directivas que não dão origem a código: declaração de constantes, por exemplo.

Page 6: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Um Pouco de História: Assemblers

Discussão Os aspectos negativos mais dramáticos da

linguagem máquina ficam minorados. No entanto os programas continuam a ser

difíceis de escrever e de ler. Os programas também continuam a ter de

ser escritos para arquitecturas particulares. Mas já se observam algumas “sementes”

das futuras linguagens de programação.

Page 7: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Um Pouco de História: Assemblers

.file "fact.c" .section .rodata.LC0: .string "> ".LC1: .string "%d".LC2: .string "fact(%d) = %d\n" .text.globl main

.type main, @function pushl %ebp movl %esp, %ebp subl $40, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax subl %eax, %esp movl $.LC0, (%esp) call printf leal -12(%ebp), %eax movl %eax, 4(%esp)

movl $.LC1, (%esp)call scanf

movl $1, -4(%ebp) movl $1, -8(%ebp) jmp .L2.L3: movl -4(%ebp), %eax imull -8(%ebp), %eax movl %eax, -4(%ebp) leal -8(%ebp), %eax addl $1, (%eax).L2: movl -12(%ebp), %eax cmpl %eax, -8(%ebp) jle .L3 movl -12(%ebp), %edx movl -4(%ebp), %eax movl %eax, 8(%esp) movl %edx, 4(%esp) movl $.LC2, (%esp) call printf movl $0, %eax leave ret .size main, .-main

Exemplo: Programa “factorial” escrito para o Pentium

Page 8: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Um Pouco de História: Fortran

Datas Anunciado por John Backus da IBM em 1954. A

implementação inicial, designada Fortran I, ficou disponível em 1957, com compiladores para IBM 704 e IBM 709.

Prometia Eficiência dos programas escritos em assembler. Simplificar a escrita de programas mediante o uso de

notação matemática (Fortran = “FORmula TRANslator”).

Reduzir os erros de programação.

Page 9: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Um Pouco de História: Fortran

Características mais importantes Instruções de controlo pobres e influenciadas

pelas instruções da máquina IBM 704. Necessário recorrer muito à instrução goto.

Suporte para inteiros, reais e arrays, mas não para registos.

Suporte para variáveis estáticas. Impossível criar novas variáveis em tempo de execução.

Suporte para subrotinas não recursivas.

Page 10: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Um Pouco de História: Fortran Discussão

Depois do Fortran I foram surgindo versões melhoradas: Fortran II em 1958, Fortran IV em 1962, Fortran 77 em 1978 e Fortran 90 em 1990.

Tornou-se na primeira linguagem de programação popular e, a partir do início dos anos 60, mudou de forma revolucionária a forma como os computadores eram usados.

Ainda é bastante usada actualmente em aplicações de cálculo numérico!

Passou a ser possível escrever programas portáveis!

Page 11: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Um Pouco de História: Fortran

READ 10,I10 FORMAT(I3)

J=1DO 20 K=1,IJ=J*K

20 CONTINUEPRINT 10,JSTOP

Exemplo: Programa “factorial” em Fortran

Page 12: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Um Pouco de História

Outras linguagem pioneiras (início anos 60) Algol 60: primeiro passo em direcção à

sofisticação das linguagens modernas. Lisp: dominou as aplicações de IA durante

25 anos. Cobol: linguagem das empresas e do DoD. Basic: muito simples de aprender,

destinada a não especialistas.

Page 13: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Computação, Algoritmos e Programas

Computação Significa: processamento automático

de informação. É a actividade realizada pelos

computadores. O objectivo da informática é estudar a

computação e formas úteis de tirar partido da computação (nomeadamente para resolver problemas importantes).

Page 14: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Computação, Algoritmos e Programas

Facetas da computação Faceta interna: a informação é codificada

usando símbolos (e.g. bytes), sendo realmente a computação uma actividade de manipulação e transformação automática de símbolos …

Faceta externa: … mas, geralmente, as computações também estabelecem um diálogo interactivo com o ambiente exterior (constituído por humanos e por outras máquinas).

Page 15: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Computação, Algoritmos e Programas Automatismos e sua especificação

Qualquer computação é realizada de acordo com regras estabelecidas antes desse processamento se iniciar. É isso que significa o processamento ser automático.

Daí a necessidade que especificar as computações de forma rigorosa e exaustiva, prevendo todas as eventuali-dades.

Page 16: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Computação, Algoritmos e Programas Algoritmo

É um conjunto de regras abstractas (uma espécie de receita) que determinam, passo a passo, como uma computação vai decorrer.

Programa É uma descrição possível dum algoritmo. Um

programa serve para implementar um algoritmo.

Linguagem de programação É uma notação para escrever programas, ou

seja para implementar algoritmos.

Page 17: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Computação, Algoritmos e Programas

Exemplo de algoritmo: algoritmo de Euclides – mdc(m,n) Usar dois contadores x e y e inicializar x

com m e y com n. Se x > y então x recebe x - y Se x < y então y recebe y - x Repetir os dois passos anteriores até que os

valores de x e y fiquem iguais. Quando isso acontecer, esse é o resultado final.

Page 18: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Computação, Algoritmos e Programas Implementação em C do algoritmo anterior#include <stdio.h>int main() /* Implementação do algoritmo de Euclides */{ int m, n, x, y ; printf(">> ") ; scanf("%d %d", &m, &n) ; x = m ; y = n ; do { if( x > y ) x = x - y ; else if( x < y ) y = y - x ; } while( x != y ) ; printf("mdc(%d,%d) = %d\n", m, n, x) ; return 0 ;}

Page 19: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Computação, Algoritmos e Programas Algoritmos

A principal motivação para se usarem máquinas para executar algoritmos é a grande velocidade de execução que elas permitem.

Os algoritmos mais antigos que se conhecem devem-se aos Babilónios (3000AC-1500AC). Os seus livros de Matemática eram acima de tudo receitas sobre como efectuar os cálculos para resolver determinados problemas. Esses algoritmos eram para executar “à mão”.

Page 20: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Computação, Algoritmos e Programas Três questões importantes sobre

computa-ção e linguagens. Existem limites para a computação?

Sim, realmente existem problemas com solução para os quais não se consegue escrever qualquer algoritmo que descubra essa solução.

Existe alguma linguagem de programação que permita implementar todos os algoritmos que se possam imaginar?

Sim, qualquer linguagens normal permite isso. Do ponto de vista do poder computacional, todas as linguagens normais são equivalentes.

Page 21: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Critérios de avaliação de linguagens Se todas as linguagens têm idêntico poder

computacional, estão porque razão existem tantas linguagens de programação (milhares!) e se estão constantemente a criar novas? Pelas seguintes razões:

Uma linguagem deve ajudar o programador a exprimir de forma clara e directa os seus objectivos. De acordo com este critério há linguagens melhores e piores (compare o Fortran com o C++, por exemplo) e é sempre possível ir melhorando.

Há linguagens que favorecem uns domínios de aplicação relativamente a outros.

Page 22: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Critérios de avaliação de linguagens

Legibilidade Possibilidade de, através do exame de um

programa escrito por outra pessoa, de seguir a sua lógica e descobrir a presença de erros. Para isso são importantes os seguintes factores:

Simplicidade (permite conhecer a linguagem toda); Ortogonalidade (todas as combinações dos

mecanismos primitivos são válidas); Estruturas de controlo de qualidade; Estruturas de dados de qualidade; Sintaxe racional (com palavras reservadas,

construções diferentes para mecanismos diferentes).

Page 23: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Critérios de avaliação de linguagens

Redigibilidade Possibilidade de expressar um problema de

forma natural, sem que a atenção do programador seja desviada por detalhes ou "truques" da linguagem. Para isso são importantes os seguintes factores:

Simplicidade (menos erros); Ortogonalidade (não se perde tempo a pensar em

excepções às regras gerais); Suporte para abstracção (ajuda a dominar a

complexidade dos problemas); Expressividade (construções simples para as

operações frequentes).

Page 24: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Critérios de avaliação de linguagens

Segurança Possibilidade de escrever programas que dêem

garantias de que atingem o efeito desejado. Para isso são importantes os seguintes factores:

Sistema de tipos estático (detecta todas as incompatibilidades de tipo em tempo de compilação);

Tratamento de excepções (permite a tomada de medidas correctivas em situações inesperadas);

Ausência de sinonímia (é perigoso uma mesma entidade ser conhecida por dois nomes diferentes).

Page 25: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Critérios de avaliação de linguagens

Eficiência Actualmente a eficiência já não é mais

medida apenas com base velocidade de execução dos programas e na economia no uso da memória.

Considera-se também o esforço necessário para produzir os programas e o esforço necessário para os manter.

Page 26: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Critérios de avaliação de linguagens

Facilidade em escrever programas grandes Modularidade: Possibilidade de escrever

um programa por partes, para melhor o estruturar e compreender.

Componentes: Possibilidade de incorporar num programa componentes “pronto-a-vestir” e substituir certas componentes do programa por outras melhores no futuro.

Page 27: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Paradigmas de Programação Já sabemos que computação significa

processamento automático de informação, mas esta noção é demasiado vaga. Podemos interrogar-nos sobre quais os mecanismos concretos através dos quais esse processamento se efectua.

Na verdade, uma linguagem não pode deixar de se comprometer com algum conjunto mecanismos primitivos para processar informação. Ao efectuar essa escolha, a linguagem adere a um paradigma de programação particular.

É surpreendente a grande variedade de paradigma de programação que têm sido inventados.

Page 28: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Paradigmas de Programação

Os alunos da LEI são expostos a cinco paradigmas de programação:

Paradigma imperativo Conceitos de base: estado, atribuição, sequenciação Linguagens: Basic, Pascal, C, Assembler.

Paradigma funcional Conceitos de base : função, aplicação, avaliação Linguagens: Lisp, ML, OCaml, Haskell.

Paradigma lógico Conceitos de base : relação, dedução Linguagens: Prolog.

Paradigma orientado pelos objectos Conceitos de base : objecto, mensagem Linguagens: C++, Java, Eiffel.

Paradigma concorrente Conceitos de base : processo, comunicação (síncrona ou

assíncrona) Linguagens: Occam, Ada, Java.

Page 29: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Paradigmas de Programação

Cada paradigma de programação determina uma forma particular de abordar os problemas e de formular as respectivas soluções.

Cada paradigma de programação dá origem a um estilo particular de linguagens de programação.

Page 30: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Paradigmas de Programação O grau de sucesso dum programador depende

em parte da colecção de paradigmas que domina e da sua arte em escolher o mais indicado para analisar e resolver cada problema.

A maior parte das linguagens em uso suportam mais do que um paradigma. A tendência multi-paradigma das linguagens modernas tem sido crescente.

Por exemplo, o C++ suporta os paradigmas imperativo e orientado pelos objectos. O Java suporta os paradigmas imperativo, orientado pelos objectos e concorrente.

Page 31: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Conceitos básicos:Literais

Um literal é uma expressão constante que denota um valor particular. Exemplos em C++: 0, 5, -127 56.7, -33.4e32 ”ola”, ”ole” false, true

Page 32: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Conceitos básicos:Expressões

São entidades geralmente compostas que podem ser avaliadas para produzir um valor. Exemplos em C++: 5+x 56.7 * 3.4 ”ola” + ”ole” x + 3 > y - 4

Page 33: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Conceitos básicos:Definições Uma definição associa um nome a uma

entidade. O seguinte exemplo contém três

definições: a primeira associa o nome f à função apresentada, a segunda associa x à constante 10 e a terceira associa y a uma posição de memória nova.

void f() {const int x = 10 ;double y ;…

}

Page 34: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Conceitos básicos:Âmbito O âmbito duma definição é a zona do programa

em que uma definição está activa. Por exemplo, o âmbito da variável y é a porção

do código que começa na linha da sua definição até ao final a função (assumindo que o y não é redefinido no interior – pois um âmbito pode ter “buracos”).

void f() {const int x = 10 ;double y ;…

}

Page 35: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Conceitos básicos:Extensão duma variável A extensão duma variável é o período da

execução do programa durante o qual a variável pode ser acedida.

Há três categorias: Variáveis estáticas (extensão = toda a vida do

programa) Variáveis automáticas (extensão = tempo de

vida da função na qual estão declaradas). Variáveis dinâmicas (criadas com new e

apagadas com delete e acedidas através de apontadores; o uso destas primitivas determinam a extensão duma variável dinâmica).

Page 36: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Conceitos básicos:Âmbito e extensão Problema: qual o âmbito e qual a

extensão da variável count que ocorre dentro da função g?

void g() {static int count = 0 ;count++ ;…

}

Page 37: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

Conceitos básicos:Parametrização Parametrizando parte dum programa

num nome obtém generalidade. Somar 100 à variável y:

y := y + 100 Função que permite somar qualquer v a

y:void add(int v) { y := y + v ; }

Quais as formas de parametrização disponíveis na linguagem C++?

Page 38: O Essencial sobre Linguagens de Programação Artur Miguel Dias Março 2006 FCT/UNL

O Essencial sobre Linguagens de Programação

Fim