0
Groovy 2.0  What’s up doc?Guillaume Laforge Cédric ChampeauGroovy Project Manager Groovy Committer      @glaforge        @...
Groovy 2.0  What’s up doc?Guillaume Laforge Cédric ChampeauGroovy Project Manager Groovy Committer      @glaforge        @...
Guillaume Laforge•   Groovy Project Manager at VMware    •Initiator of the Grails framework    •Creator of the Gaelyk     ...
Cédric Champeau•   Past: Groovy contributor then committer•   Present: Groovy Core Developer at VMware    •bug fixes with m...
Agenda (1/2)• What’s new in Groovy 1.8? • Nicer DSLs with command chains • Runtime performance improvements • GPars bundle...
Agenda (2/2)• What’s cooking for Groovy 2.0? • Modularity • Alignments with JDK 7  • Project Coin (small language changes)...
Command chains•   A grammar improvement allowing you    to drop dots & parens    when chaining method calls    • an extend...
Command chains	  pull	  request	  	  on	  github	                                                7
Command chains  Alternation of  method names	  pull	  request	  	  on	  github	                                           ...
Command chains  Alternation of  method names	  pull	  request	  	  on	  github	                and parameters            (...
Command chains	  pull	  request	  	  on	  github	                                                7
Command chains    Equivalent to:	  pull	  request	  	  on	  github	  	  	  	  	  	  (	  	  	  	  	  	  	  ).	  	  (	  	  	...
Command chainscommit	  2	  	  changes	  on	  	  master	  	  branch                                                        ...
Command chains	  	  	  	  	  	  (	  ).	  	  	  	  	  	  	  (	  	  ).	  	  	  	  	  	  	  (	  	  	  	  	  	  )commit	  2	  ...
Command chains                 9
Command chains//	  methods	  with	  multiple	  arguments	  (commas)                                                       ...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
Command chains//	  methods	  with	  multiple	  arguments	  (commas)take	  coffee	  	  with	  sugar,	  milk	  	  and	  liqu...
GPars bundled•   GPars is bundled in the Groovy distribution•   GPars covers a wide range of parallel    and concurrent pa...
Closure enhancements• Closure annotation parameters•    Some more functional flavor    • composition        •        compos...
Closure annotation parameters    @Retention(RetentionPolicy.RUNTIME)    @interface	  Invariant	  {	  	  	  	      	  	  	 ...
Closure annotation parameters    @Retention(RetentionPolicy.RUNTIME)    @interface	  Invariant	  {	  	  	  	      	  	  	 ...
Closure memoization                      13
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()                           ...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Closure memoizationdef	  plus	  =	  {	  a,	  b	  -­‐>	  sleep	  1000;	  a	  +	  b	  }.memoize()assert	  plus(1,	  2)	  ==	...
Builtin JSON support•   Consuming•   Producing•   Pretty-printing                                       14
Builtin JSON supportimport	  groovy.json.*	  def	  payload	  =	  new	  URL(	  	  	  	  "http://github.../json/commits/..."...
Builtin JSON supportimport	  groovy.json.*	  	  def	  json	  =	  new	  JsonBuilder()	  	  json.person	  {	  	  	  	  	  	 ...
Builtin JSON supportimport	  groovy.json.*	  	  def	  json	  =	  new	  JsonBuilder()	  	  json.person	  {	  	  	  	       ...
Builtin JSON supportimport	  groovy.json.*	  	  println	  JsonOutput.prettyPrint(	  	  	  	  {"person":{"name":"Guillaume"...
New AST transformations• @Log                         • Controlling execution                                   •   @Threa...
@Log•   Four different loggers can be injected    •@Log    •@Commons                   import	  groovy.util.logging.*	    ...
@Log•   Four different loggers can be injected    •@Log    •@Commons                   import	  groovy.util.logging.*	    ...
Controlling code execution•   Your application may run user’s code    •what if the code runs in infinite loops or for too l...
@ThreadInterrupt@ThreadInterruptimport	  groovy.transform.ThreadInterrupt	  	  while	  (true)	  {	  	  	  	  //	  eat	  lo...
@ThreadInterrupt    @ThreadInterrupt    import	  groovy.transform.ThreadInterrupt	      	      while	  (true)	  {{   	  	 ...
@ToString•       Provides a default toString() method to your types•       Available annotation options    •    includeNam...
@EqualsAndHashCode•   Provides default implementations for equals() and    hashCode() methods            import	  groovy.t...
@TupleConstructor•   Provides a «classical» constructor with all properties•   Several annotation parameter options availa...
@InheritConstructors•   Classes like Exception are painful when extended,    as all the base constructors should be replic...
@InheritConstructors•   Classes like Exception are painful when extended,    as all the base constructors should be replic...
Miscellaneous•   Compilation customizers•   Java 7 diamond operator•   Slashy and dollar slashy strings•   New GDK methods...
Compilation customizers•   Ability to apply some customization to the Groovy    compilation process•   Three available cus...
Imports customizerdef	  configuration	  =	  new	  CompilerConfiguration()	  def	  custo	  =	  new	  ImportCustomizer()cust...
What’sin storefor 2.0?
2.0Around the corner...
Groovy 2.0•   A more modular Groovy•   Java 7 alignements: Project Coin    • binary literals    • underscore in literals  ...
Groovy Modularity•   Groovy’s «all» JAR weighs in at 6 MB• Nobody needs everything • Template engine, Ant scripting, Swing...
The new JARs•   A smaller groovy.jar: 3MB•   Modules    •console                    •   sql    •docgenerator              ...
Extension modules•   Create your own module    •contribute instance extension methodspackage	  fooclass	  StringExtension	...
Extension modules•   Create your own module    •contribute instance extension methods                   Same structure    ...
Extension modules•   Create your own module    •contribute class extension methods             package	  foo             c...
Extension module descriptor•   Descriptor in: META-INF/services/    org.codehaus.groovy.runtime.ExtensionModulemoduleName	...
Java 7 / JDK 7•   Project Coin and InvokeDynamic                                     37
Binary literals•   We had decimal, octal and hexadecimal notations for    number literals•   We can now use binary represe...
Underscore in literals•   Now we can also add underscores    in number literals for more readability    long	  creditCardN...
Multicatch•   One block for multiple exception caught    •rather than duplicating the block        try	  {        	  	  	 ...
InvokeDynamic• Groovy 2.0 supports JDK 7’s invokeDynamic • compiler has a flag for compiling against JDK 7 • might use the ...
Yourturn!        42
Static Type Checking•   Goal: make the Groovy compiler «grumpy»!    •   and throw compilation errors (not at runtime)• Not...
Typos in a vars or methodsimport	  groovy.transform.TypeChecked	  void	  method()	  {}	  @TypeChecked	  test()	  {	  	  	 ...
Typos in a vars or methodsimport	  groovy.transform.TypeChecked	  void	  method()	  {}	  @TypeChecked	  test()	  {	  	  	 ...
Typos in a vars or methods                                                            Annotation can be atimport	  groovy....
Wrong assignments//	  cannot	  assign	  value	  of	  type...	  to	  variable...int	  x	  =	  new	  Object()Set	  set	  =	 ...
Wrong assignments//	  cannot	  assign	  value	  of	  type...	  to	  variable...int	  x	  =	  new	  Object()Set	  set	  =	 ...
Wrong return types//	  checks	  if/else	  branch	  return	  values@TypeCheckedint	  method()	  {	  	  	  	  if	  (true)	  ...
Wrong return types//	  checks	  if/else	  branch	  return	  values@TypeCheckedint	  method()	  {                          ...
Type inference@TypeChecked	  test()	  {	  	  	  	  def	  name	  =	  "	  	  Guillaume	  	  "	  	  	  	  	  //	  String	  ty...
Statically checked & dyn meth@TypeCheckedString	  greeting(String	  name)	  {	  	  	  	  //	  call	  method	  with	  dynam...
Instanceof checks@TypeChecked	  void	  test(Object	  val)	  {	  	  	  	  if	  (val	  instanceof	  String)	  {	  	  	  	  	...
Instanceof checks                                                                        No need@TypeChecked	             ...
Instanceof checks                                                                         No need @TypeChecked	           ...
Lowest Upper Bound•   Represents the lowest «super» type classes    have in common    •may be virtual (aka «non-denotable»...
Lowest Upper Bound•   Represents the lowest «super» type classes    have in common    •may be virtual (aka «non-denotable»...
Lowest Upper Bound•   Represents the lowest «super» type classes    have in common    •may be virtual (aka «non-denotable»...
Flow typing•    Static type checking shouldn’t complain even for bad coding     practicies which work without type checks ...
Static checking vs dynamic•   Type checking works at compile-time    •adding @TypeChecked doesn’t change behavior        •...
Runtime metaprogramming@TypeChecked	  void	  test()	  {	  	  	  	  Integer.metaClass.foo	  =	  {}	  	  	  	  123.foo()}   ...
Runtime metaprogramming@TypeChecked	  void	  test()	  {	  	  	  	  Integer.metaClass.foo	  =	  {}	  	  	  	  123.foo()}   ...
Runtime metaprogramming@TypeChecked	  void	  test()	  {	  	  	  	  Integer.metaClass.foo	  =	  {}	  	  	  	  123.foo()}   ...
Explicit type for closures@TypeChecked	  test()	  {	  	  	  	  ["a",	  "b",	  "c"].collect	  {	  	  	  	  	  	  	  	  it.t...
Explicit type for closures@TypeChecked	  test()	  {	  	  	  	  ["a",	  "b",	  "c"].collect	  {	  String	  it	  -­‐>	  	  	...
Closure shared variables@TypeChecked	  test()	  {	  	  	  	  def	  var	  =	  "abc"	  	  	  	  	  	  	  	  	  	  	  def	  c...
Closure shared variables                                       var assigned in the closure:                               ...
Closure shared variables                                                        var assigned in the closure:              ...
Closure shared variables                                                        var assigned in the closure:              ...
Closure shared variablesclass	  A	  	  	  	  	  	  	  	  	  	  	  {	  void	  foo()	  {}	  }class	  B	  extends	  A	  {	  v...
Closure shared variablesclass	  A	  	  	  	  	  	  	  	  	  	  	  {	  void	  foo()	  {}	  }class	  B	  extends	  A	  {	  v...
Static Compilation•   Given your Groovy code can be type checked...    we can as well compile it «statically»    •   ie. g...
Advantages•    You gain:    • Type safety     • thanks to static type checking      • static compilation builds upon stati...
Disadvantages•   But you loose:    •   Dynamic features        •metaclass changes, categories, etc.    •   Dynamic method ...
Statically compiled & dyn meth@CompileStaticString	  greeting(String	  name)	  {	  	  	  	  //	  call	  method	  with	  dy...
What about performance?•   Comparisons between:    •   Java    •   Groovy static compilation (Groovy 2.0)    •   Groovy wi...
What about performance?                                            Pi (π)     Binary                              Fibonacc...
Summary•   Main themes of the Groovy 2.0 release    •Modularity    •   Embark the JDK 7 enhancements        •Project Coin ...
64
Thank you!                     e            eL aforg pmentGu illaum ovy Develo            roHe ad of G                    ...
Questions & Answers•   Got questions, really?                             Q&A                                    66
Image credits•   Bugs bunny: http://storage.canalblog.com/63/56/517188/47634843.jpeg•   Pills: http://www.we-ew.com/wp-con...
Groovy 1.8   AST Transform   @Grab 1   // methods with multiple arguments (commas) 2   take coffee  with sugar, milk  and ...
Groovy 1.8   AST Transform   @Grab 1   // methods with multiple arguments (commas) 2   take coffee  with sugar, milk  and ...
Upcoming SlideShare
Loading in...5
×

Groovy 1.8 et 2.0 au BreizhC@mp 2012

866

Published on

Published in: Technology, Business
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
866
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
10
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "Groovy 1.8 et 2.0 au BreizhC@mp 2012"

  1. 1. Groovy 2.0 What’s up doc?Guillaume Laforge Cédric ChampeauGroovy Project Manager Groovy Committer @glaforge @cedricchampeau 1
  2. 2. Groovy 2.0 What’s up doc?Guillaume Laforge Cédric ChampeauGroovy Project Manager Groovy Committer @glaforge @cedricchampeau 1
  3. 3. Guillaume Laforge• Groovy Project Manager at VMware •Initiator of the Grails framework •Creator of the Gaelyk and Caelyf toolkits• Co-author of Groovy in Action• Follow me on... •My blog: http://glaforge.appspot.com •Twitter: @glaforge •Google+: http://gplus.to/glaforge 2
  4. 4. Cédric Champeau• Past: Groovy contributor then committer• Present: Groovy Core Developer at VMware •bug fixes with main focus on static type checking and static compilation• Follow me on... •My blog: http://jroller.com/melix •Twitter: @cedricchampeau •Google+: http://gplus.to/cchampeau 3
  5. 5. Agenda (1/2)• What’s new in Groovy 1.8? • Nicer DSLs with command chains • Runtime performance improvements • GPars bundled for taming your multicores • Closure enhancements • Builtin JSON support • New AST transformations 4
  6. 6. Agenda (2/2)• What’s cooking for Groovy 2.0? • Modularity • Alignments with JDK 7 • Project Coin (small language changes) • Invoke Dynamic support • Continued runtime performance improvements • Static type checking • Static compilation 5
  7. 7. Command chains• A grammar improvement allowing you to drop dots & parens when chaining method calls • an extended version of top-level statements like println• Less dots, less parens allow you to •write more readable business rules •in almost plain English sentences • (or any language, of course) 6
  8. 8. Command chains  pull  request    on  github   7
  9. 9. Command chains Alternation of method names  pull  request    on  github   7
  10. 10. Command chains Alternation of method names  pull  request    on  github   and parameters (even named ones) 7
  11. 11. Command chains  pull  request    on  github   7
  12. 12. Command chains Equivalent to:  pull  request    on  github            (              ).    (            ) 7
  13. 13. Command chainscommit  2    changes  on    master    branch 8
  14. 14. Command chains            (  ).              (    ).              (            )commit  2    changes  on    master    branch 8
  15. 15. Command chains 9
  16. 16. Command chains//  methods  with  multiple  arguments  (commas) 9
  17. 17. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor 9
  18. 18. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor//  leverage  named-­‐args  as  punctuation 9
  19. 19. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good 9
  20. 20. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good//  closure  parameters  for  new  control  structures 9
  21. 21. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good//  closure  parameters  for  new  control  structuresgiven  {}    when  {}    then  {} 9
  22. 22. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good//  closure  parameters  for  new  control  structuresgiven  {}    when  {}    then  {}//  zero-­‐arg  methods  require  parens 9
  23. 23. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good//  closure  parameters  for  new  control  structuresgiven  {}    when  {}    then  {}//  zero-­‐arg  methods  require  parensselect  all    unique()  from  names 9
  24. 24. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good//  closure  parameters  for  new  control  structuresgiven  {}    when  {}    then  {}//  zero-­‐arg  methods  require  parensselect  all    unique()  from  names//  possible  with  an  odd  number  of  terms 9
  25. 25. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good//  closure  parameters  for  new  control  structuresgiven  {}    when  {}    then  {}//  zero-­‐arg  methods  require  parensselect  all    unique()  from  names//  possible  with  an  odd  number  of  termstake  3    cookies 9
  26. 26. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            )//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good//  closure  parameters  for  new  control  structuresgiven  {}    when  {}    then  {}//  zero-­‐arg  methods  require  parensselect  all    unique()  from  names//  possible  with  an  odd  number  of  termstake  3    cookies 9
  27. 27. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            )//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good          (                              ).            (        )//  closure  parameters  for  new  control  structuresgiven  {}    when  {}    then  {}//  zero-­‐arg  methods  require  parensselect  all    unique()  from  names//  possible  with  an  odd  number  of  termstake  3    cookies 9
  28. 28. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            )//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good          (                              ).            (        )//  closure  parameters  for  new  control  structuresgiven  {}    when  {}    then  {}          (    ).        (    ).        (    )//  zero-­‐arg  methods  require  parensselect  all    unique()  from  names//  possible  with  an  odd  number  of  termstake  3    cookies 9
  29. 29. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            )//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good          (                              ).            (        )//  closure  parameters  for  new  control  structuresgiven  {}    when  {}    then  {}          (    ).        (    ).        (    )//  zero-­‐arg  methods  require  parensselect  all    unique()  from  names            (      ).                .        (          )//  possible  with  an  odd  number  of  termstake  3    cookies 9
  30. 30. Command chains//  methods  with  multiple  arguments  (commas)take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            )//  leverage  named-­‐args  as  punctuationcheck  that:  margarita    tastes  good          (                              ).            (        )//  closure  parameters  for  new  control  structuresgiven  {}    when  {}    then  {}          (    ).        (    ).        (    )//  zero-­‐arg  methods  require  parensselect  all    unique()  from  names            (      ).                .        (          )//  possible  with  an  odd  number  of  termstake  3    cookies        (  ). 9
  31. 31. GPars bundled• GPars is bundled in the Groovy distribution• GPars covers a wide range of parallel and concurrent paradigms •actors, fork/join, map/filter/reduce, dataflow, agents •parallel arrays, executors, STM, and more...• And you can use it from plain Java as well! 10
  32. 32. Closure enhancements• Closure annotation parameters• Some more functional flavor • composition • compose several closures into one single closure • trampoline • avoid stack overflow errors for recursive algorithms • memoization • remember the outcome of previous closure invocations • currying improvements 11
  33. 33. Closure annotation parameters @Retention(RetentionPolicy.RUNTIME) @interface  Invariant  {                Class  value()  //  a  closure  class }  { @Invariant({  number  >=  0  }) class  Distance  {                float  number                String  unit }     def  d  =  new  Distance(number:  10,  unit:  "meters")   def  anno  =  Distance.getAnnotation(Invariant) def  check  =  anno.value().newInstance(d,  d) assert  check(d) 12
  34. 34. Closure annotation parameters @Retention(RetentionPolicy.RUNTIME) @interface  Invariant  {                Class  value()  //  a  closure  class }  { @Invariant({  number  >=  0  }) class  Distance  {                float  number         Poor- man’s GCon tracts        String  unit }     def  d  =  new  Distance(number:  10,  unit:  "meters")   def  anno  =  Distance.getAnnotation(Invariant) def  check  =  anno.value().newInstance(d,  d) assert  check(d) 12
  35. 35. Closure memoization 13
  36. 36. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize() 13
  37. 37. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000ms 13
  38. 38. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediately 13
  39. 39. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediatelyassert  plus(2,  2)  ==  4  //  after  1000ms 13
  40. 40. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediatelyassert  plus(2,  2)  ==  4  //  after  1000msassert  plus(2,  2)  ==  4  //  return  immediately     13
  41. 41. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediatelyassert  plus(2,  2)  ==  4  //  after  1000msassert  plus(2,  2)  ==  4  //  return  immediately       13
  42. 42. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediatelyassert  plus(2,  2)  ==  4  //  after  1000msassert  plus(2,  2)  ==  4  //  return  immediately      //  at  least  10  invocations  cached 13
  43. 43. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediatelyassert  plus(2,  2)  ==  4  //  after  1000msassert  plus(2,  2)  ==  4  //  return  immediately      //  at  least  10  invocations  cacheddef  plusAtLeast  =  {  ...  }.memoizeAtLeast(10) 13
  44. 44. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediatelyassert  plus(2,  2)  ==  4  //  after  1000msassert  plus(2,  2)  ==  4  //  return  immediately      //  at  least  10  invocations  cacheddef  plusAtLeast  =  {  ...  }.memoizeAtLeast(10)   13
  45. 45. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediatelyassert  plus(2,  2)  ==  4  //  after  1000msassert  plus(2,  2)  ==  4  //  return  immediately      //  at  least  10  invocations  cacheddef  plusAtLeast  =  {  ...  }.memoizeAtLeast(10)  //  at  most  10  invocations  cached 13
  46. 46. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediatelyassert  plus(2,  2)  ==  4  //  after  1000msassert  plus(2,  2)  ==  4  //  return  immediately      //  at  least  10  invocations  cacheddef  plusAtLeast  =  {  ...  }.memoizeAtLeast(10)  //  at  most  10  invocations  cacheddef  plusAtMost  =  {  ...  }.memoizeAtMost(10)   13
  47. 47. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediatelyassert  plus(2,  2)  ==  4  //  after  1000msassert  plus(2,  2)  ==  4  //  return  immediately      //  at  least  10  invocations  cacheddef  plusAtLeast  =  {  ...  }.memoizeAtLeast(10)  //  at  most  10  invocations  cacheddef  plusAtMost  =  {  ...  }.memoizeAtMost(10)  //  between  10  and  20  invocations  cached 13
  48. 48. Closure memoizationdef  plus  =  {  a,  b  -­‐>  sleep  1000;  a  +  b  }.memoize()assert  plus(1,  2)  ==  3  //  after  1000msassert  plus(1,  2)  ==  3  //  return  immediatelyassert  plus(2,  2)  ==  4  //  after  1000msassert  plus(2,  2)  ==  4  //  return  immediately      //  at  least  10  invocations  cacheddef  plusAtLeast  =  {  ...  }.memoizeAtLeast(10)  //  at  most  10  invocations  cacheddef  plusAtMost  =  {  ...  }.memoizeAtMost(10)  //  between  10  and  20  invocations  cacheddef  plusAtLeast  =  {  ...  }.memoizeBetween(10,  20) 13
  49. 49. Builtin JSON support• Consuming• Producing• Pretty-printing 14
  50. 50. Builtin JSON supportimport  groovy.json.*  def  payload  =  new  URL(        "http://github.../json/commits/...").text  def  slurper  =  new  JsonSlurper()def  doc  =  slurper.parseText(payload)  doc.commits.message.each  {  println  it  } 15
  51. 51. Builtin JSON supportimport  groovy.json.*    def  json  =  new  JsonBuilder()    json.person  {                name  "Guillaume"        age  34                pets  "Hector",  "Felix"}  println  json.toString() 16
  52. 52. Builtin JSON supportimport  groovy.json.*    def  json  =  new  JsonBuilder()    json.person  {         {                name  "Guillaume"        "person":  {                                "name":  "Guillaume",            age  34                        "age":  34,                        pets  "Hector",  "Felix"                "pets":  [                        }                          "Hector",                  println  json.toString()                        "Felix"                                ]                } } 16
  53. 53. Builtin JSON supportimport  groovy.json.*    println  JsonOutput.prettyPrint(        {"person":{"name":"Guillaume","age":34,  +          "pets":["Hector","Felix"]}})   {                "person":  {                                "name":  "Guillaume",                      "age":  34,                                "pets":  [                                                "Hector",                                            "Felix"                                ]                } } 17
  54. 54. New AST transformations• @Log • Controlling execution • @ThreadInterrupt• @Field • @TimedInterrupt • @ConditionalInterrupt• @AutoClone • @InheritConstructor• @AutoExternalizable • @WithReadLock• @Canonical • @WithWriteLock • @ToString • @EqualsAndHashCode • @TupleConstructor • @ListenerList 18
  55. 55. @Log• Four different loggers can be injected •@Log •@Commons import  groovy.util.logging.*   •@Log4j   @Log •@Slf4j class  Car  {                Car()  {                                log.info  Car  constructed    • Possible to implement        } }   your own strategy   def  c  =  new  Car() 19
  56. 56. @Log• Four different loggers can be injected •@Log •@Commons import  groovy.util.logging.*   •@Log4j   @Log •@Slf4j Guarded w/ an if class  Car  {                Car()  {                                log.info  Car  constructed    • Possible to implement        } }   your own strategy   def  c  =  new  Car() 19
  57. 57. Controlling code execution• Your application may run user’s code •what if the code runs in infinite loops or for too long? •what if the code consumes too many resources?• 3 new transforms at your rescue •@ThreadInterrupt: adds Thread#isInterrupted checks so your executing thread stops when interrupted •@TimedInterrupt: adds checks in method and closure bodies to verify it’s run longer than expected •@ConditionalInterrupt: adds checks with your own conditional logic to break out from the user code 20
  58. 58. @ThreadInterrupt@ThreadInterruptimport  groovy.transform.ThreadInterrupt    while  (true)  {        //  eat  lots  of  CPU} 21 33
  59. 59. @ThreadInterrupt @ThreadInterrupt import  groovy.transform.ThreadInterrupt     while  (true)  {{        if  (Thread.currentThread().isInterrupted())                throw  new  InterruptedException() }        //  eat  lots  of  CPU } 21 33
  60. 60. @ToString• Provides a default toString() method to your types• Available annotation options • includeNames, includeFields, includeSuper, excludes import  groovy.transform.ToString     @ToString class  Person  {                String  name                int  age }     println  new  Person(name:  Pete,  age:  15) //  =>  Person(Pete,  15) 22
  61. 61. @EqualsAndHashCode• Provides default implementations for equals() and hashCode() methods import  groovy.transform.EqualsAndHashCode     @EqualsAndHashCode class  Coord  {                int  x,  y }     def  c1  =  new  Coord(x:  20,  y:  5) def  c2  =  new  Coord(x:  20,  y:  5)     assert  c1  ==  c2 assert  c1.hashCode()  ==  c2.hashCode() 23
  62. 62. @TupleConstructor• Provides a «classical» constructor with all properties• Several annotation parameter options available import  groovy.transform.TupleConstructor     @TupleConstructor   class  Person  {                String  name                int  age }     def  m  =  new  Person(Marion,  4)               assert  m.name  ==  Marion assert  m.age    ==  4 24
  63. 63. @InheritConstructors• Classes like Exception are painful when extended, as all the base constructors should be replicated class  CustomException  extends  Exception  {        CustomException()                                                {  super()              }        CustomException(String  msg)                            {  super(msg)        }        CustomException(String  msg,  Throwable  t)  {  super(msg,  t)  }        CustomException(Throwable  t)                          {  super(t)            } } 25
  64. 64. @InheritConstructors• Classes like Exception are painful when extended, as all the base constructors should be replicated import  groovy.transform.* @InheritConstructors class  CustomException  extends  Exception  {        CustomException()                                                {  super()              }        CustomException(String  msg)                            {  super(msg)        }        CustomException(String  msg,  Throwable  t)  {  super(msg,  t)  }        CustomException(Throwable  t)                          {  super(t)            } } 25
  65. 65. Miscellaneous• Compilation customizers• Java 7 diamond operator• Slashy and dollar slashy strings• New GDK methods• (G)String to Enum coercion• Customizing the Groovysh prompt• Executing remote scripts 26
  66. 66. Compilation customizers• Ability to apply some customization to the Groovy compilation process• Three available customizers •ImportCustomizer •ASTTransformationCustomizer •SecureASTCustomizer• But you can implement your own 27
  67. 67. Imports customizerdef  configuration  =  new  CompilerConfiguration()  def  custo  =  new  ImportCustomizer()custo.addStaticStar(Math.name)configuration.addCompilationCustomizers(custo)    def  result  =  new  GroovyShell(configuration)                          //  import  static  java.lang.Math.*        .evaluate("  cos  PI/3  ")                             28
  68. 68. What’sin storefor 2.0?
  69. 69. 2.0Around the corner...
  70. 70. Groovy 2.0• A more modular Groovy• Java 7 alignements: Project Coin • binary literals • underscore in literals • multicatch• JDK 7: InvokeDynamic• Static type checking• Static compilation 31
  71. 71. Groovy Modularity• Groovy’s «all» JAR weighs in at 6 MB• Nobody needs everything • Template engine, Ant scripting, Swing UI building...• Provide a smaller core •and several smaller JARs per feature• Provide hooks for setting up DGM methods, etc. 32
  72. 72. The new JARs• A smaller groovy.jar: 3MB• Modules •console • sql •docgenerator • swing •groovydoc • servlet •groovysh • templates •ant • test •bsf • testng •jsr-223 • json •jmx • xml 33
  73. 73. Extension modules• Create your own module •contribute instance extension methodspackage  fooclass  StringExtension  {        static  introduce(String  self,  String  name)  {                "Hi  ${name),  I’m  ${self}"        }}//  usage:  "Guillaume".introduce("Cédric") 34
  74. 74. Extension modules• Create your own module •contribute instance extension methods Same structure as Categoriespackage  fooclass  StringExtension  {        static  introduce(String  self,  String  name)  {                "Hi  ${name),  I’m  ${self}"        }}//  usage:  "Guillaume".introduce("Cédric") 34
  75. 75. Extension modules• Create your own module •contribute class extension methods package  foo class  StaticStringExtension  {        static  hi(String  self)  {                "Hi!"        } } //  usage:  String.hi() 35
  76. 76. Extension module descriptor• Descriptor in: META-INF/services/ org.codehaus.groovy.runtime.ExtensionModulemoduleName  =  stringExtensionsmoduleVersion  =  1.0//  comma-­‐separated  list  of  classesextensionClasses  =  foo.StringExtension//  comma-­‐separated  list  of  classesstaticExtensionClasses  =  foo.StaticStringExtension 36
  77. 77. Java 7 / JDK 7• Project Coin and InvokeDynamic 37
  78. 78. Binary literals• We had decimal, octal and hexadecimal notations for number literals• We can now use binary representations too int  x  =  0b10101111 assert  x  ==  175   byte  aByte  =  0b00100001 assert  aByte  ==  33   int  anInt  =  0b1010000101000101 assert  anInt  ==  41285 38
  79. 79. Underscore in literals• Now we can also add underscores in number literals for more readability long  creditCardNumber  =  1234_5678_9012_3456L long  socialSecurityNumbers  =  999_99_9999L float  monetaryAmount  =  12_345_132.12 long  hexBytes  =  0xFF_EC_DE_5E long  hexWords  =  0xFFEC_DE5E long  maxLong  =  0x7fff_ffff_ffff_ffffL long  alsoMaxLong  =  9_223_372_036_854_775_807L long  bytes  =  0b11010010_01101001_10010100_10010010 39
  80. 80. Multicatch• One block for multiple exception caught •rather than duplicating the block try  {        /*  ...  */ }  catch(IOException  |  NullPointerException  e)  {        /*  one  block  to  treat  2  exceptions  */ } 40
  81. 81. InvokeDynamic• Groovy 2.0 supports JDK 7’s invokeDynamic • compiler has a flag for compiling against JDK 7 • might use the invokeDynamic backport for < JDK 7• Benefits • more runtime performance! • at least as fast as current «dynamic» Groovy •in the long run, will allow us to get rid of code! • call site caching, thanks to MethodHandles • metaclass registry, thanks to ClassValues • will let the JIT inline calls more easily 41
  82. 82. Yourturn! 42
  83. 83. Static Type Checking• Goal: make the Groovy compiler «grumpy»! • and throw compilation errors (not at runtime)• Not everybody needs dynamic features all the time • think Java libraries scripting• Grumpy should... • tell you about your method or variable typos • complain if you call methods that don’t exist • shout on assignments of wrong types • infer the types of your variables • figure out GDK methods • etc... 43
  84. 84. Typos in a vars or methodsimport  groovy.transform.TypeChecked  void  method()  {}  @TypeChecked  test()  {        //  Cannot  find  matching  method  metthhoood()        metthhoood()          def  name  =  "Guillaume"        //  variable  naamme  is  undeclared        println  naamme} 44
  85. 85. Typos in a vars or methodsimport  groovy.transform.TypeChecked  void  method()  {}  @TypeChecked  test()  {        //  Cannot  find  matching  method  metthhoood()        metthhoood()          def  name  =  "Guillaume" Compilation        //  variable  naamme  is  undeclared errors!        println  naamme} 44
  86. 86. Typos in a vars or methods Annotation can be atimport  groovy.transform.TypeChecked class or method level  void  method()  {}  @TypeChecked  test()  {        //  Cannot  find  matching  method  metthhoood()        metthhoood()          def  name  =  "Guillaume" Compilation        //  variable  naamme  is  undeclared errors!        println  naamme} 44
  87. 87. Wrong assignments//  cannot  assign  value  of  type...  to  variable...int  x  =  new  Object()Set  set  =  new  Object()  def  o  =  new  Object()int  x  =  o  String[]  strings  =  [a,b,c]int  str  =  strings[0]  //  cannot  find  matching  method  plus()int  i  =  0i  +=  1 45
  88. 88. Wrong assignments//  cannot  assign  value  of  type...  to  variable...int  x  =  new  Object()Set  set  =  new  Object() Compilation   errors!def  o  =  new  Object()int  x  =  o  String[]  strings  =  [a,b,c]int  str  =  strings[0]  //  cannot  find  matching  method  plus()int  i  =  0i  +=  1 45
  89. 89. Wrong return types//  checks  if/else  branch  return  values@TypeCheckedint  method()  {        if  (true)  {  String  }        else  {  42  }}//  works  for  switch/case  &  try/catch/finally  //  transparent  toString()  implied@TypeCheckedString  greeting(String  name)  {        def  sb  =  new  StringBuilder()        sb  <<  "Hi  "  <<  name} 46
  90. 90. Wrong return types//  checks  if/else  branch  return  values@TypeCheckedint  method()  { Compilation        if  (true)  {  String  } error!        else  {  42  }}//  works  for  switch/case  &  try/catch/finally  //  transparent  toString()  implied@TypeCheckedString  greeting(String  name)  {        def  sb  =  new  StringBuilder()        sb  <<  "Hi  "  <<  name} 46
  91. 91. Type inference@TypeChecked  test()  {        def  name  =  "    Guillaume    "          //  String  type  infered  (even  inside  GString)        println  "NAME  =  ${name.toUpperCase()}"            //  Groovy  GDK  method  support        //  (GDK  operator  overloading  too)        println  name.trim()          int[]  numbers  =  [1,  2,  3]        //  Element  n  is  an  int        for  (int  n  in  numbers)  {                println  n        }} 47
  92. 92. Statically checked & dyn meth@TypeCheckedString  greeting(String  name)  {        //  call  method  with  dynamic  behavior        //  but  with  proper  signature        generateMarkup(name.toUpperCase())}  //  usual  dynamic  behaviorString  generateMarkup(String  name)  {        def  sw  =  new  StringWriter()        new  MarkupBuilder(sw).html  {                body  {                        div  name                }        }        sw.toString()} 48
  93. 93. Instanceof checks@TypeChecked  void  test(Object  val)  {        if  (val  instanceof  String)  {                println  val.toUpperCase()        }  else  if  (val  instanceof  Number)  {                println  "X"  *  val.intValue()        }} 49
  94. 94. Instanceof checks No need@TypeChecked   for castsvoid  test(Object  val)  {        if  (val  instanceof  String)  {                println  val.toUpperCase()        }  else  if  (val  instanceof  Number)  {                println  "X"  *  val.intValue()        }} 49
  95. 95. Instanceof checks No need @TypeChecked   for casts void  test(Object  val)  {        if  (val  instanceof  String)  {                println  val.toUpperCase()        }  else  if  (val  instanceof  Number)  {                println  "X"  *  val.intValue()        } } Can call String#multiply(int)from the Groovy Development Kit 49
  96. 96. Lowest Upper Bound• Represents the lowest «super» type classes have in common •may be virtual (aka «non-denotable») @TypeChecked  test()  {        //  an  integer  and  a  BigDecimal        return  [1234,  3.14] } 50
  97. 97. Lowest Upper Bound• Represents the lowest «super» type classes have in common •may be virtual (aka «non-denotable») @TypeChecked  test()  {        //  an  integer  and  a  BigDecimal        return  [1234,  3.14] } Inferred return type: List<Number & Comparable> 50
  98. 98. Lowest Upper Bound• Represents the lowest «super» type classes have in common •may be virtual (aka «non-denotable») @TypeChecked  test()  {        //  an  integer  and  a  BigDecimal        return  [1234,  3.14] } Inferred return type: List<Number & Comparable> 50
  99. 99. Flow typing• Static type checking shouldn’t complain even for bad coding practicies which work without type checks @TypeChecked  test()  {        def  var  =  123                  //  inferred  type  is  int        int  x  =  var                      //  var  is  an  int        var  =  "123"                      //  assign  var  with  a  String        x  =  var.toInteger()      //  no  problem,  no  need  to  cast        var  =  123        x  =  var.toUpperCase()  //  error,  var  is  int! } 51
  100. 100. Static checking vs dynamic• Type checking works at compile-time •adding @TypeChecked doesn’t change behavior • do not confuse with static compilation• Most dynamic features cannot be type checked •metaclass changes, categories •dynamically bound variables (ex: script’s binding)• However, compile-time metaprogramming works •as long as proper type information is defined 52
  101. 101. Runtime metaprogramming@TypeChecked  void  test()  {        Integer.metaClass.foo  =  {}        123.foo()} 53
  102. 102. Runtime metaprogramming@TypeChecked  void  test()  {        Integer.metaClass.foo  =  {}        123.foo()} Not allowed: metaClass property is dynamic 53
  103. 103. Runtime metaprogramming@TypeChecked  void  test()  {        Integer.metaClass.foo  =  {}        123.foo()} Method not Not allowed: recognized metaClass property is dynamic 53
  104. 104. Explicit type for closures@TypeChecked  test()  {        ["a",  "b",  "c"].collect  {                it.toUpperCase()  //  Not  OK        }}• A « Groovy Enhancement Proposal » to address the issue 54
  105. 105. Explicit type for closures@TypeChecked  test()  {        ["a",  "b",  "c"].collect  {  String  it  -­‐>                it.toUpperCase()  //  OK,  it’s  a  String        }}• A « Groovy Enhancement Proposal » to address the issue 54
  106. 106. Closure shared variables@TypeChecked  test()  {        def  var  =  "abc"                      def  cl  =  {  var  =  new  Date()  }        cl()        var.toUpperCase()    //  Not  OK!} 55
  107. 107. Closure shared variables var assigned in the closure: «shared closure variable»@TypeChecked  test()  {        def  var  =  "abc"                      def  cl  =  {  var  =  new  Date()  }        cl()        var.toUpperCase()    //  Not  OK!} 55
  108. 108. Closure shared variables var assigned in the closure: «shared closure variable» @TypeChecked  test()  { Impossible to        def  var  =  "abc"               ensure the        def  cl  =  {  var  =  new  Date()  } assignment        cl()really happens        var.toUpperCase()    //  Not  OK! } 55
  109. 109. Closure shared variables var assigned in the closure: «shared closure variable» @TypeChecked  test()  { Impossible to        def  var  =  "abc"               ensure the        def  cl  =  {  var  =  new  Date()  } assignment        cl()really happens        var.toUpperCase()    //  Not  OK! } Only methods of the most specific compatible type (LUB) are allowed by the type checker 55
  110. 110. Closure shared variablesclass  A                      {  void  foo()  {}  }class  B  extends  A  {  void  bar()  {}  }@TypeChecked  test()  {        def  var  =  new  A()        def  cl  =  {  var  =  new  B()  }        cl()        var.foo()      //  OK!} 56
  111. 111. Closure shared variablesclass  A                      {  void  foo()  {}  }class  B  extends  A  {  void  bar()  {}  }@TypeChecked  test()  {        def  var  =  new  A()        def  cl  =  {  var  =  new  B()  }        cl()        var.foo()      //  OK!} var is at least an instance of A 56
  112. 112. Static Compilation• Given your Groovy code can be type checked... we can as well compile it «statically» • ie. generate the same byte code as javac• Also interesting for those stuck in JDK < 7 to benefit from performance improvements 57
  113. 113. Advantages• You gain: • Type safety • thanks to static type checking • static compilation builds upon static type checking • Faster code • as close as possible to Java’s performance • Code immune to «monkey patching» • metaprogramming badly used can interfere with framework code • Smaller bytecode size 58
  114. 114. Disadvantages• But you loose: • Dynamic features •metaclass changes, categories, etc. • Dynamic method dispatch •although as close as possible to «dynamic» Groovy 59
  115. 115. Statically compiled & dyn meth@CompileStaticString  greeting(String  name)  {        //  call  method  with  dynamic  behavior        //  but  with  proper  signature        generateMarkup(name.toUpperCase())}  //  usual  dynamic  behaviorString  generateMarkup(String  name)  {        def  sw  =  new  StringWriter()        new  MarkupBuilder(sw).html  {                body  {                        div  name                }        }        sw.toString()} 60
  116. 116. What about performance?• Comparisons between: • Java • Groovy static compilation (Groovy 2.0) • Groovy with primitive optimizations (Groovy 1.8+) • Groovy without optimizations (Groovy 1.7) 61
  117. 117. What about performance? Pi (π) Binary Fibonacci quadrature trees Java 188 ms 97 ms 3.6 s Static1.7 1.8 2.0 compilation 202 ms 101 ms 4.4 s Primitive optimizations 360 ms 111 ms 23.7 s No prim. optimizations 2590 ms 3220 ms 50.0 s 62
  118. 118. Summary• Main themes of the Groovy 2.0 release •Modularity • Embark the JDK 7 enhancements •Project Coin •Invoke Dynamic • Static aspects • Static type checking • Static compilation 63
  119. 119. 64
  120. 120. Thank you! e eL aforg pmentGu illaum ovy Develo roHe ad of G om gmail.c au e@ glaforg rge Ch ampe itter Email: @glafo rge édric ore Comm : .t o/glafo m C Twitter : http://gplus spot.co Groov yC gmail.c om + pp Google p://glaforge.a au@ hampe peau tt ric.c Blog: h ail: ced edriccham eau Em :@ c to/cchamp Twitter : http://gplus. melix + / Google p://jroller.com tt Blog: h 65
  121. 121. Questions & Answers• Got questions, really? Q&A 66
  122. 122. Image credits• Bugs bunny: http://storage.canalblog.com/63/56/517188/47634843.jpeg• Pills: http://www.we-ew.com/wp-content/uploads/2011/01/plan-b-pills.jpg• Chains: http://2.bp.blogspot.com/-GXDVqUYSCa0/TVdBsON4tdI/AAAAAAAAAW4/EgJOUmAxB28/s1600/breaking-chains5_copy9611.jpg• Slurp: http://www.ohpacha.com/218-532-thickbox/gamelle-slurp.jpg• Grumpy: http://mafeuilledechou.fr/__oneclick_uploads/2010/05/grumpy.jpg• Modularity: http://php.jglobal.com/blog/wp-content/uploads/2009/11/modularity.jpg• Agenda: http://www.plombiereslesbains.fr/images/stories/agenda.jpg• Java 7: http://geeknizer.com/wp-content/uploads/java7.jpg• Road Runner: http://newspaper.li/static/4ada046b7772f0612fec4e3840142308.jpg• Porky: http://joshuadsandy.files.wordpress.com/2011/05/porky-pig-5.jpg• Will E help: http://www.clipart-fr.com/data/clipart/looney/looney_004.jpg• Coyote road runner: http://www.jenkle.com/wp-content/uploads/2010/12/coyote-wallpaper1.jpg• Around the corner: http://3.bp.blogspot.com/-wvfO5NUbi8Q/TzBqTh4SOsI/AAAAAAAADOg/lRE9XVHGiOc/s1600/around-the-corner_large.jpg• Lube: http://images.motorcycle-superstore.com/ProductImages/OG/0000_Motul_Chain_Lube_Road_--.jpg 67
  123. 123. Groovy 1.8 AST Transform @Grab 1 // methods with multiple arguments (commas) 2 take coffee  with sugar, milk  and liquor 3 4 // leverage named-args as punctuation 5 check that: margarita  tastes good 6 7 // closure parameters for new control structures 8 given {}  when {}  then {} 910 // zero-arg methods require parens11 select all  unique() from names1213 // possible with an odd number of terms14 take 3  cookies
  124. 124. Groovy 1.8 AST Transform @Grab 1 // methods with multiple arguments (commas) 2 take coffee  with sugar, milk  and liquor 3 4 // leverage named-args as punctuation 5 check that: margarita  tastes good Need parens 6 7 // closure parameters for new control there! structures 8 given {}  when {}  then {} 910 // zero-arg methods require parens11 select all  unique() from names1213 // possible with an odd number of terms14 take 3  cookies
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×