Paradigmas de Linguagens de Programação Paradigma Imperativo Aula #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 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
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
Qual foi a primeira Linguagem de Programação Imperativa? Fortran COBOL BASIC C 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 => A V | 4  5 S | 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 = &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...

Paradigmas de Linguagens de programacao - Aula #2

  • 1.
    Paradigmas de Linguagensde Programação Paradigma Imperativo Aula #2 (CopyLeft)2009 - Ismar Frango ismar@mackenzie.br
  • 2.
  • 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 aprogramaçã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.
  • 5.
    Programação imperativa emBASIC... 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 aprimeira Linguagem de Programação Imperativa? Fortran COBOL BASIC C Pascal Ada ALGOL Modula Charles Babbage
  • 8.
    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) ...
  • 9.
    Konrad Zuse 1945– Z4 – Plankalkül Z1 - 1936 Z2 - 1940 Z3 - 1941 Hinterstein
  • 10.
    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 => A V | 4 5 S | 1.n 1.n A[5] = A[4]+1 em Plankalkül
  • 11.
    Elementos da Programaçãoimperativa 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”) !
  • 12.
    Declarações de VariáveisDeclaraçõ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 )
  • 13.
    Variáveis: Localização evalores 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
  • 14.
    Variáveis e atribuiçãoNo 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ê?)
  • 15.
    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)”
  • 16.
    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)
  • 17.
    l-Values,r-Values (3) Sub-rotinas(funções, procedimentos) Têm l-values, mas seus r-values são blocos de código
  • 18.
    #include <string> usingnamespace 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...