Scala - jazyk budoucnosti

Post on 06-Jul-2015

2,635 views 2 download

description

Talk about Scala I gave at WebExpo 2011 in Prague.

transcript

SCALA Scalable language

About.me/byF

About.me/byF

Basic → Pascal → JavaScript → C/C++ → PHP → Java → Scala

Scala je nechvalně proslulá jako složitý jazyk.

"Útes šílenství"

Scala jednoduše řeší složité problémy!

"If I were to pick a language to use today other than Java, it would be Scala." James Gosling

Scala a Java

téměř 100% kompatibilní

JVM ekosystém

Kdo používá Scalu?

Kdo používá Scalu?

@byFcz

Velmi, velmi základní syntaxe

val msg = "ScalaFTW!"

Scala má pokročilou type inference!

Velmi, velmi základní syntaxe

val msg: String = "ScalaFTW!"

Scala má semi-colon inference!

Velmi, velmi základní syntaxe

def msg = "ScalaFTW!"

Velmi, velmi základní syntaxe

def msg(): String = { return "ScalaFTW!"}

Scala má úspornou, flexibilní syntaxi!

Scala je čistě objektový jazyk

1 + 2

Scala je čistě objektový jazyk

(1).+(2)

Definice třídy v Javě

class Person {

private String name;

public Person(String name) {

this.setName(name);

}

public void getName() {

return this.name;

}

public String setName(String name) {

this.name = name;

}

}

Definice třídy ve Scale

class Person(var name: String)

Singleton v Javě

public class Singleton {

private static final Singleton instance = new Singleton();

private Singleton() { }

public static Singleton getInstance() {

return instance;

}

}

Singleton ve Scale

object Singleton

Scala je funkcionální jazyk

Kolekce funkcionálně

int[] x = {1,2,3,4,5,6}

ArrayList res = new ArrayList();

for (int v : x) {

if (v % 2 == 1)

res.add(new Integer(v));

}

Kolekce funkcionálně

val x = Array(1,2,3,4,5,6)

val res = x filter ( _ % 2 == 1 )

Kolekce funkcionálně

val (odds,evens) = x partition(_% 2 == 1)

Kolekce funkcionálně

val str = x mkString

Kolekce funkcionálně

val str = x mkString("Start: ",",","!")

Scala je HYBRID!

Case classes

case class Person(name: String,surname: String)

Pattern matching

selektor match {

vzor => výraz(y)

jinyVzor => výraz(y)

}

Switch v Javě

public boolean doSwitch(int n) {

switch(n) {

case 1: return true;

default: return false;

}

}

Alternativa switche ve Scale

def doSwitch(n:Integer) = n match {

case 1 => true

case _ => false

}

Case classes

case class Person(name: String,surname: String)

Pattern matching v akci

val audience = List[Person](...)

/* To jste VY! */

val enthusiasts = audience filter {

case _ => false

}

Pattern matching v akci

val enthusiasts = audience filter {

case Person("Karel","Smutný") => true

case _ => false

}

Pattern matching v akci

val enthusiasts = audience filter {

case Person("Karel","Smutný") => true

case Person("Jan",_) => true

case _ => false

}

Pattern matching v akci

val enthusiasts = audience filter {

case Person("Karel","Smutný") => true

case Person("Jan",_) => true

case Person("Tomas",sur) =>

println(sur)

true

case _ => false

}

Pattern matching v akci

val enthusiasts = audience filter {

case Person("Karel","Smutný") => true

case Person("Jan",_) => true

case Person("Tomas",sur) =>

println(sur)

true

case Person(name,sur) => true

case _ => false

}

Podpora XML

val elem = <xml></xml>

Podpora XML

val elem = <xml>{foo}</xml>

Podpora XML

<xml>scala</xml>.text

Podpora XML

<a><b>hello</b></a> \ "b"

Více jader, ...

... 80 jader!

Kolekce paralelně

val kolekce = for {

s <- surnames //mujan

n <- names //jan

if s endsWith n

} yield n + " " + s

Kolekce paralelně

val kolekce = for {

s <- surnames.par

n <- names.par

if s endsWith n

} yield n + " " + s

Paralelní programování „klasicky“

Sdílení dat & zámky

Paralelní programování „klasicky“

Deadlocks & race conditions

Actor model

„Make send, not share.“

Actor model

class Announcer extends Actor {

def receive = {

case s: String => println(s)

case _ => println("Ignored!")

}

}

Actor model

val zf = Actor.actorOf[Announcer].start()

zf ! "Super" //Actor vypíše Super

zf ! 5 //Actor ignoruje zprávu

val a = Actor.actorOf[Announcer].start()

val b = Actor.actorOf[Announcer].start()

val c = Actor.actorOf[Announcer].start()

Actor model

Fault tolerance → Self-Healing

Teď trochu distribuovaně…

RMI, Corba, EJB, SOAP, XML-RPC, Thrift

Teď trochu distribuovaně…

„It‘s time for RPC to retire!“

Steve Vinoski

Akka 2.0

Úplně všichni aktoři jsou distribuovaní!

Akka 2.0

Naprogramovali jste actor-based aplikaci.

Akka 2.0

Přidáte další stroj a zapnete v konfiguraci cluster.

Scala je elegantní jazyk se stručnou syntaxí, který umožňuje jednoduše

řešit složité problémy.

Literatura

• Programming in Scala, Second Edition http://www.artima.com/shop/programming_in_scala_2ed

• Dokumentace na webu Scaly http://www.scala-lang.org/node/197

Czech Scala Enthusiasts http://www.meetup.com/czech-scala-enthusiasts/