Paradigmas de Linguagens de programacao - Aula #2

Post on 25-May-2015

3.240 views 5 download

description

Paradigmas de Linguagens de programacao - Aula #2 Prof. Ismar Frango

Transcript of Paradigmas de Linguagens de programacao - Aula #2

Paradigmas de Linguagens de Programação

Paradigma ImperativoAula #2

(CopyLeft)2009 - Ismar Frango ismar@mackenzie.br

Paradigma Imperativo

for(i=0;;i++) conquistar(país[i]);

O Que é o paradigma imperativo?O fundamento para a programação imperativa é o conceito da Máquina de Turing, que nada mais é que uma abstração matemática que corresponde ao conjunto de funções computáveis.

A máquina de Turing foi aproximada por John von Neumann a uma arquitetura de computadores que fundamenta os computadores construídos até hoje.

Isso explica, em parte, o sucesso das linguagens que seguem esse paradigma em relação às demais.

Como funciona a programação imperativa?

A essência da programaçlão imperativa (e também da máquina de Turing) se resume a três conceitos:

•A descrição de estados de uma máquina abstrata por valores de um conjunto de variáveis

•Reconhecedores desses estados – expressões compostas por relações entre esses valores ou os resultados de operações utilizando valores.

•Comandos de atribuição e controle.

Programação imperativa em BASIC...10 REM RESOLVE EQUACAO DO SEGUNDO GRAU20 READ A,B,C25 IF A=0 THEN GOTO 41030 LET D=B*B-4*A*C40 IF D<0 THEN GOTO 43050 PRINT "SOLUCAO"60 IF D=0 THEN GOTO 10070 PRINT "PRIMEIRA SOLUCAO",(-B+SQR(D))/(2*A)80 PRINT "SEGUNDA SOLUCAO",(-B-SQR(D))/(2*A)90 GOTO 20100 PRINT "SOLUCAO UNICA",(-B)/(2*A)200 GOTO 20410 PRINT "A DEVE SER DIFERENTE DE ZERO"420 GOTO 20430 PRINT "NAO HA SOLUCOES REAIS"440 GOTO 20490 DATA 10,20,1241,123,22,-1500 END

Assim falou Dijkstra...

"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC; as potential programmers they are mentally mutilated beyond hope of regeneration." (Dijkstra)

How do we tell truths that might hurt?Edsger W. Dijkstra, 18/6/1975http://www.cs.virginia.edu/~evans/cs655/readings/ewd498.html

Qual foi a primeira Linguagem de Programação Imperativa?

Fortran

COBOL

BASICC

Pascal

Ada

ALGOL

Modula

Charles Babbage

Origens•Sem dúvida, as primeiras linguagens imperativas foram os códigos de máquina, com instruções simples, mas de construção complexa.•FORTRAN (FORmula TRANslator – John Backus, IBM, 1954) variáveis com nome, subprogramas, expressões complexas•ALGOL (1958, 1960,...) maior facilidade de expressar algoritmos matemáticos•COBOL (1960), BASIC (1964) sintaxe mais próxima do inglês•Pascal (Niklaus Wirth) e C (Dennis Ritchie) •Ada (1974-1983 – DoD)•...

Konrad Zuse

1945 – Z4 – Plankalkül

Z1 - 1936

Z2 - 1940

Z3 - 1941

Hinterstein

Plankalkül• Tipos: int, float (com complemento de 2), arrays e records (com recursão!)

• Sem goto, com for e if (mas sem else)

• Assertions!• Idéia de 1945, só publicada em 1972

| A + 1 => AV | 4 5S | 1.n 1.n

A[5] = A[4]+1 em Plankalkül

Elementos da Programação imperativa

• Definições de tipos de dados• Expressões e atribuições• Estruturas de controle de fluxo

(daí o termo “programação estruturada”)

• Definição de sub-rotinas (daí a “programação procedimental”)

!

Declarações de Variáveis

• Declarações de variáveis tipadas restringem:– O espaço de memória a ser gasto– Os valores que a variável pode assumir– As operações possíveis de se exceutar sobre a variável– Elementos default de inicialização (às vezes...)

• Questão de espaço...• Ex.: C em uma máquina de 32-bits:

– sizeof(char) = 1 byte– sizeof(short) = 2 bytes– sizeof(int) = 4 bytes– sizeof(char*) = 4 bytes (por quê?)

• E esse TAD?

«Once a programmer has understood the use

of variables, he has understood the

essence of programming»

(Edsger Dijkstra)

Próximos slides traduzidos a partir dos originais de Vitaly Shmatikov, da U. Texas (http://www.cs.utexas.edu/~shmat/courses/cs345_spring08/05imperative.ppt)

Variáveis: Localização e valores

• Quando uma variável é declarada, ela é associada a uma localização de memória, e seu nome se torna seu identificador.– A localização pode ser: global, heap ou stack

• l-value: localização de memória (address)• r-value: valor armazenado na localização identificada

pelo l-value• Atribuição: A (target) = B (expression)

– Destructive update: sobrescreve a localização identificada por A com o valor da expressão B

Variáveis e atribuição

• No RHS de uma atribuição, usa-se o r-value; no LHS, usa-se o l-value– Exemplo: x = x+1– Significado: “pegue o r-value de x, adicione 1, armazene o

resultado no l-value de x”

• Se uma expressão não tem l-value, ela não pode aparecer no LHS de uma atribuição– Mas que expressões não teriam l-values?

• Exemplo: 1=x+1, ++x++ (por quê?)• E a[1] = x+1, onde a é um array? (por quê?)• E a=b, onde a e b são arrays? (por quê?)• E se a e b forem structs? (por quê?)

l-Values, r-Values (1)

• Toda expressão/atribuição no paradigma imperativo pode ser visto em termos dos l-values e r-values das variáveis envolvidas

• Constantes e nomes de arrays em C– Têm r-values, mas não l-values (na especificação C-89, são

ditos terem “l-values imutáveis”)

• Variáveis– Têm r-values e l-values– Exemplo: x=x*y significa “compute rval(x)*rval(y) e

armazene em lval(x)”

l-Values, r-Values (2)

• Pointeiros– Seus r-values são l-values de outras variáveis

– Em C:• &x retorna l-value de x• *p retorna r-value de x (se p é um ponteiro, seu r-value é o l-value

de outra variável)

l-Values,r-Values (3)

• Sub-rotinas (funções, procedimentos)– Têm l-values, mas seus r-values são blocos de código

#include <string>using namespace std;int& f();

void func(){ int n; char buf[3]; n = 5; // n is an lvalue; 5 is an rvalue buf[0] = 'a'; //buf[0] is an lvalue, 'a' is an rvalue string s1 = "a", s2 = "b", s3 = "c"; // "a", "b", "c" are rvalues s1 = // lvalue s2 +s3; //s2 and s3 are lvalues that are implicitly converted to rvalues s1 = string("z"); // temporaries are rvalues int * p = new int; // p is an lvalue; 'new int' is an rvalue f() = 0; // a function call that returns a reference is an lvalue s1.size(); // otherwise, a function call is an rvalue expression}

Exemplo...