SlideShare uma empresa Scribd logo
1 de 45
STOCKHOLM
  14 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?
En vettigare fråga…


VAD ÄR LÄTTARE ATT GÖRA MED SCALA ÄN
MED JAVA?
6

Minns ni 1997?
7

Andra problem 1997…

För svårt att programmera


    För många plattformar


För farligt att köra kod i
webbläsaren
8

Lösningen då:
9

Vilka problem har vi idag?

För dålig produktivitet


     För svårt att underhålla kod


Krav på parallellisering
10

Några kandidater…
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)))
12

En ska bort...
13


 Saker att beakta


• Verktygsstöd
• Antal användare
• ”Momentum”
14

Och en till...
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


”Kan du bara lägga till en feature i den här koden...”


      #:: ::-| ::-| .-. :||-:: 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";
      #.: ::||-| .||-| :|||-| ::||-| ||-:: :|||-| .:|
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


Groovy kan vara statiskt typat


Grails är mer explicit


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 – en hybrid


Scala är objektorienterat
och
funktionellt
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”))
Funktionell stil uppmuntras



val är det vanliga – var undantag


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!

Mais conteúdo relacionado

Mais de HiQInternational

Kunskapsbaren 2011 Linköping - Bättre affärsmässighet i IT-arbeten
Kunskapsbaren 2011 Linköping - Bättre affärsmässighet i IT-arbetenKunskapsbaren 2011 Linköping - Bättre affärsmässighet i IT-arbeten
Kunskapsbaren 2011 Linköping - Bättre affärsmässighet i IT-arbetenHiQInternational
 
Kunskapsbaren 2011 Linköping - Att produktifiera mjukvara
Kunskapsbaren 2011 Linköping - Att produktifiera mjukvaraKunskapsbaren 2011 Linköping - Att produktifiera mjukvara
Kunskapsbaren 2011 Linköping - Att produktifiera mjukvaraHiQInternational
 
Kunskapsbaren 2011 Linköping - Koda om eller koda nytt?
Kunskapsbaren 2011 Linköping - Koda om eller koda nytt?Kunskapsbaren 2011 Linköping - Koda om eller koda nytt?
Kunskapsbaren 2011 Linköping - Koda om eller koda nytt?HiQInternational
 
Kunskapsbaren 2011 Linköping - Trender inom fordonsindustrin
Kunskapsbaren 2011 Linköping - Trender inom fordonsindustrinKunskapsbaren 2011 Linköping - Trender inom fordonsindustrin
Kunskapsbaren 2011 Linköping - Trender inom fordonsindustrinHiQInternational
 
Kunskapsbaren 2011 Linköping - Mobila trender & strategier
Kunskapsbaren 2011 Linköping - Mobila trender & strategierKunskapsbaren 2011 Linköping - Mobila trender & strategier
Kunskapsbaren 2011 Linköping - Mobila trender & strategierHiQInternational
 
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelse
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelseKunskapsbaren 2011 Stockholm - Attraktiv användarupplevelse
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelseHiQInternational
 
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelse
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelseKunskapsbaren 2011 Stockholm - Attraktiv användarupplevelse
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelseHiQInternational
 
Kunskapsbaren 2011 Stockholm - Bättre affärsmässighet i IT-arbeten
Kunskapsbaren 2011 Stockholm - Bättre affärsmässighet i IT-arbetenKunskapsbaren 2011 Stockholm - Bättre affärsmässighet i IT-arbeten
Kunskapsbaren 2011 Stockholm - Bättre affärsmässighet i IT-arbetenHiQInternational
 
Kunskapsbaren 2011 Stockholm - Flow i utvecklingsarbetet
Kunskapsbaren 2011 Stockholm - Flow i utvecklingsarbetetKunskapsbaren 2011 Stockholm - Flow i utvecklingsarbetet
Kunskapsbaren 2011 Stockholm - Flow i utvecklingsarbetetHiQInternational
 
Kunskapsbaren 2011 Stockholm - Agila avtal
Kunskapsbaren 2011 Stockholm - Agila avtalKunskapsbaren 2011 Stockholm - Agila avtal
Kunskapsbaren 2011 Stockholm - Agila avtalHiQInternational
 
Kunskapsbaren 2011 Stockholm - Finans, IT & HiQ
Kunskapsbaren 2011 Stockholm - Finans, IT & HiQKunskapsbaren 2011 Stockholm - Finans, IT & HiQ
Kunskapsbaren 2011 Stockholm - Finans, IT & HiQHiQInternational
 
Kunskapsbaren 2011 Stockholm - Mobila trender & strategier
Kunskapsbaren 2011 Stockholm - Mobila trender & strategierKunskapsbaren 2011 Stockholm - Mobila trender & strategier
Kunskapsbaren 2011 Stockholm - Mobila trender & strategierHiQInternational
 

Mais de HiQInternational (12)

Kunskapsbaren 2011 Linköping - Bättre affärsmässighet i IT-arbeten
Kunskapsbaren 2011 Linköping - Bättre affärsmässighet i IT-arbetenKunskapsbaren 2011 Linköping - Bättre affärsmässighet i IT-arbeten
Kunskapsbaren 2011 Linköping - Bättre affärsmässighet i IT-arbeten
 
Kunskapsbaren 2011 Linköping - Att produktifiera mjukvara
Kunskapsbaren 2011 Linköping - Att produktifiera mjukvaraKunskapsbaren 2011 Linköping - Att produktifiera mjukvara
Kunskapsbaren 2011 Linköping - Att produktifiera mjukvara
 
Kunskapsbaren 2011 Linköping - Koda om eller koda nytt?
Kunskapsbaren 2011 Linköping - Koda om eller koda nytt?Kunskapsbaren 2011 Linköping - Koda om eller koda nytt?
Kunskapsbaren 2011 Linköping - Koda om eller koda nytt?
 
Kunskapsbaren 2011 Linköping - Trender inom fordonsindustrin
Kunskapsbaren 2011 Linköping - Trender inom fordonsindustrinKunskapsbaren 2011 Linköping - Trender inom fordonsindustrin
Kunskapsbaren 2011 Linköping - Trender inom fordonsindustrin
 
Kunskapsbaren 2011 Linköping - Mobila trender & strategier
Kunskapsbaren 2011 Linköping - Mobila trender & strategierKunskapsbaren 2011 Linköping - Mobila trender & strategier
Kunskapsbaren 2011 Linköping - Mobila trender & strategier
 
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelse
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelseKunskapsbaren 2011 Stockholm - Attraktiv användarupplevelse
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelse
 
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelse
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelseKunskapsbaren 2011 Stockholm - Attraktiv användarupplevelse
Kunskapsbaren 2011 Stockholm - Attraktiv användarupplevelse
 
Kunskapsbaren 2011 Stockholm - Bättre affärsmässighet i IT-arbeten
Kunskapsbaren 2011 Stockholm - Bättre affärsmässighet i IT-arbetenKunskapsbaren 2011 Stockholm - Bättre affärsmässighet i IT-arbeten
Kunskapsbaren 2011 Stockholm - Bättre affärsmässighet i IT-arbeten
 
Kunskapsbaren 2011 Stockholm - Flow i utvecklingsarbetet
Kunskapsbaren 2011 Stockholm - Flow i utvecklingsarbetetKunskapsbaren 2011 Stockholm - Flow i utvecklingsarbetet
Kunskapsbaren 2011 Stockholm - Flow i utvecklingsarbetet
 
Kunskapsbaren 2011 Stockholm - Agila avtal
Kunskapsbaren 2011 Stockholm - Agila avtalKunskapsbaren 2011 Stockholm - Agila avtal
Kunskapsbaren 2011 Stockholm - Agila avtal
 
Kunskapsbaren 2011 Stockholm - Finans, IT & HiQ
Kunskapsbaren 2011 Stockholm - Finans, IT & HiQKunskapsbaren 2011 Stockholm - Finans, IT & HiQ
Kunskapsbaren 2011 Stockholm - Finans, IT & HiQ
 
Kunskapsbaren 2011 Stockholm - Mobila trender & strategier
Kunskapsbaren 2011 Stockholm - Mobila trender & strategierKunskapsbaren 2011 Stockholm - Mobila trender & strategier
Kunskapsbaren 2011 Stockholm - Mobila trender & strategier
 

Kunskapsbaren 2011 Stockholm - Scala och andra nya språk i JVM:en

  • 1. STOCKHOLM 14 APRIL, 2011
  • 2.
  • 3. VAD KAN MAN GÖRA MED SCALA SOM MAN INTE KAN GÖRA MED JAVA?
  • 4. VAD KAN MAN GÖRA MED JAVA SOM MAN INTE KAN GÖRA MED ASSEMBLER?
  • 5. En vettigare fråga… VAD ÄR LÄTTARE ATT GÖRA MED SCALA ÄN MED JAVA?
  • 7. 7 Andra problem 1997… För svårt att programmera För många plattformar För farligt att köra kod i webbläsaren
  • 9. 9 Vilka problem har vi idag? För dålig produktivitet För svårt att underhålla kod Krav på parallellisering
  • 11. 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)))
  • 13. 13 Saker att beakta • Verktygsstöd • Antal användare • ”Momentum”
  • 15. 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. 16 Motsvarande Ruby-klass class Customer attr_accessor :firstName, :lastName end
  • 17. 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. 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. 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. 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. 21 ”Ett nytt språk säger du...?”
  • 22. 22 ”Kan du bara lägga till en feature i den här koden...” #:: ::-| ::-| .-. :||-:: 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"; #.: ::||-| .||-| :|||-| ::||-| ||-:: :|||-| .:|
  • 23. 23 Håller det i längden? class Customer < ActiveRecord::Base end new_one = Customer.new new_one. ?
  • 24. 24 Groovy + Grails class Customer { String firstName String lastName Integer age } newOne = new Customer();
  • 25. 25 Skillnader mot Ruby on Rails Groovy är mycket mer likt Java Groovy kan vara statiskt typat Grails är mer explicit Grails har betydligt bättre prestanda
  • 27. 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
  • 29. 29 Smärtfri integration med Java val formatter = new java.text.SimpleDateFormat() val thisIsAJavaString = ”You know all my methods!”
  • 30. 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. 31 Men... Är Scala så svårt egentligen?
  • 32. 32 Exhibit 1 class Customer(var firstName: String, var lastName: String, val birthDate: Date) { override def toString() = firstName + ” ” + lastName }
  • 33. 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. 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. 35 Exhibit 2 val books = List(”Coq Rouge”, ”Ulysses”, ”Papillon”, ”Pippi Långstrump”) books.foreach(println) val booksStartingWithP = books.filter(_.startsWith(”P”))
  • 36. 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. 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))
  • 38. Scala – en hybrid Scala är objektorienterat och funktionellt
  • 39. 39 Varför är detta bra? delat data Funktioner förändrar inte tillstånd Därför säkert att parallellisera dem
  • 40. 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”))
  • 41. Funktionell stil uppmuntras val är det vanliga – var undantag List, Set och Map normalt oföränderliga Nästan allting returnerar ett värde!
  • 42. 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. 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
  • 45. TACK!