Your SlideShare is downloading. ×
0
to Infinity
                       and Beyond
mercredi 19 mai 2010
to infinity
                               and beyond!


                       Guillaume Laforge
                       S...
Guillaume Laforge
            Groovy Project Manager
                   on Groovy since 2003!
            JSR-241 Spec Lea...
Agenda
            Past
                   Groovy 1.6 flashback


            Present
                   Groovy 1.7 novelti...
looking into the Past
mercredi 19 mai 2010
Big highlights of Groovy 1.6
            Greater compile-time and runtime performance
            Multiple assignments
   ...
Multiple assignement
                       // multiple assignment
                       def (a, b) = [1, 2]
            ...
More optional return
                       // optional return for if statements
                       def m1() {
       ...
AST Transformation (1/2)
            Groovy 1.6 introduced AST Transformations
            AST: Abstract Syntax Tree
     ...
AST Transformations (2/2)
            Transformations introduced in 1.6
                   @Singleton
                   @...
@Immutable
            To properly implement immutable classes
                   No mutations — state musn’t change
     ...
Grab a grape!
            Simple distribution and sharing of Groovy scripts
            Dependencies stored locally
      ...
Metaprogramming additions (1/2)
            ExpandoMetaClass DSL
                   factoring EMC changes


              ...
Metaprogramming additions (2/2)
            Runtime mixins
                       class FlyingAbility {
                  ...
JMX Builder
            A DSL for handling JMX
                   in addition of Groovy MBean
                         // ...
into the Present...
mercredi 19 mai 2010
Big highlights of Groovy 1.7
            Anonymous Inner Classes and Nested Classes
            Annotations anywhere
     ...
AIC and NC
            Anonymous Inner Classe and Nested Classes




mercredi 19 mai 2010
AIC and NC
            Anonymous Inner Classe and Nested Classes



                         For J  ava
                  ...
Annonymous Inner Classes
                       bo olean called = false
                       Timer ti mer = new Timer()
...
Annonymous Inner Classes
                       bo olean called = false
                       Timer ti mer = new Timer()
...
Nested Classes

                       class Environment {
                           static class Production
            ...
Anotations anywhere

            You can now put annotations
                   on imports
                   on packages
...
Grape improvements (1/3)
            @Grab on import

                       @Grab(group = 'net.sf.json‐lib', 
           ...
Grape improvements (2/3)
            Shorter module / artifact / version parameter
                   Example of an annota...
Grape improvements (3/3)
            Groovy 1.7 introduced Grab resolver
                   For when you need to specify a...
Power Asserts (1/2)
            Much better assert statement!
                   Invented and developed in the Spock frame...
Power Asserts (2/2)
            You’ll get a more comprehensible output




mercredi 19 mai 2010
Spock testing
                        framework
mercredi 19 mai 2010
Easier AST Transformations
            AST Transformations are a very powerful feature
            But are still rather ha...
AST Viewer




mercredi 19 mai 2010
AST Builder
              // Ability to build AST parts
              // ‐‐> from a String
              new AstBui lder()...
Customize the Groovy Truth!
            Ability to customize the truth by implementing a
            boolean asBoolean() m...
SQL support refinements
           // batch statements
           sql.withBatch { stmt ‐>
                                 ...
Groovy 1.7.x changes

            Groovy 1.7.1 and 1.7.2 have been released
            Groovy 1.7.3 is coming soon

     ...
Map improvements
            // map auto‐vification
            def m = [:].withDefault { key ‐> "Default" }
            a...
XML back to String
            Ability to retrieve the XML string from a node
            from an XmlSlurper GPathResult
 ...
Currying improvements
          // right currying
          def divide = { a, b ‐> a / b }
          def halver = divide.r...
New icon for the Swing console




mercredi 19 mai 2010
New icon for the Swing console




mercredi 19 mai 2010
New String methods
                  println """                            println """
                      def method()...
...and beyond!
mercredi 19 mai 2010
Groovy 1.8 & beyond
            Still subject to discussion
            Always evolving roadmap
            Things may cha...
What’s cooking?
mercredi 19 mai 2010
What we’re working on
            More runtime performance improvements
            Closure annotations
            Gradle...
«Blackdrag»
 revealed
 the black magic!




mercredi 19 mai 2010
Closure annotations
            Groovy 1.5 brought Java 5 annotations
            What if... we could go beyond what Java ...
GContracts
            Closures are already allowed in the Groovy 1.7
            Antlr grammar
                   Andre S...
mercredi 19 mai 2010
mercredi 19 mai 2010
bu ild
                                dh oc     oo vy
                           ore a lar Gr
                         M ...
More modular build
            «Not everybody needs everything!» ™

            A lighter Groovy-core
                   w...
Java 7 / JDK 7 / Project Coin
            JSR-292 InvokeDynamic
            Simple Closures?
            Proposals from Pr...
Improved DSL support

            GEP-3: an extended command expression DSL
                   Groovy Extension Proposal #...
Before GEP-3
            The idea: extend command-expressions, beyond
            top-level statements, for chained method...
With GEP-3
            The idea: extend command-expressions, beyond
            top-level statements, for chained method c...
With GEP-3
            The idea: extend command-expressions, beyond
            top-level statements, for chained method c...
AST Templates
            Since AST, it’s easier to write AST Transformations
                   But we can even do better...
a new
    MOP


mercredi 19 mai 2010
Towards a new MOP?
            The Meta-Object Protocol show its age
                   different stratification layers
   ...
Some potential modules
            GPars was considered a potential module for
            addition into core
            ...
Summary (1/2)
            No need to wait for Java 7, 8, 9...
                   closures, properties, interpolated string...
Summary (1/2)
            No need to wait for Java 7, 8, 9...
                   closures, properties, interpolated string...
Summary (2/2)
            But it’s more than just a language, it’s a very rich
            and active ecosystem!
         ...
Thanks for your attention!



                                           e
                                      aforg pme...
Questions & Answers




mercredi 19 mai 2010
Images used in this presentation
            House / past: http://www.flickr.com/photos/jasonepowell/3680030831/sizes/o/
  ...
Upcoming SlideShare
Loading in...5
×

Groovy to infinity and beyond - GR8Conf Europe 2010 - Guillaume Laforge

1,686

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,686
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
29
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Groovy to infinity and beyond - GR8Conf Europe 2010 - Guillaume Laforge"

  1. 1. to Infinity and Beyond mercredi 19 mai 2010
  2. 2. to infinity and beyond! Guillaume Laforge SpringSource, a division of VMWare mercredi 19 mai 2010
  3. 3. Guillaume Laforge Groovy Project Manager on Groovy since 2003! JSR-241 Spec Lead Head of Groovy Development at SpringSource (division of VMWare) Initiator of the Grails framework Creator of the Gaelyk toolkit Co-author of Groovy in Action International speaker mercredi 19 mai 2010
  4. 4. Agenda Past Groovy 1.6 flashback Present Groovy 1.7 novelties A few Groovy 1.7.x refinements Future What’s cooking for 1.8 and beyond mercredi 19 mai 2010
  5. 5. looking into the Past mercredi 19 mai 2010
  6. 6. Big highlights of Groovy 1.6 Greater compile-time and runtime performance Multiple assignments Optional return for if/else and try/catch/finally Java 5 annotation definition AST Transformations The Grape module and dependency system Various Swing related improvements JMX Builder Metaprogramming additions JSR-223 scripting engine built-in Out-of-the-box OSGi support mercredi 19 mai 2010
  7. 7. Multiple assignement // multiple assignment def (a, b) = [1, 2] assert a == 1 && b == 2   // with typed variables def (int c, String d) = [3, "Hi"] assert c == 3 && d == "Hi"   def geocode(String place) { [48.8, 2.3] } def lat, lng // assignment to existing variables (lat, lng) = geocode('Paris')   // classical variable swaping example (a, b) = [b, a] mercredi 19 mai 2010
  8. 8. More optional return // optional return for if statements def m1() {     if (true) 1     else 0 } assert m1() == 1   // optional return for try/catch/finally def m2(bool) {     try {         if (b) throw new Exception()         1     } catch (any) { 2 }     finally { 3 } } assert m2(true) == 2 && m2(false) == 1 mercredi 19 mai 2010
  9. 9. AST Transformation (1/2) Groovy 1.6 introduced AST Transformations AST: Abstract Syntax Tree Ability to change what’s being compiled by the Groovy compiler... at compile time No runtime impact! Change the semantics of your programs! Even hijack the Groovy syntax! Implementing recurring patterns in your code base Remove boiler-plate code Two kinds: global and local (triggered by anno) mercredi 19 mai 2010
  10. 10. AST Transformations (2/2) Transformations introduced in 1.6 @Singleton @Immutable, @Lazy, @Delegate @Newify @Category, @Mixin @PackageScope Swing’s @Bindable and @Vetoable Grape’s own @Grab mercredi 19 mai 2010
  11. 11. @Immutable To properly implement immutable classes No mutations — state musn’t change Private final fields Defensive copying of mutable components Proper equals() / hashCode() / toString() for comparisons or fas keys in maps @Immutable class Coordinates {     Double lat, lng } def c1 = new Coordinates(lat: 48.8, lng: 2.5) def c2 = new Coordinates(48.8, 2.5) assert c1 == c2 mercredi 19 mai 2010
  12. 12. Grab a grape! Simple distribution and sharing of Groovy scripts Dependencies stored locally Can even use your own local repositories @Grab(group   = 'org.mortbay.jetty',       module  = 'jetty‐embedded',       version = '6.1.0') def startServer() {     def srv = new Server(8080) SIONS)     def ctx = new Context(srv , "/", SES     ctx.resourceBase = "." ovy")      ctx.addServlet(GroovyServlet, "*.gro     srv.start() } mercredi 19 mai 2010
  13. 13. Metaprogramming additions (1/2) ExpandoMetaClass DSL factoring EMC changes Number.metaClass {     multiply { Amount amount ‐>          amount.times(delegate)      }     div { Amount amount ‐>          amount.inverse().times(delegate)      } } mercredi 19 mai 2010
  14. 14. Metaprogramming additions (2/2) Runtime mixins class FlyingAbility {     def fly() { "I'm ${name} and I fly!" } }   class JamesBondVehicle {     String getName() { "James Bond's vehicle" } }   JamesBondVehicle.mixin FlyingAbility   assert new JamesBondVehicle().fly() ==     "I'm James Bond's vehicle and I fly!" mercredi 19 mai 2010
  15. 15. JMX Builder A DSL for handling JMX in addition of Groovy MBean // Create a connector server def jmx = new JmxBuilder() jmx.connectorServer(port:9000).start()   // Create a connector client jmx.connectorClient(port:9000).connect()   //Export a bean jmx.export { bean new MyService() }   // Defining a timer jmx.timer(name: "jmx.builder:type=Timer",      event: "heartbeat", period: "1s").start()   // JMX listener jmx.listener(event: "someEvent", from: "bean",      call: { evt ‐> /* do something */ }) mercredi 19 mai 2010
  16. 16. into the Present... mercredi 19 mai 2010
  17. 17. Big highlights of Groovy 1.7 Anonymous Inner Classes and Nested Classes Annotations anywhere Grape improvements Power Asserts AST Viewer AST Builder Customize the Groovy Truth! Rewrite of the GroovyScriptEngine Groovy Console improvements SQL support refinements mercredi 19 mai 2010
  18. 18. AIC and NC Anonymous Inner Classe and Nested Classes mercredi 19 mai 2010
  19. 19. AIC and NC Anonymous Inner Classe and Nested Classes For J ava pa ste co py’n pa tibi lity com sak e :-) mercredi 19 mai 2010
  20. 20. Annonymous Inner Classes bo olean called = false Timer ti mer = new Timer() timer.schedule(n ew TimerTask() {     void run() {          called = true     } }, 0) sleep 100 assert called mercredi 19 mai 2010
  21. 21. Annonymous Inner Classes bo olean called = false Timer ti mer = new Timer() timer.schedule(n ew TimerTask() {     void run() {          called = true     } { called = true } }, 0) as TimerTask sleep 100 assert called mercredi 19 mai 2010
  22. 22. Nested Classes class Environment {     static class Production          extends Environment {}     static class Development          extends Environment {} }   new Environment.Production() mercredi 19 mai 2010
  23. 23. Anotations anywhere You can now put annotations on imports on packages on variable declarations Examples with @Grab following... mercredi 19 mai 2010
  24. 24. Grape improvements (1/3) @Grab on import @Grab(group = 'net.sf.json‐lib',       module = 'json‐lib',      version = '2.3',  classifier = 'jdk15') import net.sf.json.groovy.*   assert new JsonSlurper().parseText( new JsonGroovyBuilder().json {     book(title: "Groovy in Action",          author:"Dierk König et al") ion" }.toString()).book.title == "Groovy in Act mercredi 19 mai 2010
  25. 25. Grape improvements (2/3) Shorter module / artifact / version parameter Example of an annotation on a variable declaration @Grab('net.sf.json‐lib:json‐lib:2.3:jdk15') () def builder = new net.sf.json.groovy.JsonGroovyBuilder def books = builder.books { nig")     book(title: "Groovy in Action", author: "Dierk Koe } assert books.toString() ==     '{"books":{"book":{"title":"Groovy in Action",' +      '"author":"Dierk Koenig"}}}''' mercredi 19 mai 2010
  26. 26. Grape improvements (3/3) Groovy 1.7 introduced Grab resolver For when you need to specify a specific repository for a given dependency @GrabResolver(     name = 'restlet.org',     root = 'http://maven.restlet.org') @Grab('org.restlet:org.restlet:1.1.6') import org.restlet.Restlet mercredi 19 mai 2010
  27. 27. Power Asserts (1/2) Much better assert statement! Invented and developed in the Spock framework Given this script... def energy = 7200 * 10**15 + 1 def mass = 80 def celerity = 300000000   assert energy == mass * celerity ** 2 mercredi 19 mai 2010
  28. 28. Power Asserts (2/2) You’ll get a more comprehensible output mercredi 19 mai 2010
  29. 29. Spock testing framework mercredi 19 mai 2010
  30. 30. Easier AST Transformations AST Transformations are a very powerful feature But are still rather hard to develop Need to know the AST API closely To help with authoring your own transformations, we’ve introduced the AST Viewer in the Groovy Console the AST Builder mercredi 19 mai 2010
  31. 31. AST Viewer mercredi 19 mai 2010
  32. 32. AST Builder // Ability to build AST parts // ‐‐> from a String new AstBui lder().buildFromString(''' "Hello" ''')   // ‐‐> from code new AstBuilder().buildFromCode { "Hello" }   // ‐‐> from a specification  { List<ASTNo de> nodes = new AstBuilder().buildFromSpec     block {         returnStatement {             constant "Hello"         }     } } mercredi 19 mai 2010
  33. 33. Customize the Groovy Truth! Ability to customize the truth by implementing a boolean asBoolean() method class Predicate {     boolean value     boolean asBoolean() { value } }   def tr uePred  = new Predicate(value: true) def fals ePred = new Predicate(value: false)   assert truePred && !falsePred mercredi 19 mai 2010
  34. 34. SQL support refinements // batch statements sql.withBatch { stmt ‐> e ‐> ["Paul", "Jochen", "Guillaume"].each { nam e)"  stmt.addBat ch "insert into PERSON (name) values ($nam } }   // transaction support def persons = sql.dataSet("person") sql.withTransaction {   persons.add name: "Paul"   persons.add name: "Jochen"   persons.add name: "Guillaume"   persons.add name: "Roshan" } mercredi 19 mai 2010
  35. 35. Groovy 1.7.x changes Groovy 1.7.1 and 1.7.2 have been released Groovy 1.7.3 is coming soon Here’s what’s new! mercredi 19 mai 2010
  36. 36. Map improvements // map auto‐vification def m = [:].withDefault { key ‐> "Default" } assert m['z'] == "Default"  assert m['a'] == "Default" // default sort m.sort() // sort with a comparator m.sort({ a, b ‐> a <=> b } as Comparator) mercredi 19 mai 2010
  37. 37. XML back to String Ability to retrieve the XML string from a node from an XmlSlurper GPathResult def xml = """ <books>      <book isbn="12345">Groovy in Action</book> </books> """ def root = new XmlSlurper().parseText(xml) def someNode = root.book def bu ilder = new StreamingMarkupBuilder() assert build er.bindNode(someNode).toString() ==         "<book  isbn='12345'>Groovy in Action</book>" mercredi 19 mai 2010
  38. 38. Currying improvements // right currying def divide = { a, b ‐> a / b } def halver = divide.rcurry(2) assert halver(8) == 4   // currying n‐th parameter def jo inWithSeparator = { one, sep, two ‐>     one + sep + two } def joinWithComma =      jo inWithSeparator.ncurry(1, ', ') assert joinWithComma('a', 'b') == 'a, b' mercredi 19 mai 2010
  39. 39. New icon for the Swing console mercredi 19 mai 2010
  40. 40. New icon for the Swing console mercredi 19 mai 2010
  41. 41. New String methods println """ println """     def method() {     |def method() {         return 'bar'     |    return 'bar'     }     |} """.stripIndent() """.stripMargin('|') // string "translation" (UNIX tr) assert 'hello'.tr('z‐a', 'Z‐A') == 'HELLO'  WAAAA!' asse rt 'Hello World!'.tr('a‐z', 'A') == 'HAAAA 2d!' assert 'Hell o World!'.tr('lloo', '1234') == 'He224 W4r // capitalize the first letter assert 'h'.capitalize() == 'H' assert 'hello'.capitalize() == 'Hello' rld' asse rt 'hello world'.capitalize() == 'Hello wo mmand) // tab/space (un)expansion (UNIX expand co 7 8        ' assert '1234567t8t '.expand() == '123456 ' assert '    x    '.unexpand() == '    xt  mercredi 19 mai 2010
  42. 42. ...and beyond! mercredi 19 mai 2010
  43. 43. Groovy 1.8 & beyond Still subject to discussion Always evolving roadmap Things may change! mercredi 19 mai 2010
  44. 44. What’s cooking? mercredi 19 mai 2010
  45. 45. What we’re working on More runtime performance improvements Closure annotations Gradle build Modularizing Groovy Align with JDK 7 / Java 7 / Project Coin Enhanced DSL support AST Templates Towards MOP 2 mercredi 19 mai 2010
  46. 46. «Blackdrag» revealed the black magic! mercredi 19 mai 2010
  47. 47. Closure annotations Groovy 1.5 brought Java 5 annotations What if... we could go beyond what Java offered? In 1.7, we can put annotations on packages, imports and variable declarations But annotations are still limited in terms of parameters they allow Here comes closure annotations! Groovy 1.8 will give us the ability to access annotation with closure parameters at runtime mercredi 19 mai 2010
  48. 48. GContracts Closures are already allowed in the Groovy 1.7 Antlr grammar Andre Steingreß created GContracts, a «design by contract» module // a class invariant @I nvariant({ name.size() > 0 && age > ageLimit() })   // a method pre‐condition @Requires({ message != null })   // a method post‐condition @Ensures({ returnResult % 2 == 0 }) mercredi 19 mai 2010
  49. 49. mercredi 19 mai 2010
  50. 50. mercredi 19 mai 2010
  51. 51. bu ild dh oc oo vy ore a lar Gr M du s! o e m rom H an Mor ef M or mercredi 19 mai 2010
  52. 52. More modular build «Not everybody needs everything!» ™ A lighter Groovy-core what’s in groovy-all? Modules test, jmx, swing, xml, sql, web, template integration (bsf, jsr-223) tools (groovydoc, groovyc, shell, console, java2groovy) mercredi 19 mai 2010
  53. 53. Java 7 / JDK 7 / Project Coin JSR-292 InvokeDynamic Simple Closures? Proposals from Project Coin Strings in switch Automatic Resource Management Improved generics type inference (diamond <>) Simplified varargs method invocation Better integral literals Language support for collections mercredi 19 mai 2010
  54. 54. Improved DSL support GEP-3: an extended command expression DSL Groovy Extension Proposal #3 A Google Summer of Code student will work on that Command expressions basically top-level statements without parens combine named and non-named arguments in the mix for nicer Domain-Specific Languages mercredi 19 mai 2010
  55. 55. Before GEP-3 The idea: extend command-expressions, beyond top-level statements, for chained method calls Before send("Hello").to("Jochen") send("Hello", from: "Guillaume").to("Jochen") sell(100.shares).of(MSFT) take(2.pills).of(chloroquinine).in(6.hours) every(10.minutes).execute {  } given { }.when { }.then { } blend(red, green).of(acrylic) mercredi 19 mai 2010
  56. 56. With GEP-3 The idea: extend command-expressions, beyond top-level statements, for chained method calls After send "Hello"  to "Jochen" send "Hello", from: "Guillaume"  to "Jochen" sell 100.shares  of MSFT take 2.pills  of chloroquinine  in 6.hours every 10.minutes  execute {  } given { } when { } then { } blend red, green  of acrylic mercredi 19 mai 2010
  57. 57. With GEP-3 The idea: extend command-expressions, beyond top-level statements, for chained method calls After send "Hello"  to "Jochen" send "Hello", from: "Guillaume"  to "Jochen" sell 100.shares  of MSFT Less pare take 2.pills  of chloroquinine  in 6.hours & co ns every 10.minutes  execute {  } mm given { } when { } then { } as blend red, green  of acrylic mercredi 19 mai 2010
  58. 58. AST Templates Since AST, it’s easier to write AST Transformations But we can even do better! Hamlet D’Arcy is working on a new proposal GEP-4 — AST Templates mercredi 19 mai 2010
  59. 59. a new MOP mercredi 19 mai 2010
  60. 60. Towards a new MOP? The Meta-Object Protocol show its age different stratification layers DGM, categories, custom MetaClasses, ExpandoMetaClass... different characteristics scope: global, local, thread-bound works across the hierarchy or not A better MOP could... help for performance offer more granularity let the developer choose the characteristics he needs provide a layered approach of changes mercredi 19 mai 2010
  61. 61. Some potential modules GPars was considered a potential module for addition into core but got a life of its own! Parser combinators for when you hit the walls of the Groovy syntax and AST transformations won’t cut it Pattern matching mercredi 19 mai 2010
  62. 62. Summary (1/2) No need to wait for Java 7, 8, 9... closures, properties, interpolated strings, extended annotations, metaprogramming, [YOU NAME IT]... mercredi 19 mai 2010
  63. 63. Summary (1/2) No need to wait for Java 7, 8, 9... closures, properties, interpolated strings, extended annotations, metaprogramming, [YOU NAME IT]... oov y’s Gr ive no vat sti ll in 20 03! si nce mercredi 19 mai 2010
  64. 64. Summary (2/2) But it’s more than just a language, it’s a very rich and active ecosystem! Grails, Griffon, Gradle, GPars, Spock, Gaelyk... mercredi 19 mai 2010
  65. 65. Thanks for your attention! e aforg pment ume L Develo Guilla Groovy om He ad of e@ gmail.c glaforg rge Email: @glafo : Twitter mercredi 19 mai 2010
  66. 66. Questions & Answers mercredi 19 mai 2010
  67. 67. Images used in this presentation House / past: http://www.flickr.com/photos/jasonepowell/3680030831/sizes/o/ Present clock: http://www.flickr.com/photos/38629278@N04/3784344944/sizes/o/ Future: http://www.flickr.com/photos/befuddledsenses/2904000882/sizes/l/ Cooking: http://www.flickr.com/photos/eole/449958332/sizes/l/ Black dragon: http://www.free-computer-wallpapers.com/pictures/Fantasy-wallpaper/Black_Dragon Puzzle: http://www.everystockphoto.com/photo.php?imageId=263521 Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png Spock: http://altoladeira.files.wordpress.com/2009/07/spock2.jpg mercredi 19 mai 2010
  1. A particular slide catching your eye?

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

×