Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




Polyglot	
  Programming	
  he	
  JVM	
  he	
  JVM	
  
Or	
  how	
  I	
  learned	
  to	
  stop	
  worrying	
  and	
  love	
  t
                                                                        in	
  t
About	
  t edit	
  Master	
  
Click	
  to	
  he	
  Speaker	
   /tle	
  style	
  


•    Java	
  developer	
  since	
  the	
  beginning	
  
•    True	
  believer	
  in	
  Open	
  Source	
  
•    Groovy	
  commiBer	
  since	
  2007	
  
•    Project	
  lead	
  of	
  the	
  Griffon	
  framework	
  
•    Currently	
  working	
  for	
  	
  
I	
  confess…	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  


<j:jelly	
  xmlns:j="jelly:core"	
  	
  
    	
  	
  	
  	
  	
  	
  	
  	
  xmlns:define="jelly:define"	
  	
  
    	
  	
  	
  	
  	
  	
  	
  	
  xmlns:my="myTagLib">	
  	
  
    <define:taglib	
  uri="myTagLib">	
  	
  
    	
  	
  	
  	
  <define:jellybean	
  name="foo"	
  className="MyTask"/>	
  	
  
    </define:taglib>	
  	
  
    Now	
  lets	
  use	
  the	
  new	
  tag	
  	
  
    <my:foo	
  x="2"	
  y="cheese"/>	
  	
  
</j:jelly>	
  
Some	
  o	
  edit	
  Master	
  /tle	
  style	
  
Click	
  t facts	
  about	
  Java	
  

     Previous	
  name	
  was	
  Oak	
  	
  
       –  Bonus	
  points	
  for	
  knowing	
  its	
  real	
  name	
  before	
  that	
  


     Made	
  its	
  public	
  appearance	
  in	
  1995	
  
     C/C++	
  were	
  king	
  at	
  the	
  /me	
  
     Networking,	
  mul/threading	
  were	
  baked	
  right	
  into	
  the	
  
      language	
  
     Developers	
  came	
  for	
  the	
  applets	
  and	
  stayed	
  for	
  the	
  
      components	
  (JEE	
  and	
  all	
  that	
  jazz)	
  
However...	
   Master	
  /tle	
  style	
  
Click	
  to	
  edit	
  

    It‘s	
  already	
  in	
  its	
  teens	
  

    It	
  has	
  not	
  seen	
  a	
  major	
  feature	
  upgrade	
  since	
  JDK5	
  was	
  
     released	
  back	
  in	
  2004	
  -­‐>	
  generics	
  	
  
      (and	
  we	
  do	
  know	
  how	
  that	
  turned	
  out	
  to	
  be,	
  don’t	
  we?)	
  

    JDK7	
  was	
  been	
  delayed	
  again	
  (scheduled	
  for	
  Q3	
  2011)	
  
                       Some	
  features	
  will	
  not	
  make	
  the	
  cut	
  	
  
                              (closures	
  are	
  in	
  apparently)	
  
More	
  o	
  edit	
  Master	
  /tle	
  style	
  
Click	
  tso...	
  

     It	
  is	
  rather	
  verbose	
  when	
  compared	
  to	
  how	
  other	
  languages	
  
      do	
  the	
  same	
  task	
  

     Its	
  threading	
  features	
  are	
  no	
  longer	
  enough.	
  	
  
            Concurrent	
  programs	
  desperately	
  cry	
  for	
  immutability	
  these	
  days	
  
Truth	
   o	
  edit	
  Master	
  /tle	
  style	
  
Click	
  tor	
  myth?	
  




       Is	
  Java	
  ofenly	
  referred	
  as	
  overengineered?	
  
Truth	
   o	
  edit	
  Master	
  /tle	
  style	
  
Click	
  tor	
  myth?	
  




       Can	
  you	
  build	
  a	
  Java	
  based	
  web	
  applica/on	
  
       (for	
  argument	
  sake	
  a	
  basic	
  TwiBer	
  clone)	
  in	
  
         less	
  than	
  a	
  day‘s	
  work	
  WITHOUT	
  an	
  IDE?	
  
Truth	
   o	
  edit	
  Master	
  /tle	
  style	
  
Click	
  tor	
  myth?	
  




           Did	
  James	
  Gosling	
  ever	
  say	
  he	
  was	
  
    threatened	
  with	
  bodily	
  harm	
  should	
  operator	
  
          overloading	
  find	
  its	
  way	
  into	
  Java?	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




 	
  The	
  JVM	
  is	
  a	
  great	
  place	
  to	
  
      work	
  however	
  Java	
  makes	
  
      it	
  painful	
  some/mes...	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




    What	
  can	
  we	
  do	
  about	
  it?!	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




                                    Disclaimer	
  
               (this	
  is	
  not	
  a	
  bash-­‐the-­‐other-­‐languages	
  talk)	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




Reduced	
  Verbosity	
  
Standard	
  Beans	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  

public class Bean {
  private String name;

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }
}
Standard	
  Beans	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  

public class Bean {
  private String name;

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }
}
Standard	
  Beans	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  

public class Bean {
  private String name;

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }
}
Standard	
  Beans	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




class Bean {
  String name
}
Standard	
  Beans	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




class Bean(var name:String)



class Bean {
  @scala.reflect.BeanProperty
    var name: String
}
Standard	
  Beans	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




(defstruct Bean :name)
Closures	
  dit	
   Func/ons)	
  
Click	
  to	
  e(or	
  Master	
  /tle	
  style	
  

public interface Adder {
    int add(int a, int b);
}

public class MyAdder implements Adder {
    public int add(int a, int b) {
      return a + b;
    }
}
Closures	
  dit	
   Func/ons)	
  
Click	
  to	
  e(or	
  Master	
  /tle	
  style	
  

// JDK7 Lambdas proposal

#(int a, int b)(a + b)

#(int a, int b) { return a + b; }
Closures	
  dit	
   Func/ons)	
  
Click	
  to	
  e(or	
  Master	
  /tle	
  style	
  




def adder = { a , b -> a + b }
Closures	
  dit	
   Func/ons)	
  
Click	
  to	
  e(or	
  Master	
  /tle	
  style	
  




val adder = (a:Int, b:Int) => a + b
Closures	
  dit	
   Func/ons)	
  
Click	
  to	
  e(or	
  Master	
  /tle	
  style	
  




(defn adder [a b] (+ a b))
Enhanced	
  switch	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  

char letterGrade(int grade) {
    if(grade >= 0 && grade <= 60) return ‘F‘;
    if(grade > 60 && grade <= 70) return ‘D‘;
    if(grade > 70 && grade <= 80) return ‘C‘;
    if(grade > 80 && grade <= 90) return ‘B‘;
    if(grade > 90 && grade <= 100) return ‘A‘;
  throw new IllegalArgumentException("invalid
grade "+grade);
}
Enhanced	
  Switch	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  

def letterGrade(grade) {
  switch(grade) {
     case 90..100: return ‘A‘
     case 80..<90: return ‘B‘
     case 70..<80: return ‘C‘
     case 60..<70: return ‘D‘
     case 0..<60: return ‘F‘
     case ~"[ABCDFabcdf]":
          return grade.toUpperCase()
  }
  throw new IllegalArgumentException('invalid
grade ‘+grade)
}
Enhanced	
  Switch	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  


val VALID_GRADES = Set("A", "B", "C", "D", "F")
def letterGrade(value: Any):String = value match {
    case x:Int if (90 to 100).contains(x) => "A"
    case x:Int if (80 to 90).contains(x) => "B"
    case x:Int if (70 to 80).contains(x) => "C"
    case x:Int if (60 to 70).contains(x) => "D"
    case x:Int if (0 to 60).contains(x) => "F"
  case x:String if VALID_GRADES(x.toUpperCase) =>
x.toUpperCase()
}
Enhanced	
  Switch	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  


(defn letter-grade [grade]
    (cond
     (in grade 90 100) "A"
     (in grade 80 90) "B"
      (in grade 70 80) "C"
      (in grade 60 70) "D"
      (in grade 0 60) "F"
   (re-find #"[ABCDFabcdf]" grade)
(.toUpperCase grade)))
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




Java	
  Interoperability	
  
All	
  of	
  these	
  are	
  true	
  /tle	
  style	
  
Click	
  to	
  edit	
  Master	
  

     Java	
  can	
  call	
  Groovy,	
  Scala	
  and	
  Clojure	
  classes	
  as	
  if	
  they	
  were	
  
      Java	
  classes	
  

     Groovy,	
  Scala	
  and	
  Clojure	
  can	
  call	
  Java	
  code	
  without	
  breaking	
  
      a	
  sweat!	
  

      In	
  other	
  words,	
  interoperability	
  with	
  Java	
  is	
  a	
  given.	
  
      	
  	
  No	
  need	
  for	
  complicated	
  bridges	
  between	
  languages	
  (i.e.	
  JSR	
  223)	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




                        OK,	
  so...	
  
      What	
  else	
  can	
  these	
  languages	
  do?	
  
All	
  of	
  them	
  	
   Master	
  /tle	
  style	
  
Click	
  to	
  edit	
  

     Na/ve	
  syntax	
  for	
  collec/on	
  classes	
  
     Everything	
  is	
  an	
  object	
  
     Closures!	
  
     Regular	
  expressions	
  as	
  first	
  class	
  ci/zens	
  
     Operator	
  overloading	
  
Groovy	
  edit	
  Master	
  /tle	
  style	
  
Click	
  to	
  

     Metaprogramming	
  (HOT!)	
  both	
  at	
  build/me	
  and	
  run/me	
  
     Builders	
  
     Healthy	
  ecosystem:	
  Grails,	
  Griffon,	
  Gant,	
  Gradle,	
  Spock,	
  
      Gaelyk,	
  Gpars,	
  CodeNarc,	
  etc...	
  

     Not	
  an	
  exhaus/ve	
  list	
  of	
  features!	
  
Scala	
  to	
  edit	
  Master	
  /tle	
  style	
  
Click	
  

     Richer	
  type	
  system	
  
     Type	
  inference	
  
     PaBern	
  matching	
  (case	
  classes)	
  
     Actor	
  model	
  
     Traits	
  



     Not	
  an	
  exhaus/ve	
  list	
  of	
  features!	
  
Clojure	
   edit	
  Master	
  /tle	
  style	
  
Click	
  to	
  

     Data	
  as	
  code	
  and	
  viceversa	
  
     Immutable	
  structures	
  
     STM	
  



     Not	
  an	
  exhaus/ve	
  list	
  of	
  features!	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




Demo	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




Other	
  places	
  where	
  you‘ll	
  find	
  
Polyglot	
  Programming	
  
Web	
  to	
  edit	
  Master	
  /tle	
  style	
  
Click	
  app	
  development	
  

     XML	
  
     SQL	
  
     JavaScript	
  
     JSON	
  
     CSS	
  
     Flash/Flex/Ac/onScript	
  
Next-­‐Gen	
  datastores	
  (tle	
  style	
  
Click	
  to	
  edit	
  Master	
  / NoSQL)	
  

     FleetDB	
  -­‐>	
  Clojure	
  

     FlockDB	
  -­‐>	
  Scala	
  

     CouchDB,	
  Riak	
  -­‐>	
  Erlang	
  



     By	
  the	
  way,	
  watch	
  out	
  for	
  Polyglot	
  Persistence	
  ;-­‐)	
  
Build	
  tsystems	
   aster	
  /tle	
  style	
  
Click	
   o	
  edit	
  M

     Gradle,	
  Gant	
  -­‐>	
  Groovy	
  

     Rake	
  -­‐>	
  Ruby/JRuby	
  

     Maven3	
  -­‐>	
  XML,	
  Groovy,	
  Ruby	
  
Par/ng	
  thoughts	
   /tle	
  style	
  
Click	
  to	
  edit	
  Master	
  

    Java	
  (the	
  language)	
  may	
  have	
  reached	
  its	
  maturity	
  feature	
  
     wise	
  (it’s	
  not	
  dead	
  though!)	
  

    Other	
  JVM	
  languages	
  have	
  evolved	
  faster	
  

    Polyglot	
  Programming	
  is	
  not	
  a	
  new	
  concept	
  

    Download	
  and	
  play	
  with	
  each	
  of	
  the	
  demoed	
  languages,	
  
     maybe	
  one	
  of	
  them	
  strikes	
  your	
  fancy	
  
Resources	
   Master	
  /tle	
  style	
  
Click	
  to	
  edit	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




Q	
  &	
  A	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




        hBp://people.canoo.com/share	
  
Click	
  to	
  edit	
  Master	
  /tle	
  style	
  




Thank	
  you!	
  

Polyglot Programming @ CONFESS

  • 1.
    Click  to  edit  Master  /tle  style   Polyglot  Programming  he  JVM  he  JVM   Or  how  I  learned  to  stop  worrying  and  love  t in  t
  • 2.
    About  t edit  Master   Click  to  he  Speaker   /tle  style   •  Java  developer  since  the  beginning   •  True  believer  in  Open  Source   •  Groovy  commiBer  since  2007   •  Project  lead  of  the  Griffon  framework   •  Currently  working  for    
  • 3.
    I  confess…   Click  to  edit  Master  /tle  style   <j:jelly  xmlns:j="jelly:core"                    xmlns:define="jelly:define"                    xmlns:my="myTagLib">     <define:taglib  uri="myTagLib">            <define:jellybean  name="foo"  className="MyTask"/>     </define:taglib>     Now  lets  use  the  new  tag     <my:foo  x="2"  y="cheese"/>     </j:jelly>  
  • 4.
    Some  o  edit  Master  /tle  style   Click  t facts  about  Java     Previous  name  was  Oak     –  Bonus  points  for  knowing  its  real  name  before  that     Made  its  public  appearance  in  1995     C/C++  were  king  at  the  /me     Networking,  mul/threading  were  baked  right  into  the   language     Developers  came  for  the  applets  and  stayed  for  the   components  (JEE  and  all  that  jazz)  
  • 5.
    However...   Master  /tle  style   Click  to  edit     It‘s  already  in  its  teens     It  has  not  seen  a  major  feature  upgrade  since  JDK5  was   released  back  in  2004  -­‐>  generics     (and  we  do  know  how  that  turned  out  to  be,  don’t  we?)     JDK7  was  been  delayed  again  (scheduled  for  Q3  2011)   Some  features  will  not  make  the  cut     (closures  are  in  apparently)  
  • 6.
    More  o  edit  Master  /tle  style   Click  tso...     It  is  rather  verbose  when  compared  to  how  other  languages   do  the  same  task     Its  threading  features  are  no  longer  enough.     Concurrent  programs  desperately  cry  for  immutability  these  days  
  • 7.
    Truth   o  edit  Master  /tle  style   Click  tor  myth?   Is  Java  ofenly  referred  as  overengineered?  
  • 8.
    Truth   o  edit  Master  /tle  style   Click  tor  myth?   Can  you  build  a  Java  based  web  applica/on   (for  argument  sake  a  basic  TwiBer  clone)  in   less  than  a  day‘s  work  WITHOUT  an  IDE?  
  • 9.
    Truth   o  edit  Master  /tle  style   Click  tor  myth?   Did  James  Gosling  ever  say  he  was   threatened  with  bodily  harm  should  operator   overloading  find  its  way  into  Java?  
  • 10.
    Click  to  edit  Master  /tle  style    The  JVM  is  a  great  place  to   work  however  Java  makes   it  painful  some/mes...  
  • 11.
    Click  to  edit  Master  /tle  style   What  can  we  do  about  it?!  
  • 12.
    Click  to  edit  Master  /tle  style  
  • 13.
    Click  to  edit  Master  /tle  style   Disclaimer   (this  is  not  a  bash-­‐the-­‐other-­‐languages  talk)  
  • 14.
    Click  to  edit  Master  /tle  style   Reduced  Verbosity  
  • 15.
    Standard  Beans   Click  to  edit  Master  /tle  style   public class Bean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
  • 16.
    Standard  Beans   Click  to  edit  Master  /tle  style   public class Bean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
  • 17.
    Standard  Beans   Click  to  edit  Master  /tle  style   public class Bean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
  • 18.
    Standard  Beans   Click  to  edit  Master  /tle  style   class Bean { String name }
  • 19.
    Standard  Beans   Click  to  edit  Master  /tle  style   class Bean(var name:String) class Bean { @scala.reflect.BeanProperty var name: String }
  • 20.
    Standard  Beans   Click  to  edit  Master  /tle  style   (defstruct Bean :name)
  • 21.
    Closures  dit  Func/ons)   Click  to  e(or  Master  /tle  style   public interface Adder { int add(int a, int b); } public class MyAdder implements Adder { public int add(int a, int b) { return a + b; } }
  • 22.
    Closures  dit  Func/ons)   Click  to  e(or  Master  /tle  style   // JDK7 Lambdas proposal #(int a, int b)(a + b) #(int a, int b) { return a + b; }
  • 23.
    Closures  dit  Func/ons)   Click  to  e(or  Master  /tle  style   def adder = { a , b -> a + b }
  • 24.
    Closures  dit  Func/ons)   Click  to  e(or  Master  /tle  style   val adder = (a:Int, b:Int) => a + b
  • 25.
    Closures  dit  Func/ons)   Click  to  e(or  Master  /tle  style   (defn adder [a b] (+ a b))
  • 26.
    Enhanced  switch   Click  to  edit  Master  /tle  style   char letterGrade(int grade) { if(grade >= 0 && grade <= 60) return ‘F‘; if(grade > 60 && grade <= 70) return ‘D‘; if(grade > 70 && grade <= 80) return ‘C‘; if(grade > 80 && grade <= 90) return ‘B‘; if(grade > 90 && grade <= 100) return ‘A‘; throw new IllegalArgumentException("invalid grade "+grade); }
  • 27.
    Enhanced  Switch   Click  to  edit  Master  /tle  style   def letterGrade(grade) { switch(grade) { case 90..100: return ‘A‘ case 80..<90: return ‘B‘ case 70..<80: return ‘C‘ case 60..<70: return ‘D‘ case 0..<60: return ‘F‘ case ~"[ABCDFabcdf]": return grade.toUpperCase() } throw new IllegalArgumentException('invalid grade ‘+grade) }
  • 28.
    Enhanced  Switch   Click  to  edit  Master  /tle  style   val VALID_GRADES = Set("A", "B", "C", "D", "F") def letterGrade(value: Any):String = value match { case x:Int if (90 to 100).contains(x) => "A" case x:Int if (80 to 90).contains(x) => "B" case x:Int if (70 to 80).contains(x) => "C" case x:Int if (60 to 70).contains(x) => "D" case x:Int if (0 to 60).contains(x) => "F" case x:String if VALID_GRADES(x.toUpperCase) => x.toUpperCase() }
  • 29.
    Enhanced  Switch   Click  to  edit  Master  /tle  style   (defn letter-grade [grade] (cond (in grade 90 100) "A" (in grade 80 90) "B" (in grade 70 80) "C" (in grade 60 70) "D" (in grade 0 60) "F" (re-find #"[ABCDFabcdf]" grade) (.toUpperCase grade)))
  • 30.
    Click  to  edit  Master  /tle  style   Java  Interoperability  
  • 31.
    All  of  these  are  true  /tle  style   Click  to  edit  Master     Java  can  call  Groovy,  Scala  and  Clojure  classes  as  if  they  were   Java  classes     Groovy,  Scala  and  Clojure  can  call  Java  code  without  breaking   a  sweat!     In  other  words,  interoperability  with  Java  is  a  given.      No  need  for  complicated  bridges  between  languages  (i.e.  JSR  223)  
  • 32.
    Click  to  edit  Master  /tle  style   OK,  so...   What  else  can  these  languages  do?  
  • 33.
    All  of  them     Master  /tle  style   Click  to  edit     Na/ve  syntax  for  collec/on  classes     Everything  is  an  object     Closures!     Regular  expressions  as  first  class  ci/zens     Operator  overloading  
  • 34.
    Groovy  edit  Master  /tle  style   Click  to     Metaprogramming  (HOT!)  both  at  build/me  and  run/me     Builders     Healthy  ecosystem:  Grails,  Griffon,  Gant,  Gradle,  Spock,   Gaelyk,  Gpars,  CodeNarc,  etc...     Not  an  exhaus/ve  list  of  features!  
  • 35.
    Scala  to  edit  Master  /tle  style   Click     Richer  type  system     Type  inference     PaBern  matching  (case  classes)     Actor  model     Traits     Not  an  exhaus/ve  list  of  features!  
  • 36.
    Clojure   edit  Master  /tle  style   Click  to     Data  as  code  and  viceversa     Immutable  structures     STM     Not  an  exhaus/ve  list  of  features!  
  • 37.
    Click  to  edit  Master  /tle  style   Demo  
  • 38.
    Click  to  edit  Master  /tle  style   Other  places  where  you‘ll  find   Polyglot  Programming  
  • 39.
    Web  to  edit  Master  /tle  style   Click  app  development     XML     SQL     JavaScript     JSON     CSS     Flash/Flex/Ac/onScript  
  • 40.
    Next-­‐Gen  datastores  (tle  style   Click  to  edit  Master  / NoSQL)     FleetDB  -­‐>  Clojure     FlockDB  -­‐>  Scala     CouchDB,  Riak  -­‐>  Erlang     By  the  way,  watch  out  for  Polyglot  Persistence  ;-­‐)  
  • 41.
    Build  tsystems  aster  /tle  style   Click   o  edit  M   Gradle,  Gant  -­‐>  Groovy     Rake  -­‐>  Ruby/JRuby     Maven3  -­‐>  XML,  Groovy,  Ruby  
  • 42.
    Par/ng  thoughts  /tle  style   Click  to  edit  Master     Java  (the  language)  may  have  reached  its  maturity  feature   wise  (it’s  not  dead  though!)     Other  JVM  languages  have  evolved  faster     Polyglot  Programming  is  not  a  new  concept     Download  and  play  with  each  of  the  demoed  languages,   maybe  one  of  them  strikes  your  fancy  
  • 43.
    Resources   Master  /tle  style   Click  to  edit  
  • 44.
    Click  to  edit  Master  /tle  style   Q  &  A  
  • 45.
    Click  to  edit  Master  /tle  style   hBp://people.canoo.com/share  
  • 46.
    Click  to  edit  Master  /tle  style   Thank  you!