Paradigmas de Linguagens de programacao - Aula #2

18
Paradigmas de Linguagens de Programação Paradigma Imperativo Aula #2 (CopyLeft)2009 - Ismar Frango [email protected]

description

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

Transcript of Paradigmas de Linguagens de programacao - Aula #2

Page 1: Paradigmas de Linguagens de programacao - Aula #2

Paradigmas de Linguagens de Programação

Paradigma ImperativoAula #2

(CopyLeft)2009 - Ismar Frango [email protected]

Page 2: Paradigmas de Linguagens de programacao - Aula #2

Paradigma Imperativo

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

Page 3: Paradigmas de Linguagens de programacao - Aula #2

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.

Page 4: Paradigmas de Linguagens de programacao - Aula #2

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.

Page 5: Paradigmas de Linguagens de programacao - Aula #2

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

Page 6: Paradigmas de Linguagens de programacao - Aula #2

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

Page 7: Paradigmas de Linguagens de programacao - Aula #2

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

Fortran

COBOL

BASICC

Pascal

Ada

ALGOL

Modula

Charles Babbage

Page 8: Paradigmas de Linguagens de programacao - Aula #2

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)•...

Page 9: Paradigmas de Linguagens de programacao - Aula #2

Konrad Zuse

1945 – Z4 – Plankalkül

Z1 - 1936

Z2 - 1940

Z3 - 1941

Hinterstein

Page 10: Paradigmas de Linguagens de programacao - Aula #2

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

Page 11: Paradigmas de Linguagens de programacao - Aula #2

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”)

!

Page 12: Paradigmas de Linguagens de programacao - Aula #2

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)

Page 13: Paradigmas de Linguagens de programacao - Aula #2

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

Page 14: Paradigmas de Linguagens de programacao - Aula #2

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ê?)

Page 15: Paradigmas de Linguagens de programacao - Aula #2

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)”

Page 16: Paradigmas de Linguagens de programacao - Aula #2

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)

Page 17: Paradigmas de Linguagens de programacao - Aula #2

l-Values,r-Values (3)

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

Page 18: Paradigmas de Linguagens de programacao - Aula #2

#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...