Tipos e Valores
Adaptado de © 2004, Programming Language Design Concepts
D.A. Watt, University of Glasgow
Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)
prof.sergio.costa@gmail.com
https://sites.google.com/site/profsergiocosta/home
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
http://www.slideshare.net/skosta/presentations?order=popular
Para pensar ...
●
●
●
●
Roteiro
Tipos
Valores são agrupados por tipos de acordo com as operações
poder ser executadas sobre eles.
Tipos
Diferentes linguagens suport diferente tipos de dados.
Tipos
Diferentes linguagens suport diferente tipos de dados.
Ada: booleans, characters, enumerands, integers, real numbers, records, arrays,
discriminated records, objects (tagged records), strings, pointers to data, pointers to
procedures.
C: enumerands, integers, real numbers, structures, arrays, unions, pointers to variables,
pointers to functions.
Java: booleans, integers, real numbers, arrays, objects.
Haskell: booleans, characters, integers, real numbers, tuples, disjoint unions, lists, tipos
recursivos.
Tipos
Tipo é um conjunto de valores:
v é um valor de tipo T se v Є T.
Tipos
Tipo é um conjunto de valores:
v é um valor de tipo T se v Є T.
E é uma expressão de tipo T se E leva a um valor do tipo T.
Tipos
Tipo é um conjunto de valores:
v é um valor de tipo T se v Є T.
E é uma expressão de tipo T se E leva a um valor do tipo T.
Um tipo é um conjunto de valores que exibe um
comportamento uniforme sob operações associadas a este
conjunto.
Tipos
Tipo é um conjunto de valores:
v é um valor de tipo T se v Є T.
E é uma expressão de tipo T se E leva a um valor do tipo T.
Um tipo é um conjunto de valores que exibe um
comportamento uniforme sob operações associadas a este
conjunto.
Boolean {true, false}, Operações: and, or, not, etc
Tipos
Tipo é um conjunto de valores:
v é um valor de tipo T se v Є T.
E é uma expressão de tipo T se E leva a um valor do tipo T.
Um tipo é um conjunto de valores que exibe um
comportamento uniforme sob operações associadas a este
conjunto.
Boolean {true, false}, Operações: and, or, not, etc
{15, true, azul} é um tipo?
Tipos: Cardinalidade
A cardinalidade de um tipo T, escrito #T, e o número de
valores do tipo T.
● #Boolean = 2
Tipos: classificação
Classificação de tipos:
○ Primitivos
○ Compostos
Tipos primitivos
Valores primitivos são aqueles cujos valores são atômicos –
não podem ser decompostos em valores mais simples.
Tipo primitivo é onde os valores são primitivos.
Toda linguagem de programação possui tipos primitivos, e
algumas permitem definir novos.
Tipos primitivos - exemplos
Boolean = {false, true}
Character = {…, ‘A’, …, ‘Z’, …, ‘0’, …, ‘9’, …}
Integer = {…, –2, –1, 0, +1, +2, …}
Float = {…, –1.0, …, 0.0, +1.0, …}
Tipos primitivos - cardinalidade
#Boolean = 2
#Character = 128 (ASCII), 256 (ISO-Latin), or 32768 (Unicode)
#Integer = max integer – min integer + 1
Note: Em algumas linguagens (ex. C), booleans e characters
são inteiros.
Criando tipos primitivos
Em Ada é possível definir novos tipos .
●Declaração:
type Population is range 0 .. 1000;
●Conjunto de valores:
Population = {0, 1, …, 1000}
●Cardinalidade:
#Population = 1001
Criando tipos primitivos
Em diversas linguagens é possível definir tipos de dados
enumeráveis.
C:
enum Cor { VERMELHA, PRETA };
Ada:
type Color is (VERMELHA, PRETA );
Haskell
data Color = Vermelha | Preta
Tipos Compostos
Um valor composto ou estruturado é quando o seu valor é
composto a partir de valores mais simples.
Tipo composto é um tipo cujos valores são compostos.
Linguagens de programação (LP) suporta uma grande
variedade deles.
Tipos Compostos
●
●
●
●
Produtos Cartesianos
Produtos Cartesianos
struct Point {
x,y: double;
};
structures (C)
type Point is record
x: Double;
y: Double;
end record;
Records (Ada)
type Point = (Double,Double)
tuplas (Haskell)
class Point:
x = 0;y =0;
Class (Python)
Produtos Cartesianos - ADA
type Month is (jan, feb, mar, apr, may, jun,
jul, aug, sep, oct, nov, dec);
type Day_Number is range 1 .. 31;
type Date is record
m: Month;
d: Day_Number;
end record;
someday: Date := (jan, 1);
…
put(someday.m+1); put("/"); put(someday.d);
someday.d := 29; someday.m := feb;
Produtos Cartesianos -Haskell
someday = (jan, 1)
(m,d) = someday
anotherday = (m + 1, d)
Valores:
data Month = Jan | Feb | Mar | Apr
| May | Jun | Jul | Aug
| Sep | Oct | Nov | Dec
type Date = (Month, Int)
Date = Month X Integer
= {Jan, Feb, …, Dec} X {…, –1, 0, 1, 2, …}
Uso:Declarações:
Produtos Cartesianos
class Point {
public:
Point (double x, double y);
double x() { .. }
double y() { .. }
private:
double x,y;
};
Uniões disjuntas
Uniões disjuntas
union {
int exact;
float inexact;
};
Union em C
data Number = Exact Int
Inexact Float
Tipos algébricos em Haskell
type Accuracy is (exact, inexact);
type Number (acc: Accuracy := exact) is record
case acc of
when exact => ival: Integer;
when inexact => rval: Float;
end case;
end record;
Ada
Unions e cartesianos
typedef enum { int_t, float_t ,string_t} TYPE;
union m_value {
int int_value;
float float_value;
char* str_value;
} ;
struct symbol {
const char* name;
union m_value* val;
TYPE t;
};
Mapeamentos
Mapeamentos - Arrays
●
●
●
Array - Ada
type Color is (red, green, blue);
type Pixel is array (Color) of Boolean;
p: Pixel := (true, false, true);
c: Color;
…
p(c) := not p(c);
Array - Ada
Pixel = Color -> Boolean = {red, green, blue} -> {false, true}
viz: {red -> false, green -> false, blue -> false}
{red -> false, green -> false, blue -> true}
{red -> false, green -> true, blue -> false}
{red -> false, green -> true, blue -> true}
{red -> true, green -> false, blue -> false}
{red -> true, green -> false, blue -> true}
{red -> true, green -> true, blue -> false}
{red -> true, green -> true, blue -> true}
#Pixel = (#Boolean)#Color
= 23
= 8
Mapeamento - Função
Mapeamento - Função - Ada
Definição:
function is_even (n: Integer) return Boolean is
begin
return (n mod 2 = 0);
end;
Tipo:
Integer -> Boolean
Valores:
{…, 0 -> true, 1 -> false, 2 -> true, 3 -> false, …}
Mapeamento - Função - Haskell
Definição:
is_even n = (mod n 2 == 0)
Tipo
Integer -> Boolean
Valores:
{…, 0 -> true, 1 -> false, 2 -> true, 3 -> false, …}
Tipos Recursivos
●
●
●
Números Naturais - Haskell
data Nat = Zero | Succ Nat deriving (Show)
soma :: Nat -> Nat -> Nat
soma Zero n = n
soma (Succ m) n = Succ (soma m n)
mult :: Nat -> Nat -> Nat
mult Zero m = Zero
mult (Succ m) n = soma n (mult n m)
Tipos Recursivos - Lista
●
Tipos Recursivos - Lista - Haskell
data IntList = Nil | Cons Int IntList
>Nil
>Cons 2 (Cons 3 (Cons 5 (Cons 7 Nil)))
[Int] [String] [[Int]]
[] [2,3,5,7]["cat","dog"][[1],[2,3]]
Strings
● Seqüência de 0 ou mais caracteres.
● Não existe consenso sobre sua classificação.
● Strings são tipos primitivos ou compostos?
● Python, ML, Lua são tipos primitivos
● Em Haskell é uma lista de caracter
● Em C, vetor de caracter.
● Java trata strings como objetos da classe String.
Sistema de tipos
●
○
●
●
●
Checagem de tipos
●
●
Linguagem estáticas - C
int max (int a, int b) {
if (a > b) return a;
else return b
}
max (4, 5)
max (3.5,3.1)
Linguagem dinâmicas - Lua
Estáticos X Dinâmico
●
●
●
○
Inferência de tipos
Erro de tipos
●É a aplicação de um operador a um operando de um tipo
inapropriado
○Atribuir um int para uma função que espera um float nas
primeiras versões de C
●Se todas as vinculações de variáveis a tipos forem estáticas
na linguagem, a verificação de tipos pode ser feita toda em
tempo de compilação
●Em linguagens dinâmicas (JavaScript, PHP) isso só pode
ser feito em tempo de execução
Tipagem forte
●
○
●
●
○
●
Tipagem forte
●
○
●
○
●
●
●
○
Tipagem forte e coerção
●
○
●
●
// convertido implicitamente para inteiro
int a = 10.5;
●
●
●
●
Completude de tipo
●
●
●
Completude de tipo
$(“button”).click(function(){
facaAlgo();
});
Completude de tipo
Revisão

Tipos e valores

  • 1.
    Tipos e Valores Adaptadode © 2004, Programming Language Design Concepts D.A. Watt, University of Glasgow
  • 2.
    Sobre mim Sérgio SouzaCosta Professor - UFMA Doutor em Computação Aplicada (INPE) prof.sergio.costa@gmail.com https://sites.google.com/site/profsergiocosta/home https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta http://www.slideshare.net/skosta/presentations?order=popular
  • 3.
  • 4.
  • 5.
    Tipos Valores são agrupadospor tipos de acordo com as operações poder ser executadas sobre eles.
  • 6.
    Tipos Diferentes linguagens suportdiferente tipos de dados.
  • 7.
    Tipos Diferentes linguagens suportdiferente tipos de dados. Ada: booleans, characters, enumerands, integers, real numbers, records, arrays, discriminated records, objects (tagged records), strings, pointers to data, pointers to procedures. C: enumerands, integers, real numbers, structures, arrays, unions, pointers to variables, pointers to functions. Java: booleans, integers, real numbers, arrays, objects. Haskell: booleans, characters, integers, real numbers, tuples, disjoint unions, lists, tipos recursivos.
  • 8.
    Tipos Tipo é umconjunto de valores: v é um valor de tipo T se v Є T.
  • 9.
    Tipos Tipo é umconjunto de valores: v é um valor de tipo T se v Є T. E é uma expressão de tipo T se E leva a um valor do tipo T.
  • 10.
    Tipos Tipo é umconjunto de valores: v é um valor de tipo T se v Є T. E é uma expressão de tipo T se E leva a um valor do tipo T. Um tipo é um conjunto de valores que exibe um comportamento uniforme sob operações associadas a este conjunto.
  • 11.
    Tipos Tipo é umconjunto de valores: v é um valor de tipo T se v Є T. E é uma expressão de tipo T se E leva a um valor do tipo T. Um tipo é um conjunto de valores que exibe um comportamento uniforme sob operações associadas a este conjunto. Boolean {true, false}, Operações: and, or, not, etc
  • 12.
    Tipos Tipo é umconjunto de valores: v é um valor de tipo T se v Є T. E é uma expressão de tipo T se E leva a um valor do tipo T. Um tipo é um conjunto de valores que exibe um comportamento uniforme sob operações associadas a este conjunto. Boolean {true, false}, Operações: and, or, not, etc {15, true, azul} é um tipo?
  • 13.
    Tipos: Cardinalidade A cardinalidadede um tipo T, escrito #T, e o número de valores do tipo T. ● #Boolean = 2
  • 14.
    Tipos: classificação Classificação detipos: ○ Primitivos ○ Compostos
  • 15.
    Tipos primitivos Valores primitivossão aqueles cujos valores são atômicos – não podem ser decompostos em valores mais simples. Tipo primitivo é onde os valores são primitivos. Toda linguagem de programação possui tipos primitivos, e algumas permitem definir novos.
  • 16.
    Tipos primitivos -exemplos Boolean = {false, true} Character = {…, ‘A’, …, ‘Z’, …, ‘0’, …, ‘9’, …} Integer = {…, –2, –1, 0, +1, +2, …} Float = {…, –1.0, …, 0.0, +1.0, …}
  • 17.
    Tipos primitivos -cardinalidade #Boolean = 2 #Character = 128 (ASCII), 256 (ISO-Latin), or 32768 (Unicode) #Integer = max integer – min integer + 1 Note: Em algumas linguagens (ex. C), booleans e characters são inteiros.
  • 18.
    Criando tipos primitivos EmAda é possível definir novos tipos . ●Declaração: type Population is range 0 .. 1000; ●Conjunto de valores: Population = {0, 1, …, 1000} ●Cardinalidade: #Population = 1001
  • 19.
    Criando tipos primitivos Emdiversas linguagens é possível definir tipos de dados enumeráveis. C: enum Cor { VERMELHA, PRETA }; Ada: type Color is (VERMELHA, PRETA ); Haskell data Color = Vermelha | Preta
  • 20.
    Tipos Compostos Um valorcomposto ou estruturado é quando o seu valor é composto a partir de valores mais simples. Tipo composto é um tipo cujos valores são compostos. Linguagens de programação (LP) suporta uma grande variedade deles.
  • 21.
  • 22.
  • 23.
    Produtos Cartesianos struct Point{ x,y: double; }; structures (C) type Point is record x: Double; y: Double; end record; Records (Ada) type Point = (Double,Double) tuplas (Haskell) class Point: x = 0;y =0; Class (Python)
  • 24.
    Produtos Cartesianos -ADA type Month is (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec); type Day_Number is range 1 .. 31; type Date is record m: Month; d: Day_Number; end record; someday: Date := (jan, 1); … put(someday.m+1); put("/"); put(someday.d); someday.d := 29; someday.m := feb;
  • 25.
    Produtos Cartesianos -Haskell someday= (jan, 1) (m,d) = someday anotherday = (m + 1, d) Valores: data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec type Date = (Month, Int) Date = Month X Integer = {Jan, Feb, …, Dec} X {…, –1, 0, 1, 2, …} Uso:Declarações:
  • 26.
    Produtos Cartesianos class Point{ public: Point (double x, double y); double x() { .. } double y() { .. } private: double x,y; };
  • 27.
  • 28.
    Uniões disjuntas union { intexact; float inexact; }; Union em C data Number = Exact Int Inexact Float Tipos algébricos em Haskell type Accuracy is (exact, inexact); type Number (acc: Accuracy := exact) is record case acc of when exact => ival: Integer; when inexact => rval: Float; end case; end record; Ada
  • 29.
    Unions e cartesianos typedefenum { int_t, float_t ,string_t} TYPE; union m_value { int int_value; float float_value; char* str_value; } ; struct symbol { const char* name; union m_value* val; TYPE t; };
  • 30.
  • 31.
  • 32.
    Array - Ada typeColor is (red, green, blue); type Pixel is array (Color) of Boolean; p: Pixel := (true, false, true); c: Color; … p(c) := not p(c);
  • 33.
    Array - Ada Pixel= Color -> Boolean = {red, green, blue} -> {false, true} viz: {red -> false, green -> false, blue -> false} {red -> false, green -> false, blue -> true} {red -> false, green -> true, blue -> false} {red -> false, green -> true, blue -> true} {red -> true, green -> false, blue -> false} {red -> true, green -> false, blue -> true} {red -> true, green -> true, blue -> false} {red -> true, green -> true, blue -> true} #Pixel = (#Boolean)#Color = 23 = 8
  • 34.
  • 35.
    Mapeamento - Função- Ada Definição: function is_even (n: Integer) return Boolean is begin return (n mod 2 = 0); end; Tipo: Integer -> Boolean Valores: {…, 0 -> true, 1 -> false, 2 -> true, 3 -> false, …}
  • 36.
    Mapeamento - Função- Haskell Definição: is_even n = (mod n 2 == 0) Tipo Integer -> Boolean Valores: {…, 0 -> true, 1 -> false, 2 -> true, 3 -> false, …}
  • 37.
  • 38.
    Números Naturais -Haskell data Nat = Zero | Succ Nat deriving (Show) soma :: Nat -> Nat -> Nat soma Zero n = n soma (Succ m) n = Succ (soma m n) mult :: Nat -> Nat -> Nat mult Zero m = Zero mult (Succ m) n = soma n (mult n m)
  • 39.
  • 40.
    Tipos Recursivos -Lista - Haskell data IntList = Nil | Cons Int IntList >Nil >Cons 2 (Cons 3 (Cons 5 (Cons 7 Nil))) [Int] [String] [[Int]] [] [2,3,5,7]["cat","dog"][[1],[2,3]]
  • 41.
    Strings ● Seqüência de0 ou mais caracteres. ● Não existe consenso sobre sua classificação. ● Strings são tipos primitivos ou compostos? ● Python, ML, Lua são tipos primitivos ● Em Haskell é uma lista de caracter ● Em C, vetor de caracter. ● Java trata strings como objetos da classe String.
  • 42.
  • 43.
  • 44.
    Linguagem estáticas -C int max (int a, int b) { if (a > b) return a; else return b } max (4, 5) max (3.5,3.1)
  • 45.
  • 46.
  • 47.
  • 48.
    Erro de tipos ●Éa aplicação de um operador a um operando de um tipo inapropriado ○Atribuir um int para uma função que espera um float nas primeiras versões de C ●Se todas as vinculações de variáveis a tipos forem estáticas na linguagem, a verificação de tipos pode ser feita toda em tempo de compilação ●Em linguagens dinâmicas (JavaScript, PHP) isso só pode ser feito em tempo de execução
  • 49.
  • 50.
  • 51.
    Tipagem forte ecoerção ● ○ ● ● // convertido implicitamente para inteiro int a = 10.5;
  • 52.
  • 53.
  • 54.
  • 55.