Paradigmas de Linguagens de programacao - Aula #2
-
Upload
ismarfrango -
Category
Education
-
view
3.240 -
download
5
description
Transcript of Paradigmas de Linguagens de programacao - Aula #2
![Page 1: Paradigmas de Linguagens de programacao - Aula #2](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/1.jpg)
Paradigmas de Linguagens de Programação
Paradigma ImperativoAula #2
(CopyLeft)2009 - Ismar Frango [email protected]
![Page 2: Paradigmas de Linguagens de programacao - Aula #2](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/2.jpg)
Paradigma Imperativo
for(i=0;;i++) conquistar(país[i]);
![Page 3: Paradigmas de Linguagens de programacao - Aula #2](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/3.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/4.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/5.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/6.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/7.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/8.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/9.jpg)
Konrad Zuse
1945 – Z4 – Plankalkül
Z1 - 1936
Z2 - 1940
Z3 - 1941
Hinterstein
![Page 10: Paradigmas de Linguagens de programacao - Aula #2](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/10.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/11.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/12.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/13.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/14.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/15.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/16.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/17.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022081508/5562fbbdd8b42a275f8b4adc/html5/thumbnails/18.jpg)
#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...