Your SlideShare is downloading. ×
0
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Paradigmas de Linguagens de programacao - Aula #2

3,234

Published on

Paradigmas de Linguagens de programacao - Aula #2 …

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

Published in: Education
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,234
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
144
Comments
0
Likes
6
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Paradigmas de Linguagens de Programação Paradigma Imperativo Aula #2 (CopyLeft)2009 - Ismar Frango ismar@mackenzie.br
  • 2. Paradigma Imperativo for(i=0;;i++) conquistar(país[i]);
  • 3. 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.
  • 4. Como funciona a programação imperativa? <ul><li>A essência da programaçlão imperativa (e também da máquina de Turing) se resume a três conceitos: </li></ul><ul><li>A descrição de estados de uma máquina abstrata por valores de um conjunto de variáveis </li></ul><ul><li>Reconhecedores desses estados – expressões compostas por relações entre esses valores ou os resultados de operações utilizando valores. </li></ul><ul><li>Comandos de atribuição e controle. </li></ul>
  • 5. Programação imperativa em BASIC... 10 REM RESOLVE EQUACAO DO SEGUNDO GRAU 20 READ A,B,C 25 IF A=0 THEN GOTO 410 30 LET D=B*B-4*A*C 40 IF D<0 THEN GOTO 430 50 PRINT &quot;SOLUCAO&quot; 60 IF D=0 THEN GOTO 100 70 PRINT &quot;PRIMEIRA SOLUCAO&quot;,(-B+SQR(D))/(2*A) 80 PRINT &quot;SEGUNDA SOLUCAO&quot;,(-B-SQR(D))/(2*A) 90 GOTO 20 100 PRINT &quot;SOLUCAO UNICA&quot;,(-B)/(2*A) 200 GOTO 20 410 PRINT &quot;A DEVE SER DIFERENTE DE ZERO&quot; 420 GOTO 20 430 PRINT &quot;NAO HA SOLUCOES REAIS&quot; 440 GOTO 20 490 DATA 10,20,1241,123,22,-1 500 END
  • 6. Assim falou Dijkstra... &quot;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.&quot; (Dijkstra) How do we tell truths that might hurt? Edsger W. Dijkstra, 18/6/1975 http://www.cs.virginia.edu/~evans/cs655/readings/ewd498.html
  • 7. Qual foi a primeira Linguagem de Programação Imperativa? Fortran COBOL BASIC C Pascal Ada ALGOL Modula Charles Babbage
  • 8. Origens <ul><li>Sem dúvida, as primeiras linguagens imperativas foram os códigos de máquina, com instruções simples, mas de construção complexa. </li></ul><ul><li>FORTRAN (FORmula TRANslator – John Backus, IBM, 1954)  variáveis com nome, subprogramas, expressões complexas </li></ul><ul><li>ALGOL (1958, 1960,...)  maior facilidade de expressar algoritmos matemáticos </li></ul><ul><li>COBOL (1960), BASIC (1964)  sintaxe mais próxima do inglês </li></ul><ul><li>Pascal (Niklaus Wirth) e C (Dennis Ritchie) </li></ul><ul><li>Ada (1974-1983 – DoD) </li></ul><ul><li>... </li></ul>
  • 9. Konrad Zuse 1945 – Z4 – Plankalkül Z1 - 1936 Z2 - 1940 Z3 - 1941 Hinterstein
  • 10. Plankalkül <ul><li>Tipos: int, float (com complemento de 2), arrays e records (com recursão!) </li></ul><ul><li>Sem goto, com for e if (mas sem else) </li></ul><ul><li>Assertions! </li></ul><ul><li>Idéia de 1945, só publicada em 1972 </li></ul>| A + 1 => A V | 4 5 S | 1.n 1.n A[5] = A[4]+1 em Plankalkül
  • 11. Elementos da Programação imperativa <ul><li>Definições de tipos de dados </li></ul><ul><li>Expressões e atribuições </li></ul><ul><li>Estruturas de controle de fluxo (daí o termo “programação estruturada”) </li></ul><ul><li>Definição de sub-rotinas (daí a “programação procedimental”) </li></ul>!
  • 12. Declarações de Variáveis <ul><li>Declarações de variáveis tipadas restringem: </li></ul><ul><ul><li>O espaço de memória a ser gasto </li></ul></ul><ul><ul><li>Os valores que a variável pode assumir </li></ul></ul><ul><ul><li>As operações possíveis de se exceutar sobre a variável </li></ul></ul><ul><ul><li>Elementos default de inicialização (às vezes...) </li></ul></ul><ul><li>Questão de espaço... </li></ul><ul><ul><ul><li>Ex.: C em uma máquina de 32-bits: </li></ul></ul></ul><ul><ul><ul><ul><li>sizeof(char) = 1 byte </li></ul></ul></ul></ul><ul><ul><ul><ul><li>sizeof(short) = 2 bytes </li></ul></ul></ul></ul><ul><ul><ul><ul><li>sizeof(int) = 4 bytes </li></ul></ul></ul></ul><ul><ul><ul><ul><li>sizeof(char*) = 4 bytes (por quê?) </li></ul></ul></ul></ul><ul><ul><ul><li>E esse TAD? </li></ul></ul></ul>«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 )
  • 13. Variáveis: Localização e valores <ul><li>Quando uma variável é declarada, ela é associada a uma localização de memória, e seu nome se torna seu identificador. </li></ul><ul><ul><li>A localização pode ser: global, heap ou stack </li></ul></ul><ul><li>l-value: localização de memória (address) </li></ul><ul><li>r-value: valor armazenado na localização identificada pelo l-value </li></ul><ul><li>Atribuição: A (target) = B (expression) </li></ul><ul><ul><li>Destructive update : sobrescreve a localização identificada por A com o valor da expressão B </li></ul></ul>
  • 14. Variáveis e atribuição <ul><li>No RHS de uma atribuição, usa-se o r-value; no LHS, usa-se o l-value </li></ul><ul><ul><li>Exemplo: x = x+1 </li></ul></ul><ul><ul><li>Significado: “pegue o r-value de x, adicione 1, armazene o resultado no l-value de x” </li></ul></ul><ul><li>Se uma expressão não tem l-value, ela não pode aparecer no LHS de uma atribuição </li></ul><ul><ul><li>Mas que expressões não teriam l-values? </li></ul></ul><ul><ul><ul><li>Exemplo: 1=x+1 , ++x++ (por quê?) </li></ul></ul></ul><ul><ul><ul><li>E a[1] = x+1 , onde a é um array? (por quê?) </li></ul></ul></ul><ul><ul><ul><li>E a=b , onde a e b são arrays? (por quê?) </li></ul></ul></ul><ul><ul><ul><li>E se a e b forem structs? (por quê?) </li></ul></ul></ul>
  • 15. l-Values, r-Values (1) <ul><li>Toda expressão/atribuição no paradigma imperativo pode ser visto em termos dos l-values e r-values das variáveis envolvidas </li></ul><ul><li>Constantes e nomes de arrays em C </li></ul><ul><ul><li>Têm r-values, mas não l-values (na especificação C-89, são ditos terem “l-values imutáveis”) </li></ul></ul><ul><li>Variáveis </li></ul><ul><ul><li>Têm r-values e l-values </li></ul></ul><ul><ul><li>Exemplo: x=x*y significa “compute rval(x)*rval(y) e armazene em lval(x)” </li></ul></ul>
  • 16. l-Values, r-Values (2) <ul><li>Pointeiros </li></ul><ul><ul><li>Seus r-values são l-values de outras variáveis </li></ul></ul><ul><ul><li>Em C: </li></ul></ul><ul><ul><ul><li>&x retorna l-value de x </li></ul></ul></ul><ul><ul><ul><li>*p retorna r-value de x (se p é um ponteiro, seu r-value é o l-value de outra variável) </li></ul></ul></ul>
  • 17. l-Values,r-Values (3) <ul><li>Sub-rotinas (funções, procedimentos) </li></ul><ul><ul><li>Têm l-values, mas seus r-values são blocos de código </li></ul></ul>
  • 18. #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 = &quot;a&quot;, s2 = &quot;b&quot;, s3 = &quot;c&quot;; // &quot;a&quot;, &quot;b&quot;, &quot;c&quot; are rvalues s1 = // lvalue s2 +s3; //s2 and s3 are lvalues that are implicitly converted to rvalues s1 = string(&quot;z&quot;); // 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...

×