Scala: Programação OO, Funcional e Concorrente na JVM
-
Upload
andrei-formiga -
Category
Technology
-
view
2.128 -
download
8
Transcript of Scala: Programação OO, Funcional e Concorrente na JVM
![Page 1: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/1.jpg)
Scala: Programação OO, Funcional e Concorrentena JVM
Andrei de Araújo Formiga
Universidade Federal da Paraíba
@andreiformiga
![Page 2: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/2.jpg)
Scala?
![Page 3: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/3.jpg)
Scala?
![Page 4: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/4.jpg)
Scala?
![Page 5: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/5.jpg)
Scala
![Page 6: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/6.jpg)
O Que Veremos
• A Linguagem Scala
• OO e Funcional: Paralelos e Diferenças
• Programação Concorrente com Atores
![Page 7: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/7.jpg)
Sobre Você
• Familiaridade com Orientação a Objetos
• Sabe Java (de preferência)
• Não necessariamente sabe prog. funcional
![Page 8: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/8.jpg)
Scala
• Scalable Abstractions
• Martin Odersky, 2001
• Versão atual: 2.9 (maio)
• École Polytechnique Féderale de Lausanne
• Typesafe, Inc.
![Page 9: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/9.jpg)
Histórico
• Pizza, Generic Java (1998)
• Java Generics (Java 5, 2004)
• Scala (2001)
![Page 10: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/10.jpg)
OO + Funcional
• Classes, herança, encapsulamento (Java)
• Funções de 1a classe, Closures
• Pattern matching, objetos imutáveis
• Tipos paramétricos (generics)
![Page 11: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/11.jpg)
Paradigmas
• Paradigmas mudam como resposta a
momentos de crise
• OO: “Crise do Software” da década de 70
• Atualmente: “crise da concorrência”
![Page 12: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/12.jpg)
A Crise do Software
• Década de 1970
• Grandes Avanços na Eng. de Hardware
• Por que não em Software?
![Page 13: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/13.jpg)
OO como Solução
• Simula, Smalltalk, C++
• Reuso!
• Componentes de Software!
• Problema resolvido?
![Page 14: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/14.jpg)
Atualmente
![Page 15: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/15.jpg)
Crise da Concorrência
• Processadores com mais núcleos
• É preciso aproveitar a capacidade
• Concorrência + mem. compartilhada = locks
![Page 16: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/16.jpg)
Programação Funcional
• Início: Lisp (1959)
• Décadas de pesquisa em linguagens
• Estruturas imutáveis
• Vantagens: Concorrência, DSLs
![Page 17: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/17.jpg)
Paralelos
FunçãoDados
![Page 18: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/18.jpg)
Por que Scala?
• Java melhor que Java
• Expressividade + Eficiência
• JVM, bibliotecas Java
![Page 19: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/19.jpg)
Por que Scala?
// Java
boolean nameHasUpperCase = false;
for (int i=0; i < name.length(); ++i) {
if (Character.isUpperCase(name.charAt(i)))
{
nameHasUpperCase = true;
break;
}
}
// Scala
val nameHasUpperCase = name.exists(_.isUpper)
![Page 20: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/20.jpg)
Por que Scala?
![Page 21: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/21.jpg)
Hello, World!
object Hello {
def main(args: Array[String]) {
println("Hello, world!")
}
}
objeto singleton
retorno Unit (implícito)
![Page 22: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/22.jpg)
Classes, Métodosabstract class Shape {
protected var x: Int = 0
protected var y: Int = 0
def draw(): Unit
}
class Circle extends Shape {
private var r: Int = 0
override def draw() {
// desenha circulo
}
}
![Page 23: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/23.jpg)
Construtores
abstract class Shape(x:Int, y:Int) {
def draw(): Unit
}
class Circle(x:Int, y:Int, r:Int)
extends Shape(x,y)
{
override def draw() {
// desenha circulo
}
}
![Page 24: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/24.jpg)
Inferência de Tipos
class Tipos {
private var i = 0
private var c = 'X'
private var s = "Hello, world!"
private var f = 3.1415926535
private var b = true
}
![Page 25: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/25.jpg)
Atalhos Sintáticos
• Chamada com 1 parâmetro pode omitir ()
• O ponto entre objeto e método é opcional
conta.deposito 1000
conta deposito 1000
![Page 26: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/26.jpg)
Operadores
• Operadores são métodos
• É possível definir operadores arbitrários
2 + 3 = 2.+(3)
var v1 = new Vector2d(1.2, 4.5)
var v2 = new Vector2d(1.3, 2.7)
var v3 = v1 + v2
![Page 27: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/27.jpg)
Variáveis que Não Variam
• Ênfase em objetos imutáveis
class Ponto {
private val x = 0
private val y = 0
def trans(dx: Int, dy: Int) = …
}
![Page 28: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/28.jpg)
Atualizações Não-Destrutivas
class Ponto(x: Int, y: Int) {
def trans(dx: Int, dy: Int) =
new Ponto(x+dx, y+dy)
}
class Ponto(x: Int, y: Int) {
def trans(dx: Int, dy: Int) = {
val nx = x+dx
val ny = y+dy
new Ponto(nx, ny)
}
![Page 29: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/29.jpg)
Funções e Closures
• Funções de 1a Classe
• Closures
(x: Int) => x + 1
def criaSomador(s: Int) =
(x) => x + s
![Page 30: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/30.jpg)
Coleções
• Tuplas
• Listas, Arrays, mapas, conjuntos, etc
• Mutáveis e imutáveis
(2, “Hello, world!”)
![Page 31: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/31.jpg)
Listas e Pattern Matchingobject Tamanho {
def tam(l: List[Int]): Int =
l match {
case Nil => 0
case x :: rl => 1 + tam(rl)
}
def main(args: Array[String]) {
val l1 = List(1, 2, 3, 4)
println(tam(l1))
}
}
![Page 32: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/32.jpg)
Case Classes
• Classes “simples”
• Úteis para guardar dados
• Podem ser usadas com pattern matching
![Page 33: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/33.jpg)
Case Classes
abstract class Ponto
case class Ponto2d(x: Int, y: Int)
extends Ponto
case class Ponto3d(x: Int, y: Int, z: Int)
extends Ponto
def processa(p: Ponto) =
p match {
case Ponto2d(x, y) => // usa x e y
case Ponto3d(x, y, z) => // usa x, y e z
}
![Page 34: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/34.jpg)
Modelo de Atores
• Carl Hewitt et al. (MIT, 1973)
• Atores isolados que trocam mensagens
• Erlang
![Page 35: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/35.jpg)
Atores em Scala
• scala.actor
– Biblioteca padrão
– Distribuída com a linguagem
– Razoavelmente madura
– Manutenção lenta
![Page 36: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/36.jpg)
Atores em Scala
• Akka
– Biblioteca geral para concorrência
– Madura e estável
– Aplicações comerciais
– Bem mantida
– Atores remotos
![Page 37: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/37.jpg)
Exemplo em Akka
![Page 38: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/38.jpg)
Para Saber Mais
• www.scala-lang.org
• www.typesafe.com
• Programming in Scala, 2nd Edition
– Martin Odersky, Lex Spoon & Bill Venners
![Page 39: Scala: Programação OO, Funcional e Concorrente na JVM](https://reader030.fdocument.pub/reader030/viewer/2022020116/55a05a6b1a28abf4678b46ab/html5/thumbnails/39.jpg)
Obrigado!