scala: linguagem promissora e funcional

61
Scala Linguagem Promissora e Funcional Michael Schuenck dos Santos @michaelss TRE-TO quinta-feira, 25 de abril de 13

Upload: michael-schuenck-dos-santos

Post on 19-Jun-2015

434 views

Category:

Technology


4 download

DESCRIPTION

Apresentação no FORTES 2013 (Fórum de Tecnologias e Engenharia de Software). Aborda a motivação do porquê estudar Scala, quais os benefícios da programação funcional e recursos de Scala.

TRANSCRIPT

Page 1: Scala: Linguagem Promissora e Funcional

ScalaLinguagem Promissora e Funcional

Michael Schuenck dos Santos@michaelss

TRE-TO

quinta-feira, 25 de abril de 13

Page 2: Scala: Linguagem Promissora e Funcional

Eu

• Bacharel em Sistemas de Informação pelo CEULP/ULBRA e ex-professor

• Mestre em Sistemas e Computação pela UFRN e ex-professor

• Analista de Sistemas no TRE-TO

quinta-feira, 25 de abril de 13

Page 3: Scala: Linguagem Promissora e Funcional

“Iluminar sua mente???”

quinta-feira, 25 de abril de 13

Page 4: Scala: Linguagem Promissora e Funcional

Java x .NET

quinta-feira, 25 de abril de 13

Page 5: Scala: Linguagem Promissora e Funcional

Por que o interesse em Scala?

quinta-feira, 25 de abril de 13

Page 6: Scala: Linguagem Promissora e Funcional

Twitter

Por que o interesse em Scala?

quinta-feira, 25 de abril de 13

Page 7: Scala: Linguagem Promissora e Funcional

A Infra e a JVM

Por que o interesse em Scala?

quinta-feira, 25 de abril de 13

Page 8: Scala: Linguagem Promissora e Funcional

Paradigma Funcional

Por que o interesse em Scala?

quinta-feira, 25 de abril de 13

Page 9: Scala: Linguagem Promissora e Funcional

Interesse por LP’s

Por que o interesse em Scala?

quinta-feira, 25 de abril de 13

Page 10: Scala: Linguagem Promissora e Funcional

quinta-feira, 25 de abril de 13

Page 11: Scala: Linguagem Promissora e Funcional

História

2001 2003 2004

Início do projeto de

Scala

Redesign: versão 2.0

Primeiro release

público, para a JVM

2006

Liberada para .NET

2011

Martin Odersky funda a Typesafe, que logo

recebe um investimento de US$ 3 milhões

Martin OderskyProf. na Univ. de Lausanne(Suíça)

Criador de Generics e do compilador Java

quinta-feira, 25 de abril de 13

Page 12: Scala: Linguagem Promissora e Funcional

PerformanceO Google fez um benchmark entre

C++, Java, Scala e Go

Uso de memóriaquinta-feira, 25 de abril de 13

Page 13: Scala: Linguagem Promissora e Funcional

Performance

Tempoquinta-feira, 25 de abril de 13

Page 14: Scala: Linguagem Promissora e Funcional

Performance

Linhas de códigoquinta-feira, 25 de abril de 13

Page 15: Scala: Linguagem Promissora e Funcional

Quem está usando

quinta-feira, 25 de abril de 13

Page 16: Scala: Linguagem Promissora e Funcional

Características

quinta-feira, 25 de abril de 13

Page 17: Scala: Linguagem Promissora e Funcional

Uso de {chaves}

Características

Muitas vezes dispensáveis

quinta-feira, 25 de abril de 13

Page 18: Scala: Linguagem Promissora e Funcional

Uso de {chaves}

Características

; só com mais de uma expressão por linha

quinta-feira, 25 de abril de 13

Page 19: Scala: Linguagem Promissora e Funcional

ConcisãoCaracterísticas

quinta-feira, 25 de abril de 13

Page 20: Scala: Linguagem Promissora e Funcional

Alto NívelCaracterísticas

quinta-feira, 25 de abril de 13

Page 21: Scala: Linguagem Promissora e Funcional

Características

Tipagem Estática

quinta-feira, 25 de abril de 13

Page 22: Scala: Linguagem Promissora e Funcional

Características

Tipagem Estática

• Erros em tempo de compilação

quinta-feira, 25 de abril de 13

Page 23: Scala: Linguagem Promissora e Funcional

Características

Tipagem Estática

• Erros em tempo de compilação

• Refatorações seguras

quinta-feira, 25 de abril de 13

Page 24: Scala: Linguagem Promissora e Funcional

Características

Tipagem Estática

• Erros em tempo de compilação

• Refatorações seguras

• Scala: inferência de tipos

quinta-feira, 25 de abril de 13

Page 25: Scala: Linguagem Promissora e Funcional

Documentação, Clareza e Previsibilidade

var a = “Palmas”if (b == 0) a = 10println(a * 2) ?

Características

quinta-feira, 25 de abril de 13

Page 26: Scala: Linguagem Promissora e Funcional

Tipagem

C#C++

Estática Dinâmica

JS

Características

quinta-feira, 25 de abril de 13

Page 27: Scala: Linguagem Promissora e Funcional

Características

OO

Funcional

quinta-feira, 25 de abril de 13

Page 28: Scala: Linguagem Promissora e Funcional

Paradigma

OO Funcional

C# Haskell Scheme

LispSmalltalk F#

quinta-feira, 25 de abril de 13

Page 29: Scala: Linguagem Promissora e Funcional

OO(Scala) > OO(Java)

quinta-feira, 25 de abril de 13

Page 30: Scala: Linguagem Promissora e Funcional

Não se utiliza os tipos primitivos

OO(Scala) > OO(Java)

intdouble

floatboolean

byteshort

IntDoubleFloat

BooleanByteShort

quinta-feira, 25 de abril de 13

Page 31: Scala: Linguagem Promissora e Funcional

Operadores unários e binários são métodos

OO(Scala) > OO(Java)

1 + 2==

1.+(2)quinta-feira, 25 de abril de 13

Page 32: Scala: Linguagem Promissora e Funcional

EstruturaRetorno:

obrigatório em funções recursivas

Dispensável se retorno Unit

Parâmetros

return desnecessário

Argumento padrão

obrigatórias p/ mais de uma linha

quinta-feira, 25 de abril de 13

Page 33: Scala: Linguagem Promissora e Funcional

Paradigma Funcionalquinta-feira, 25 de abril de 13

Page 34: Scala: Linguagem Promissora e Funcional

Interesse crescente:Resolver o problema

de multicores

Paradigma Funcional

quinta-feira, 25 de abril de 13

Page 35: Scala: Linguagem Promissora e Funcional

OO Funcional

Composição de objetos

Composição de funções

Alteração de estado

Ausência de efeitos colaterais

Algoritmos iterativos

Algoritmos recursivos

Paradigma Funcional

quinta-feira, 25 de abril de 13

Page 36: Scala: Linguagem Promissora e Funcional

Imutabilidade

val x = “Olá”x = “Oi” // Erro

var y = “Olá”y = “Oi” // Ok

Paradigma Funcional

quinta-feira, 25 de abril de 13

Page 37: Scala: Linguagem Promissora e Funcional

Funções de Ordem Superior

Podem ser passadas e retornadas

def op(x: Int, y: Int, f: (Int, Int) => Int): Int = f(x, y)

Paradigma Funcional

quinta-feira, 25 de abril de 13

Page 38: Scala: Linguagem Promissora e Funcional

Funções de Ordem Superior

Podem ser passadas e retornadas

def op(x: Int, y: Int, f: (Int, Int) => Int): Int = f(x, y)

def soma(a: Int, b: Int) = a + bop(1, 2, soma)

Paradigma Funcional

quinta-feira, 25 de abril de 13

Page 39: Scala: Linguagem Promissora e Funcional

Funções Anônimas

def op(x: Int, y: Int, f: (Int, Int) => Int): Int = f(x, y)

op(1, 2, (a: Int, b: Int) => a + b)

Paradigma Funcional

quinta-feira, 25 de abril de 13

Page 40: Scala: Linguagem Promissora e Funcional

Funções Anônimas

def op(x: Int, y: Int, f: (Int, Int) => Int): Int = f(x, y)

op(1, 2, (a: Int, b: Int) => a + b)

Paradigma Funcional

quinta-feira, 25 de abril de 13

Page 41: Scala: Linguagem Promissora e Funcional

Currying

def mul(x: Int) = (y: Int) => x * y

Paradigma Funcional

quinta-feira, 25 de abril de 13

Page 42: Scala: Linguagem Promissora e Funcional

Currying

def mul(x: Int) = (y: Int) => x * ymul(6)(7)

Paradigma Funcional

quinta-feira, 25 de abril de 13

Page 43: Scala: Linguagem Promissora e Funcional

Currying

def mul(x: Int) = (y: Int) => x * ymul(6)(7) (y: Int) => 6 * y

Paradigma Funcional

quinta-feira, 25 de abril de 13

Page 44: Scala: Linguagem Promissora e Funcional

Recursos de Scalaquinta-feira, 25 de abril de 13

Page 45: Scala: Linguagem Promissora e Funcional

for

for (i <- 1 to 10) println(i)

for (i <- 1 to 9; j <- 1 to 9) println(i)

for (i <- 1 to 9 if i != 5) println(i)

val x = for (i <- 1 to 9) yield i * i//(1, 4, 9, 16, 25, 36, ..., 81)

Recursos de Scala

quinta-feira, 25 de abril de 13

Page 46: Scala: Linguagem Promissora e Funcional

O método apply

• Uma espécie de método padrão

“Michael”(1) // “i”

Classe String tem o método:

def apply(n: Int): Char

Recursos de Scala

quinta-feira, 25 de abril de 13

Page 47: Scala: Linguagem Promissora e Funcional

Pré-condições

class Racional(x: Int, y: Int) { require(y > 0, “Denominador deve ser positivo”) ...}

Recursos de Scala

quinta-feira, 25 de abril de 13

Page 48: Scala: Linguagem Promissora e Funcional

Traitstrait Plural { def pluralizar(x: String) = x + “s”}

trait Dupla { def duplicar(x: String) = x + x}

class MyString(x: String) extends Plural with Dupla { }

Recursos de Scala

quinta-feira, 25 de abril de 13

Page 49: Scala: Linguagem Promissora e Funcional

Pattern Matching

var sinal = ...val ch: Char = ...

ch match { case ‘+’ => sinal = 1 case ‘-’ => sinal = -1 case _ => sinal = 0}

Recursos de Scala

quinta-feira, 25 de abril de 13

Page 50: Scala: Linguagem Promissora e Funcional

Pattern Matching (2)

var sinal = ...val ch: Char = ...

sinal = ch match { case ‘+’ => 1 case ‘-’ => -1 case _ => 0}

Recursos de Scala

quinta-feira, 25 de abril de 13

Page 51: Scala: Linguagem Promissora e Funcional

Pattern Matching (3)

def getInt(obj: Any) = obj match { case x: Int => x case s: String => Integer.parseInt(s) case _: BigInt => Int.MaxValue case _=> 0}

Recursos de Scala

quinta-feira, 25 de abril de 13

Page 52: Scala: Linguagem Promissora e Funcional

AtoresRecursos de Scala

≅quinta-feira, 25 de abril de 13

Page 53: Scala: Linguagem Promissora e Funcional

Otimização de Tail-Recursion

Tail-recursion: não é necessário computar o resultado de chamadas recursivas

Recursos de Scala

quinta-feira, 25 de abril de 13

Page 54: Scala: Linguagem Promissora e Funcional

REPL: Read-Evaluate-Print Loop

quinta-feira, 25 de abril de 13

Page 55: Scala: Linguagem Promissora e Funcional

Frameworks

quinta-feira, 25 de abril de 13

Page 56: Scala: Linguagem Promissora e Funcional

Adoção

quinta-feira, 25 de abril de 13

Page 57: Scala: Linguagem Promissora e Funcional

Nivelamento da Equipe

Adoção

quinta-feira, 25 de abril de 13

Page 58: Scala: Linguagem Promissora e Funcional

• Curva de aprendizado

• Código Java-like no início

• Uso das demais funcionalidades de Scala depois

Adoção

quinta-feira, 25 de abril de 13

Page 59: Scala: Linguagem Promissora e Funcional

• Comunidade pequena, mas crescente

• Acessível

• Scala Days scaladays.org

Adoção

quinta-feira, 25 de abril de 13

Page 61: Scala: Linguagem Promissora e Funcional

ScalaLinguagem Promissora e Funcional

Michael Schuenck dos Santos@michaelss

TRE-TO

if (abertoPerguntas()) publico.perguntar()

quinta-feira, 25 de abril de 13