paradigmas de linguagens de programacao - aula #2
Post on 25-May-2015
3.240 Views
Preview:
DESCRIPTION
TRANSCRIPT
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...
top related