kunskapsbaren 2011 stockholm - scala och andra nya språk i jvm:en
DESCRIPTION
Manne Fagerlinds slides från Kunskapsbaren 2011 i Stockholm. Ämnet var "Scala och andra språk i JVM:en".TRANSCRIPT
STOCKHOLM14 APRIL, 2011
VAD KAN MAN GÖRA MED SCALA SOM MAN INTE
KAN GÖRA MED JAVA?
VAD KAN MAN GÖRA MED JAVA SOM MAN INTE
KAN GÖRA MED ASSEMBLER?
VAD ÄR LÄTTARE ATT GÖRA MED SCALA ÄN
MED JAVA?
En vettigare fråga…
Minns ni 1997?6
Andra problem 1997…7
För svårt att programmera
För många plattformar
För farligt att köra kod i
webbläsaren
Lösningen då:8
Vilka problem har vi idag?9
För dålig produktivitet
För svårt att underhålla kod
Krav på parallellisering
Några kandidater…10
11
Exempel på Clojure-kod
(def fib-seq
(concat
[0 1]
((fn rfib [a b]
(lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))
En ska bort...12
13
Saker att beakta
• Verktygsstöd
• Antal användare
• ”Momentum”
Och en till...14
15
En typisk Java-klass
public class Customer {
private String firstName;
private String lastName;
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getLastName() {
Return lastName;
}
/.../
}
16
Motsvarande Ruby-klass
class Customer
attr_accessor :firstName, :lastName
end
17
”Statisk typning ger brus”
final HashMap<String, String> capitals =
new HashMap<String,String>();
capitals.put(”Japan”, ”Tokyo”);
capitals.put(”Sweden”, ”Stockholm”);
capitals.put(”UK”, ”London”);
18
Dynamisk typning
Variabler och fält har ingen typ
Exempel (Ruby):
product_number = ”VG-1296H”
product_number = 14
@parent = File.new(”C:\\”)
@parent = Dad.new(”Homer”, ”Simpson”)
19
Dynamiska språk - metaprogrammering
Exempel från Ruby on Rails:
class Customer < ActiveRecord::Base
end
new_one = Customer.new
new_one.first_name = ”Homer”
new_one.last_name = ”Simpson”
20
Öppna klasser
Också från Ruby on Rails:
due_date = 5.days_from_now
Hur är detta möjligt!?
class Fixnum
def days_from_now
/.../
end
end
21
”Ett nytt språk säger du...?”
22
#:: ::-| ::-| .-. :||-:: 0-| .-| ::||-| .:|-. :||
open(Q,$0);while(<Q>){if(/^#(.*)$/){for(split('-',$1)){$q=0;for(split){s/\|
/:.:/xg;s/:/../g;$Q=$_?length:$_;$q+=$q?$Q:$Q*20;}print chr($q);}}}print"\n";
#.: ::||-| .||-| :|||-| ::||-| ||-:: :|||-| .:|
”Kan du bara lägga till en feature i den här koden...”
23
Håller det i längden?
class Customer < ActiveRecord::Base
end
new_one = Customer.new
new_one. ?
24
Groovy + Grails
class Customer {
String firstName
String lastName
Integer age
}
newOne = new Customer();
25
Skillnader mot Ruby on Rails
Groovy är mycket mer likt Java
Grails är mer explicit
Groovy kan vara statiskt typat
Grails har betydligt bättre prestanda
26
Statisk
typning
27
Fördelar med statisk typning
• Fel fångas i kompilatorn, inte i produktion...
• Lättare att orientera sig i okänd kod
• Lättare att bygga utvecklingsverktyg
• Bättre prestanda
Scalable language
29
Smärtfri integration med Java
val formatter = new java.text.SimpleDateFormat()
val thisIsAJavaString = ”You know all my methods!”
30
Scala - ”type inference”
val productNumber = ”VG-1296H”
// följande rad ger fel!
productNumber = 14
val capitals = List(”Stockholm”, ”London”, ”Oslo”)
// Jfr Java:
// final List<String> countries =
// Arrays.asList(”Japan”, ”Sweden”, ”UK”);
31
Men...
Är Scala så svårt egentligen?
32
Exhibit 1
class Customer(var firstName: String, var lastName:
String, val birthDate: Date) {
override def toString() = firstName + ” ” + lastName
}
33
Exhibit 1 – i Java
public class Customer {
private String firstName;
private String lastName:
private final Date birthDate;
public Customer(String firstName, String lastName,
Date birthDate) {
/.../
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
FORTSÄTTNING FÖLJER...
34
Exhibit 1 – i Java (del 2)
public String getFirstName() {
return firstName;
}
public Date getBirthDate() {
return birthDate;
}
public String toString() {
Return firstName + ” ” + lastName;
}
/* getter och setter för lastName får inte plats */
}
35
Exhibit 2
val books = List(”Coq Rouge”, ”Ulysses”, ”Papillon”,
”Pippi Långstrump”)
books.foreach(println)
val booksStartingWithP = books.filter(_.startsWith(”P”))
36
Exhibit 2 – i Java
List<String> books = Arrays.asList(”Coq
Rouge”, ”Ulysses”, ”Papillon”, ”Pippi Långstrump”)
for (String book : books) {
System.out.println(book);
}
List<String> booksStartingWithP = new
ArrayList<String>();
for (String book : books) {
if (book.startsWith(”P”)) {
booksStartingWithP.add(book);
}
}
37
Exhibit 3
case class Rational(numer: Int, denomin: Int) {
def *(that: Rational) = Rational(numer * that.numer,
denomin * that.denomin)
override def toString = nomin + "/" + denomin
}
println(Rational(5, 3) * Rational(7, 9))
Scala är objektorienterat
och
funktionellt
Scala – en hybrid
39
Varför är detta bra?
delat data
Funktioner förändrar inte tillstånd
Därför säkert att parallellisera dem
40
Funktioner är värden
var stringMatches = (s: String) => s.startsWith(”P”)
if (stringMatches(”Palle”)) println(”matches”)
books.filter(stringMatches)
// anonym funktion
books.filter(_.startsWith(”P”))
val är det vanliga – var undantag
Funktionell stil uppmuntras
List, Set och Map normalt oföränderliga
Nästan allting returnerar ett värde!
42
(Nästan) allting returnerar ett värde
val descriptionOfRational =
rational match {
case Rational(x, 1) => x.toString
case Rational(1, 2) => "one half"
case _ => rational.toString
}
println(if (age < 18) ”child” else ”adult”)
43
Stolen with pride...
Actors – tämligen objektorienterat
API för parallella system
Skamlös stöld från Erlang
Bygger på meddelanden mellan virtuella processer
Scalable language
TACK!