Paradigmas de Linguagens de Programacao - Aula #5
-
Upload
ismarfrango -
Category
Education
-
view
1.732 -
download
2
description
Transcript of Paradigmas de Linguagens de Programacao - Aula #5
![Page 1: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/1.jpg)
Paradigmas de Paradigmas de Linguagens de Linguagens de ProgramaçãoProgramação
Paradigma Imperativo [Teoria de Tipos]Aula #5
(CopyLeft)2009 - Ismar Frango [email protected]
![Page 2: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/2.jpg)
Sistema de tiposSistema de tipos
O que é um sistema de tipos?
“A type system is a tractable syntacticmethod for proving
the absence of certain
program behaviors by classifying
phrasesaccording to the
kinds of values theycompute”
Detecção de erros
Segurança
Design
Abstração
Verificação
Evolução
Documentação
“Types are the leaven of
programming, they make it digestible”
Robin Milner
![Page 3: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/3.jpg)
Em outras palavras...Em outras palavras...
Um sistema de tipos é uma definição precisa das associações entre o tipo de uma variável, seus valores e as operações possíveis sobre esses valoresUm erro de tipo é qualquer erro que surja porque uma operação é tentada sobre um tipo de dado para o qual ela não está definida.
Quanto custa um erro de tipo?
implementação teste manutenção
$1 $10 $100
$472mi$$
![Page 4: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/4.jpg)
Como classificar um sistema de Como classificar um sistema de tipos?tipos?
weak strong
dynamic
staticman
ifest
implic
it
![Page 5: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/5.jpg)
Strong or weak?Strong or weak?
• A tipagem é mutável (é possível mudar o tipo do valor associado a uma variável)?
• Como são gerenciados os erros de tipo?
Sim Não
Crash! Detectados (em tempo de comp. ou exec.)
![Page 6: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/6.jpg)
Strong or weak?Strong or weak?struct A {
char c;
int i;
};
struct B {
float f;
char c;
};
int main(int argc, char* argv) {
struct A a = {'c', 1024};
struct B* b = (struct B*)&a;
printf("'%c' %d %f '%c'\n", a.c, a.i, b->f, b->c);
}
'c' 1024 149611321247666274304.000000 ' '
C
![Page 7: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/7.jpg)
Strong or weak?Strong or weak?
class Silly: def __init__(self, data): self.data = data def __add__(self, other): return str(self.data) + str(other.data)
def double(a): return a + a
print double(1)print double('x')print double([1])print double(Silly({'a':1}))print double({'a':1})
Python
2xx[1, 1]{'a': 1}{'a': 1}
Traceback (most recent call last): File "test.py", line 14, in ? print double({'a':1}) File "test.py", line 8, in double return a + aTypeError: unsupported operand types for +: 'dict' and 'dict'
![Page 8: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/8.jpg)
Strong or weak?Strong or weak?
var s : array [1..10] of character; s := 'hello';
Pascal
ERRO
![Page 9: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/9.jpg)
“Why Pascal is Not My Favorite Programming Language”Brian W. Kernighanhttp://www.lysator.liu.se/c/bwk-on-pascal.html
Tipagem (muito) forte vale a pena?Tipagem (muito) forte vale a pena?
“Comparing C and Pascal is rather like comparing a Learjet to a Piper Cub - one is meant for getting something done while the other is meant for learning.”
![Page 10: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/10.jpg)
Static or dynamic?Static or dynamic?
• Quem sabe o tipo de um elemento?
• Em que momento operações unsafe são rejeitadas?
• Usa reflexão?
A variável O elemento
Compile time Runtime
Pouco Muito
![Page 11: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/11.jpg)
Static or dynamic?Static or dynamic?
int i = 1; C#3.0
List<string> list = new List<string>();
var i = 1;
var list = new List<string>();
var != object != Variant
Type inference!
![Page 12: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/12.jpg)
Static or dynamic?Static or dynamic?
Customer c = GetCustomer();var d = new { Name = c.Name, City = c.City };
Tipo anônimo
public void Linq1() { int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNums = from n in numbers where n < 5 select n;
Console.WriteLine("Numbers < 5:"); foreach (var x in lowNums) { Console.WriteLine(x); }}
C#3.0
C#3.0(LINQ)
![Page 13: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/13.jpg)
Manifest or implicit?Manifest or implicit?
Em sistemas de tipos manifest (explicit), toda a informação deve ser providenciada pelo programador
Em sistemas de tipos implicit, o maior número possível de informação deve ser inferida
![Page 14: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/14.jpg)
Exercitando...Exercitando...
n=5print(type(n)) --numbers="5"print(type(s)) -- stringsoma=n+sprint(soma) -- 10print(type(soma)) --numberc = n ..sprint(c) -- string (55)print(type(c)) -- string
Lua
![Page 15: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/15.jpg)
Exercitando...Exercitando...
function newCounter () { var i = 0 return function () { // anonymous function i = i + 1 return i }}
c1 = newCounter()alert(c1())alert(c1())alert(c1())alert(c1())alert(c1())
Javascript
![Page 16: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/16.jpg)
Exercitando...Exercitando...
FUNCTION F(X) INTEGER F, X F = X+1 RETURN
N = F(37)
FORTRAN
![Page 17: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/17.jpg)
Exercitando...Exercitando...
#include <stdio.h>int main(void) { unsigned char *c; float f = 10;
for (c = (char *)&f; c < sizeof(float) + (char *)&f; c++) { printf("%u ", *c); } putchar('\n');
return 0; }
0 0 32 65
C
ERRO: comparison between distinct pointer types `unsigned char*' and `char*' lacks a cast
![Page 18: Paradigmas de Linguagens de Programacao - Aula #5](https://reader035.fdocumentos.com/reader035/viewer/2022081505/5562fc00d8b42a62598b4b80/html5/thumbnails/18.jpg)
Exercitando...Exercitando...#include <iostream>using namespace std; struct A {void f() { cout << "Class A" << endl; }}; struct B : A {void f() { cout << "Class B" << endl; }}; struct C : A {void f() { cout << "Class C" << endl; }}; void f(A* arg) { B* bp = (B*)(arg); C* cp = (C*)(arg); bp->f(); cp->f(); arg->f();}; int main() { A aobj; C cobj; A* ap = &cobj; A* ap2 = &aobj; f(ap); f(ap2);}
C
BCABCA
virtual
CCCAAA
dynamic_cast<B*>