SlideShare une entreprise Scribd logo
1  sur  93
Télécharger pour lire hors ligne
jeudi 16 décembre 2010
jeudi 16 décembre 2010
State
jeudi 16 décembre 2010
                         of the   Union
State
jeudi 16 décembre 2010
                         of the   Union
Guillaume Laforge / @glaforge

       • Groovy Project Manager
       • Head of Groovy Development
         at SpringSource
       • Initiator of the Grails framework
       • Founder of the Gaelyk toolkit
       • Co-author of Groovy in Action
       • Member of «Les Cast Codeurs» podcast

       • Speaker: JavaOne, QCon, JavaZone, Sun TechDays,
         Devoxx, The Spring Experience, SpringOne2GX,
         JAX, Dynamic Language World, IJTC, and more...

    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   2
jeudi 16 décembre 2010
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




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   3
jeudi 16 décembre 2010
But first... some figures...
          Downloads                      Moving Average (year)
                                                                                          Groovy downloads per month
   200000




   150000




   100000




    50000




         0
             déc.-07    févr.-08     avr.-08     juin-08    août-08      oct.-08     janv.-09   mars-09      mai-09      juil.-09   sept.-09   nov.-09   janv.-10   mars-10   mai-10   juil.-10



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                                                            4
jeudi 16 décembre 2010
But first... some figures...
          Downloads                      Moving Average (year)
                                                                                          Groovy downloads per month
   200000




   150000




   100000




    50000




         0
             déc.-07    févr.-08     avr.-08     juin-08    août-08      oct.-08     janv.-09   mars-09      mai-09      juil.-09   sept.-09   nov.-09   janv.-10   mars-10   mai-10   juil.-10



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                                                            4
jeudi 16 décembre 2010
But first... some figures...
          Downloads                      Moving Average (year)
                                                                                          Groovy downloads per month
   200000




   150000




   100000




    50000

      Groovy 1.5


         0
             déc.-07    févr.-08     avr.-08     juin-08    août-08      oct.-08     janv.-09   mars-09      mai-09      juil.-09   sept.-09   nov.-09   janv.-10   mars-10   mai-10   juil.-10



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                                                            4
jeudi 16 décembre 2010
But first... some figures...
          Downloads                      Moving Average (year)
                                                                                          Groovy downloads per month
   200000




   150000




   100000




    50000

      Groovy 1.5


         0
             déc.-07    févr.-08     avr.-08     juin-08    août-08      oct.-08     janv.-09   mars-09      mai-09      juil.-09   sept.-09   nov.-09   janv.-10   mars-10   mai-10   juil.-10



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                                                            4
jeudi 16 décembre 2010
But first... some figures...
          Downloads                      Moving Average (year)
                                                                                          Groovy downloads per month
   200000




   150000




   100000




                                                  G2One
                                               acquisition
    50000

      Groovy 1.5


         0
             déc.-07    févr.-08     avr.-08     juin-08    août-08      oct.-08     janv.-09   mars-09      mai-09      juil.-09   sept.-09   nov.-09   janv.-10   mars-10   mai-10   juil.-10



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                                                            4
jeudi 16 décembre 2010
But first... some figures...
          Downloads                      Moving Average (year)
                                                                                          Groovy downloads per month
   200000




   150000




   100000




                                                  G2One
                                               acquisition
    50000

      Groovy 1.5


         0
             déc.-07    févr.-08     avr.-08     juin-08    août-08      oct.-08     janv.-09   mars-09      mai-09      juil.-09   sept.-09   nov.-09   janv.-10   mars-10   mai-10   juil.-10



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                                                            4
jeudi 16 décembre 2010
But first... some figures...
          Downloads                      Moving Average (year)
                                                                                          Groovy downloads per month
   200000




                                                                                       Groovy 1.6

   150000




   100000




                                                  G2One
                                               acquisition
    50000

      Groovy 1.5


         0
             déc.-07    févr.-08     avr.-08     juin-08    août-08      oct.-08     janv.-09   mars-09      mai-09      juil.-09   sept.-09   nov.-09   janv.-10   mars-10   mai-10   juil.-10



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                                                            4
jeudi 16 décembre 2010
But first... some figures...
          Downloads                      Moving Average (year)
                                                                                          Groovy downloads per month
   200000




                                                                                       Groovy 1.6

   150000




   100000




                                                  G2One
                                               acquisition
    50000

      Groovy 1.5


         0
             déc.-07    févr.-08     avr.-08     juin-08    août-08      oct.-08     janv.-09   mars-09      mai-09      juil.-09   sept.-09   nov.-09   janv.-10   mars-10   mai-10   juil.-10



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                                                            4
jeudi 16 décembre 2010
But first... some figures...
          Downloads                      Moving Average (year)
                                                                                          Groovy downloads per month
   200000                                                                                                                                      Groovy 1.7

                                                                                       Groovy 1.6

   150000




   100000




                                                  G2One
                                               acquisition
    50000

      Groovy 1.5


         0
             déc.-07    févr.-08     avr.-08     juin-08    août-08      oct.-08     janv.-09   mars-09      mai-09      juil.-09   sept.-09   nov.-09   janv.-10   mars-10   mai-10   juil.-10



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                                                            4
jeudi 16 décembre 2010
But first... some figures...
          Downloads                      Moving Average (year)
                                                                                          Groovy downloads per month
   200000                                                                                                                                      Groovy 1.7

                                                                                       Groovy 1.6




                                                 8 5 K
   150000




   100000




    50000

      Groovy 1.5
                                               1  G2One
                                               acquisition




         0
             déc.-07    févr.-08     avr.-08     juin-08    août-08      oct.-08     janv.-09   mars-09      mai-09      juil.-09   sept.-09   nov.-09   janv.-10   mars-10   mai-10   juil.-10



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                                                            4
jeudi 16 décembre 2010
Groovy 1.7.6 and 1.8-beta-3




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   5
jeudi 16 décembre 2010
looking into the Past
jeudi 16 décembre 2010
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
    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   7
jeudi 16 décembre 2010
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
    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   8
jeudi 16 décembre 2010
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]


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   9
jeudi 16 décembre 2010
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 (bool) throw new Exception()
                                               1
                                           } catch (any) { 2 }
                                           finally { 3 }
                                       }
                                       assert m2(true) == 2 && m2(false) == 1


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   10
jeudi 16 décembre 2010
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 annotations


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   11
jeudi 16 décembre 2010
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




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   12
jeudi 16 décembre 2010
@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 as 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

    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   13
jeudi 16 décembre 2010
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()
                                     }



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   14
jeudi 16 décembre 2010
into the Present...
jeudi 16 décembre 2010
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


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   16
jeudi 16 décembre 2010
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


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   17
jeudi 16 décembre 2010
AIC and NC

       • Anonymous Inner Classes and Nested Classes




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   18
jeudi 16 décembre 2010
AIC and NC

       • Anonymous Inner Classes and Nested Classes




                                                 Fo rJ ava
                                                       ’n p aste
                                                 c opy
                                                        atib ility
                                                  co mp
                                                  sak e :-)

    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   18
jeudi 16 décembre 2010
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



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   19
jeudi 16 décembre 2010
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



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   19
jeudi 16 décembre 2010
Nested Classes



                                       class Environment {
                                           static class Production
                                                extends Environment {}
                                           static class Development
                                                extends Environment {}
                                       }

                                        new Environment.Production()




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   20
jeudi 16 décembre 2010
Anotations almost anywhere


       • You can put annotations
               – on imports
               – on packages
               – on variable declarations


       • Examples with @Grab following...




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
jeudi 16 décembre 2010
Grape improvements (1/4)

       • @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")
                        }.toString ()).book.title == "Groovy in Action"


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   22
jeudi 16 décembre 2010
Grape improvements (2/4)

       • 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 {
               book(title: "Groovy in Action", author: "Dierk Koenig")
           }
           assert books.toString() ==
               '{"books":{"book":{"title":"Groovy in Action",' + 
               '"author":"Dierk Koenig"}}}'




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   23
jeudi 16 décembre 2010
Grape improvements (3/4)

       • 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



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   24
jeudi 16 décembre 2010
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

    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   25
jeudi 16 décembre 2010
Power Asserts (2/2)

       • You’ll get a more comprehensible output




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   26
jeudi 16 décembre 2010
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




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   27
jeudi 16 décembre 2010
AST Viewer




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   28
jeudi 16 décembre 2010
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"
                         }
                     }
                 }


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   29
jeudi 16 décembre 2010
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


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   30
jeudi 16 décembre 2010
Groovy 1.7.x changes


       • Since Groovy 1.7.0...
         Groovy 1.7.1, 1.7.2, 1.7.3, 1.7.4, 1.7.5 and 1.7.6
         have been released already!

       • Here’s what’s new!




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   31
jeudi 16 décembre 2010
Grape improvements (4/4)

       • Groovy 1.7.5 even further shrinks the grab resolver
         definition:




                  @Gra bResolver('http://maven.restlet.org')
                  @Grab('org.restlet:org.restlet:1.1.6')
                  import org.restlet.Restlet



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   32
jeudi 16 décembre 2010
Map improvements (1/2)


       // map auto‐vification
       def m =  [:].withDefault { key ‐> "Default" }
       assert m['z'] == "Default" 
       assert m['a'] == "Default"

        // default sort, sort with a comparator
        m.sort()
        m.sort({ a, b ‐> a <=> b } as Comparator)

         // max{} and min{}
         assert [a:  1, b: 2].max{ it.value }.value == 2


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   33
jeudi 16 décembre 2010
Map improvements (2/2)


              // before Map#withDefault()

               def words = "one two two three three three".split()

               def freq = [:]

               words.each {
                   if (it in freq)
                       freq[it] += 1
                   else
                       freq[it] = 1    
               }




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   34
jeudi 16 décembre 2010
Map improvements (2/2)


              //  after Map#withDefault()

               def words = "one two two three three three".split()

               def freq = [:].withDefault { k ‐> 0 }

               words.each {

                        freq[it] += 1


                }




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   35
jeudi 16 décembre 2010
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>"


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   36
jeudi 16 décembre 2010
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'


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   37
jeudi 16 décembre 2010
Date improvements


           im port static java.util.Calendar.*

           // convert to calendar
           def cal = new Date().toCalendar()
            
           // update a date (or a calendar)
           cal.set(year: cal[YEAR] + 1)
           cal[MONTH] = MARCH

             // create a ne w date (or a calendar) from one
             def nextYear = c al.updated(year: cal[YEAR] + 1)




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   38
jeudi 16 décembre 2010
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 


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                    39
jeudi 16 décembre 2010
Map supports isCase()


           def m = [a: 1, b: 2]
           def val = 'a'

           switch (val) {
               case m: "key in map"; break
               // equival ent to // case { val in m }: ...
               default: "not in map"
           }




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   40
jeudi 16 décembre 2010
(G)String to Enum coercion

                                   enum Color {
                                       red, green, blue
                                   }

                                    // coercion with as
                                    def r = "red" as Color

                                     // implicit coercion
                                     Color b = "blue"

                                     // with GStrings too
                                     def g = "${'green'}" as Color


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   41
jeudi 16 décembre 2010
...and beyond!
jeudi 16 décembre 2010
Groovy 1.8 & beyond


       • Still subject to discussion
       • Always evolving roadmap
       • Things may change!




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   43
jeudi 16 décembre 2010
What’s cooking?
jeudi 16 décembre 2010
What we’re working on

       • More runtime performance improvements
       • Closures
               – annotation parameters
                 composition, memoization, and trampoline
       • Native JSON support
               – builder and parser
       • New AST transformations
       • Gradle build
       • Modularizing Groovy
       • Align with JDK 7 / Java 7 / Project Coin
       • Enhanced DSL support

    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   45
jeudi 16 décembre 2010
jeudi 16 décembre 2010
G

jeudi 16 décembre 2010
jeudi 16 décembre 2010
jeudi 16 décembre 2010
An example, with Fibonacci




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   48
jeudi 16 décembre 2010
An example, with Fibonacci

                                                                                   • Known example of worst case
                                                                                     performance for Groovy




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   48
jeudi 16 décembre 2010
An example, with Fibonacci

                                                                                   • Known example of worst case
                                                                                     performance for Groovy




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   48
jeudi 16 décembre 2010
An example, with Fibonacci

                                                                                   • Known example of worst case
                                                                                     performance for Groovy

                                                                                   • Groovy 1.7.5 vs Java
                                                                                                   – 25131ms / 1110ms
                                                                                                   –22x slower!




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   48
jeudi 16 décembre 2010
An example, with Fibonacci

                                                                                   • Known example of worst case
                                                                                     performance for Groovy

                                                                                   • Groovy 1.7.5 vs Java
                                                                                                   – 25131ms / 1110ms
                                                                                                   –22x slower!




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   48
jeudi 16 décembre 2010
An example, with Fibonacci

                                                                                   • Known example of worst case
                                                                                     performance for Groovy

                                                                                   • Groovy 1.7.5 vs Java
                                                                                                   – 25131ms / 1110ms
                                                                                                   –22x slower!


                                                                                   • Groovy 1.8-beta-3 vs Java
                                                                                                   – 1871ms / 1110ms
                                                                                                   –only 68% slower



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   48
jeudi 16 décembre 2010
An example, with Fibonacci

                                                                                   • Known example of worst case
                                                                                     performance for Groovy




                                                        13 x                       • Groovy 1.7.5 vs Java
                                                                                                   – 25131ms / 1110ms
                                                                                                   –22x slower!


                                                                                   • Groovy 1.8-beta-3 vs Java
                                                                                                   – 1871ms / 1110ms
                                                                                                   –only 68% slower



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   48
jeudi 16 décembre 2010
Optimizations for int

       • Currently, the optimizations cover most of native
         operations on primitive ints
               – Be careful, your mileage may vary


       • To come next
               – optimizations for doubles
               – improving array accesses
               – then other primitives optimizations
               – and mixed cases of primitives




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   49
jeudi 16 décembre 2010
Closure annotation parameters

       • 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 annotation parameters!
               – Groovy 1.8 will give us the ability to access annotation
                 with closure parameters at runtime


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   50
jeudi 16 décembre 2010
GContracts

       • Closures are already allowed in the Groovy 1.7 Antlr
         grammar
               – André Steingreß created GContracts,
                 a «design by contract» module

                    // a class invariant
                    @Invar iant({ name.size() > 0 && age > ageLimit() })
                    class Person { String name; int age }
                     
                    // a method pre‐condition
                    @Requires({ message != null })
                    void greet(String message) { ... }
                     
                    // a method post‐condition
                    @Ensures({ returnResult % 2 == 0 })
                    int evenResult() { ... }
    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   51
jeudi 16 décembre 2010
Closure composition

       • Functional flavor!

                 def plus2  = { it + 2 }
                 def times3 = { it * 3 }
                  
                 def composed1 = plus2 << times3
                 assert composed1(3) == 11
                 assert composed1(4) == plus2(times3(4))
                  
                 def composed2 = times3 << plus2
                 assert composed2(3) == 15
                 assert composed2(5) == times3(plus2(5))
                  
                 // reverse composition
                 assert composed1(3) == (times3 >> plus2)(3)

    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   52
jeudi 16 décembre 2010
Closure memoization

       • Memoization: remember the outcome of previous
         (ideally side-effect free) invocations

                 def c = { a, b ‐> sleep 1000; a + b }.memoize()
                 assert c(1, 2) == 3 // after 1000ms
                 assert c(1, 2) == 3 // return immediately
                  
                 // other forms:
                 // at least 10 invocations cached
                 def cAtLeast = { ... }.memoizeAtLeast(10)
                 // at most 10 invocations cached
                 def cAtMost = { ... }.memoizeAtMost(10)
                 // between 10 and 20 invocations cached
                 def cAtLeast = { ... }.memoizeBetween(10, 20)


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   53
jeudi 16 décembre 2010
Closure trampoline

       • No more infamous StackOvervlow errors for deeply
         recursive algorithms
               – if you use closure trampolines explicitely

                def fact
                fact = { int n, BigInteger accu ‐>
                    n > 1 ? fact.trampoline(n ‐ 1, n * accu) : accu
                }.trampoline()

                 def factorial = { int n ‐> fact(n, 1G) }

                 assert factorial(1)    == 1
                 assert factorial(3)    == 6
                 assert factorial(1000) == 402387260077...


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   54
jeudi 16 décembre 2010
New AST xforms (1/2)

       • Many new transformations coming up for
         removing even more boiler plate code

        @Log                                                                                  inject a logger in your classes
        @Field                                                                                creates a field in your scripts
        @PackageScope                                                                         improvements (methods & fields)
        @Synchronized                                                                         providing safer synchronization semantics
        @InheritConstructor                                                                   ex. when extending Exception
        @IndexedProperties                                                                    JavaBeans indexed property support
        @AutoClone                                                                            automatic cloning of your beans
        @AutoExternalizable                                                                   automatic externalization of your beans


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                    55
jeudi 16 décembre 2010
New AST xforms (2/2)




        @ThreadInterrupt                                                                      makes a script interruptible
        @TimedInterrupt                                                                       interrupt after a period of time
        @ConditionalInterrupt                                                                 interrupt with a custom condition


        @Canonical                                                                            adds equals, hashCode, toString, ctor
        - @EqualsAndHashCode                                                                  just equals and hashCode
        - @ToString                                                                           just toString
        - @TupleConstructor                                                                   adds a «tuple» constructor


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                56
jeudi 16 décembre 2010
Java 7 / 8 / Project Coin

       • Alignment with JDK 7 will come in Groovy 1.9
       • JSR-292 InvokeDynamic
       • Simple Closures (8)

       • Proposals from Project Coin
               – Strings in switch (7)
               – Automatic Resource Management (7)
               – Improved generics type inference (diamond <>) (7)
               – Simplified varargs method invocation (7)
               – Better integral literals (7)
               – Language support for collections (8?)


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   57
jeudi 16 décembre 2010
Java 7 / 8 / Project Coin

       • Alignment with JDK 7 will come in Groovy 1.9
       • JSR-292 InvokeDynamic
       • Simple Closures (8)

       • Proposals from Project Coin
               – Strings in switch (7)
               – Automatic Resource Management (7)
               – Improved generics type inference (diamond <>) (7)
               – Simplified varargs method invocation (7)
               – Better integral literals (7)
               – Language support for collections (8?)


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   57
jeudi 16 décembre 2010
Java 7 / 8 / Project Coin

       • Alignment with JDK 7 will come in Groovy 1.9
       • JSR-292 InvokeDynamic
       • Simple Closures (8)

       • Proposals from Project Coin
               – Strings in switch (7)
               – Automatic Resource Management (7)
               – Improved generics type inference (diamond <>) (7)
               – Simplified varargs method invocation (7)
               – Better integral literals (7)
               – Language support for collections (8?)


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   57
jeudi 16 décembre 2010
Java 7 / 8 / Project Coin

       • Alignment with JDK 7 will come in Groovy 1.9
       • JSR-292 InvokeDynamic
       • Simple Closures (8)

       • Proposals from Project Coin
               – Strings in switch (7)
               – Automatic Resource Management (7)
               – Improved generics type inference (diamond <>) (7)
               – Simplified varargs method invocation (7)
               – Better integral literals (7)
               – Language support for collections (8?)


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   57
jeudi 16 décembre 2010
Java 7 / 8 / Project Coin

       • Alignment with JDK 7 will come in Groovy 1.9
       • JSR-292 InvokeDynamic
       • Simple Closures (8)

       • Proposals from Project Coin
               – Strings in switch (7)
               – Automatic Resource Management (7)
               – Improved generics type inference (diamond <>) (7)
               – Simplified varargs method invocation (7)
               – Better integral literals (7)
               – Language support for collections (8?)


    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   57
jeudi 16 décembre 2010
Improved DSL support


       • GEP-3: an extended command expression DSL
               – Groovy Extension Proposal #3



       • Command expressions
               – basically top-level statements without parens
               – combine named and non-named arguments in the mix
                      •for nicer Domain-Specific Languages
               – (methodName arguments)*



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   58
jeudi 16 décembre 2010
Before GEP-3

       • The idea: extend command-expressions, beyond
         top-level statements, for chained method calls
       • Before

                              send("Hello").to("Graeme")

                              check(that: margherita).tastes(good)

                              sell(100.shares).of(MSFT)

                              take(2.pills).of(chloroquinine).after(6.hours)

                              wait(10.minutes).and(execute {  })

                               blend(red, green).of(acrylic)



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   59
jeudi 16 décembre 2010
With GEP-3

       • The idea: extend command-expressions, beyond
         top-level statements, for chained method calls
       • After

                              send "Hello"  to "Graeme"

                              check that: margherita  tastes good

                              sell 100.shares  of MSFT

                              take 2.pills  of chloroquinine  after 6.hours

                              wait 10.minutes  and execute {  }

                               blend red, green  of acrylic



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   60
jeudi 16 décembre 2010
With GEP-3

       • The idea: extend command-expressions, beyond
         top-level statements, for chained method calls
       • After
                                                                                                                         Less
                                                                                                                         & co pare
                              send "Hello"  to "Graeme"

                              check that: margherita  tastes good                                                             mm   ns
                              sell 100.shares  of MSFT
                                                                                                                                 as
                              take 2.pills  of chloroquinine  after 6.hours

                              wait 10.minutes  and execute {  }

                               blend red, green  of acrylic



    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                  60
jeudi 16 décembre 2010
The pattern

       • A repetition of
               – method name
               – arguments (mix of named and normal)



              check  that: margherita  tastes  good
                 method                                                                                                  method
                                                             named parameter                                                      parameter
                  name                                                                                                    name




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                        61
jeudi 16 décembre 2010
Summary

     • No need to wait for Java 7, 8, 9...
            – closures, properties, interpolated strings, extended
              annotations, metaprogramming, [YOU NAME IT]...




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   62
jeudi 16 décembre 2010
Summary

     • No need to wait for Java 7, 8, 9...
            – closures, properties, interpolated strings, extended
              annotations, metaprogramming, [YOU NAME IT]...




                                      ’s s till
                              Gro ovy
                                  novat  ive
                               in
                                      20  03!
                               si nce
    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   62
jeudi 16 décembre 2010
Summary

     • No need to wait for Java 7, 8, 9...
            – closures, properties, interpolated strings, extended
              annotations, metaprogramming, [YOU NAME IT]...




                                      ’s s till
                              Gro ovy
                                  novat  ive
                               in
                                      20  03!
                               si nce
    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   62
jeudi 16 décembre 2010
d A
                                        a n
                   Q




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.


jeudi 16 décembre 2010
Picture credits

             Myself http://www.flickr.com/photos/romainguy/783719255/sizes/l/in/photostream/
             Big hat http://cdn.plussizecostumesupercenter.com/csc_inc/images/items/343x432/47703.jpg
             RIP http://gipsydan.files.wordpress.com/2009/11/rip.jpg
             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/
             Snail http://www.freakingnews.com/images/app_images/snail-0.jpg
             Usein bolt record http://www.phombo.com/sports/usain-bolt-beijing-2008-olympics/17450/full/popular/
             Fibonacci figure http://cnx.org/content/m22060/latest/graphics1.jpg
             Fibonacci face http://www.robinkelly.co.nz/site/acupil/images/lfib.jpg
             Puzzle: http://www.everystockphoto.com/photo.php?imageId=263521
             Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png
             Check mark: http://www.lnl.infn.it/~epics/WikiDumps/localhost/600px-symbol_ok.svg.png
             Puzzle: http://www.everystockphoto.com/photo.php?imageId=263521
             Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png
             Green leaf: http://www.flickr.com/photos/epsos/3384297473/
             Trafic light: http://rihancompany.com/var/243/35581-Traffic%20light%20drawing.jpg
             Butt kick: http://www.brentcsutoras.com/wp-content/uploads/2009/12/kick-ass-1.jpg




    Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   64
jeudi 16 décembre 2010

Contenu connexe

Plus de Guillaume Laforge

Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Guillaume Laforge
 
Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Guillaume Laforge
 
Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Guillaume Laforge
 
Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Guillaume Laforge
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Guillaume Laforge
 
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGroovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGuillaume Laforge
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGuillaume Laforge
 
Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Guillaume Laforge
 
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Guillaume Laforge
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Guillaume Laforge
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Guillaume Laforge
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Guillaume Laforge
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Guillaume Laforge
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovyGuillaume Laforge
 
Groovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGroovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGroovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
 

Plus de Guillaume Laforge (20)

Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012
 
Groovy 2.0 webinar
Groovy 2.0 webinarGroovy 2.0 webinar
Groovy 2.0 webinar
 
Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012
 
Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012
 
JavaOne 2012 Groovy update
JavaOne 2012 Groovy updateJavaOne 2012 Groovy update
JavaOne 2012 Groovy update
 
Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
 
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGroovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific Languages
 
Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012
 
Whats new in Groovy 2.0?
Whats new in Groovy 2.0?Whats new in Groovy 2.0?
Whats new in Groovy 2.0?
 
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
 
Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovy
 
Groovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGroovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume Laforge
 
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGroovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
 

Dernier

[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Nikki Chapple
 
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...amber724300
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsYoss Cohen
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Jeffrey Haguewood
 
All These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFAll These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFMichael Gough
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
Kuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorialKuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorialJoão Esperancinha
 
Digital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentDigital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentMahmoud Rabie
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
WomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneWomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneUiPathCommunity
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#Karmanjay Verma
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 

Dernier (20)

[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
 
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platforms
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
 
All These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFAll These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDF
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
Kuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorialKuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorial
 
Digital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentDigital Tools & AI in Career Development
Digital Tools & AI in Career Development
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
WomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneWomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyone
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 

Groovy 1.7 and 1.8 Progress

  • 3. State jeudi 16 décembre 2010 of the Union
  • 4. State jeudi 16 décembre 2010 of the Union
  • 5. Guillaume Laforge / @glaforge • Groovy Project Manager • Head of Groovy Development at SpringSource • Initiator of the Grails framework • Founder of the Gaelyk toolkit • Co-author of Groovy in Action • Member of «Les Cast Codeurs» podcast • Speaker: JavaOne, QCon, JavaZone, Sun TechDays, Devoxx, The Spring Experience, SpringOne2GX, JAX, Dynamic Language World, IJTC, and more... Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 2 jeudi 16 décembre 2010
  • 6. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 3 jeudi 16 décembre 2010
  • 7. But first... some figures... Downloads Moving Average (year) Groovy downloads per month 200000 150000 100000 50000 0 déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 4 jeudi 16 décembre 2010
  • 8. But first... some figures... Downloads Moving Average (year) Groovy downloads per month 200000 150000 100000 50000 0 déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 4 jeudi 16 décembre 2010
  • 9. But first... some figures... Downloads Moving Average (year) Groovy downloads per month 200000 150000 100000 50000 Groovy 1.5 0 déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 4 jeudi 16 décembre 2010
  • 10. But first... some figures... Downloads Moving Average (year) Groovy downloads per month 200000 150000 100000 50000 Groovy 1.5 0 déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 4 jeudi 16 décembre 2010
  • 11. But first... some figures... Downloads Moving Average (year) Groovy downloads per month 200000 150000 100000 G2One acquisition 50000 Groovy 1.5 0 déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 4 jeudi 16 décembre 2010
  • 12. But first... some figures... Downloads Moving Average (year) Groovy downloads per month 200000 150000 100000 G2One acquisition 50000 Groovy 1.5 0 déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 4 jeudi 16 décembre 2010
  • 13. But first... some figures... Downloads Moving Average (year) Groovy downloads per month 200000 Groovy 1.6 150000 100000 G2One acquisition 50000 Groovy 1.5 0 déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 4 jeudi 16 décembre 2010
  • 14. But first... some figures... Downloads Moving Average (year) Groovy downloads per month 200000 Groovy 1.6 150000 100000 G2One acquisition 50000 Groovy 1.5 0 déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 4 jeudi 16 décembre 2010
  • 15. But first... some figures... Downloads Moving Average (year) Groovy downloads per month 200000 Groovy 1.7 Groovy 1.6 150000 100000 G2One acquisition 50000 Groovy 1.5 0 déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 4 jeudi 16 décembre 2010
  • 16. But first... some figures... Downloads Moving Average (year) Groovy downloads per month 200000 Groovy 1.7 Groovy 1.6 8 5 K 150000 100000 50000 Groovy 1.5 1 G2One acquisition 0 déc.-07 févr.-08 avr.-08 juin-08 août-08 oct.-08 janv.-09 mars-09 mai-09 juil.-09 sept.-09 nov.-09 janv.-10 mars-10 mai-10 juil.-10 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 4 jeudi 16 décembre 2010
  • 17. Groovy 1.7.6 and 1.8-beta-3 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 5 jeudi 16 décembre 2010
  • 18. looking into the Past jeudi 16 décembre 2010
  • 19. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 7 jeudi 16 décembre 2010
  • 20. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 8 jeudi 16 décembre 2010
  • 21. 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] Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 9 jeudi 16 décembre 2010
  • 22. 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 (bool) throw new Exception()         1     } catch (any) { 2 }     finally { 3 } } assert m2(true) == 2 && m2(false) == 1 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 10 jeudi 16 décembre 2010
  • 23. 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 annotations Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 11 jeudi 16 décembre 2010
  • 24. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 12 jeudi 16 décembre 2010
  • 25. @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 as 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 13 jeudi 16 décembre 2010
  • 26. 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() } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 14 jeudi 16 décembre 2010
  • 27. into the Present... jeudi 16 décembre 2010
  • 28. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 16 jeudi 16 décembre 2010
  • 29. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 17 jeudi 16 décembre 2010
  • 30. AIC and NC • Anonymous Inner Classes and Nested Classes Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 18 jeudi 16 décembre 2010
  • 31. AIC and NC • Anonymous Inner Classes and Nested Classes Fo rJ ava ’n p aste c opy atib ility co mp sak e :-) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 18 jeudi 16 décembre 2010
  • 32. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 19 jeudi 16 décembre 2010
  • 33. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 19 jeudi 16 décembre 2010
  • 34. Nested Classes class Environment {     static class Production          extends Environment {}     static class Development          extends Environment {} } new Environment.Production() Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 20 jeudi 16 décembre 2010
  • 35. Anotations almost anywhere • You can put annotations – on imports – on packages – on variable declarations • Examples with @Grab following... Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21 jeudi 16 décembre 2010
  • 36. Grape improvements (1/4) • @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") }.toString ()).book.title == "Groovy in Action" Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 22 jeudi 16 décembre 2010
  • 37. Grape improvements (2/4) • 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 {     book(title: "Groovy in Action", author: "Dierk Koenig") } assert books.toString() ==     '{"books":{"book":{"title":"Groovy in Action",' +      '"author":"Dierk Koenig"}}}' Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 23 jeudi 16 décembre 2010
  • 38. Grape improvements (3/4) • 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 24 jeudi 16 décembre 2010
  • 39. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 25 jeudi 16 décembre 2010
  • 40. Power Asserts (2/2) • You’ll get a more comprehensible output Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 26 jeudi 16 décembre 2010
  • 41. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 27 jeudi 16 décembre 2010
  • 42. AST Viewer Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 28 jeudi 16 décembre 2010
  • 43. 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"         }     } } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 29 jeudi 16 décembre 2010
  • 44. 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 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 30 jeudi 16 décembre 2010
  • 45. Groovy 1.7.x changes • Since Groovy 1.7.0... Groovy 1.7.1, 1.7.2, 1.7.3, 1.7.4, 1.7.5 and 1.7.6 have been released already! • Here’s what’s new! Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 31 jeudi 16 décembre 2010
  • 46. Grape improvements (4/4) • Groovy 1.7.5 even further shrinks the grab resolver definition: @Gra bResolver('http://maven.restlet.org') @Grab('org.restlet:org.restlet:1.1.6') import org.restlet.Restlet Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 32 jeudi 16 décembre 2010
  • 47. Map improvements (1/2) // map auto‐vification def m =  [:].withDefault { key ‐> "Default" } assert m['z'] == "Default"  assert m['a'] == "Default" // default sort, sort with a comparator m.sort() m.sort({ a, b ‐> a <=> b } as Comparator) // max{} and min{} assert [a:  1, b: 2].max{ it.value }.value == 2 Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 33 jeudi 16 décembre 2010
  • 48. Map improvements (2/2) // before Map#withDefault() def words = "one two two three three three".split() def freq = [:] words.each {     if (it in freq)         freq[it] += 1     else         freq[it] = 1     } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 34 jeudi 16 décembre 2010
  • 49. Map improvements (2/2) //  after Map#withDefault() def words = "one two two three three three".split() def freq = [:].withDefault { k ‐> 0 } words.each {         freq[it] += 1 } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 35 jeudi 16 décembre 2010
  • 50. 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>" Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 36 jeudi 16 décembre 2010
  • 51. 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' Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 37 jeudi 16 décembre 2010
  • 52. Date improvements im port static java.util.Calendar.* // convert to calendar def cal = new Date().toCalendar()   // update a date (or a calendar) cal.set(year: cal[YEAR] + 1) cal[MONTH] = MARCH // create a ne w date (or a calendar) from one def nextYear = c al.updated(year: cal[YEAR] + 1) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 38 jeudi 16 décembre 2010
  • 53. 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  Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 39 jeudi 16 décembre 2010
  • 54. Map supports isCase() def m = [a: 1, b: 2] def val = 'a' switch (val) {     case m: "key in map"; break     // equival ent to // case { val in m }: ...     default: "not in map" } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 40 jeudi 16 décembre 2010
  • 55. (G)String to Enum coercion enum Color {     red, green, blue } // coercion with as def r = "red" as Color // implicit coercion Color b = "blue" // with GStrings too def g = "${'green'}" as Color Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 41 jeudi 16 décembre 2010
  • 56. ...and beyond! jeudi 16 décembre 2010
  • 57. Groovy 1.8 & beyond • Still subject to discussion • Always evolving roadmap • Things may change! Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 43 jeudi 16 décembre 2010
  • 58. What’s cooking? jeudi 16 décembre 2010
  • 59. What we’re working on • More runtime performance improvements • Closures – annotation parameters composition, memoization, and trampoline • Native JSON support – builder and parser • New AST transformations • Gradle build • Modularizing Groovy • Align with JDK 7 / Java 7 / Project Coin • Enhanced DSL support Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 45 jeudi 16 décembre 2010
  • 64. An example, with Fibonacci Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 48 jeudi 16 décembre 2010
  • 65. An example, with Fibonacci • Known example of worst case performance for Groovy Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 48 jeudi 16 décembre 2010
  • 66. An example, with Fibonacci • Known example of worst case performance for Groovy Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 48 jeudi 16 décembre 2010
  • 67. An example, with Fibonacci • Known example of worst case performance for Groovy • Groovy 1.7.5 vs Java – 25131ms / 1110ms –22x slower! Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 48 jeudi 16 décembre 2010
  • 68. An example, with Fibonacci • Known example of worst case performance for Groovy • Groovy 1.7.5 vs Java – 25131ms / 1110ms –22x slower! Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 48 jeudi 16 décembre 2010
  • 69. An example, with Fibonacci • Known example of worst case performance for Groovy • Groovy 1.7.5 vs Java – 25131ms / 1110ms –22x slower! • Groovy 1.8-beta-3 vs Java – 1871ms / 1110ms –only 68% slower Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 48 jeudi 16 décembre 2010
  • 70. An example, with Fibonacci • Known example of worst case performance for Groovy 13 x • Groovy 1.7.5 vs Java – 25131ms / 1110ms –22x slower! • Groovy 1.8-beta-3 vs Java – 1871ms / 1110ms –only 68% slower Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 48 jeudi 16 décembre 2010
  • 71. Optimizations for int • Currently, the optimizations cover most of native operations on primitive ints – Be careful, your mileage may vary • To come next – optimizations for doubles – improving array accesses – then other primitives optimizations – and mixed cases of primitives Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 49 jeudi 16 décembre 2010
  • 72. Closure annotation parameters • 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 annotation parameters! – Groovy 1.8 will give us the ability to access annotation with closure parameters at runtime Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 50 jeudi 16 décembre 2010
  • 73. GContracts • Closures are already allowed in the Groovy 1.7 Antlr grammar – André Steingreß created GContracts, a «design by contract» module // a class invariant @Invar iant({ name.size() > 0 && age > ageLimit() }) class Person { String name; int age }   // a method pre‐condition @Requires({ message != null }) void greet(String message) { ... }   // a method post‐condition @Ensures({ returnResult % 2 == 0 }) int evenResult() { ... } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 51 jeudi 16 décembre 2010
  • 74. Closure composition • Functional flavor! def plus2  = { it + 2 } def times3 = { it * 3 }   def composed1 = plus2 << times3 assert composed1(3) == 11 assert composed1(4) == plus2(times3(4))   def composed2 = times3 << plus2 assert composed2(3) == 15 assert composed2(5) == times3(plus2(5))   // reverse composition assert composed1(3) == (times3 >> plus2)(3) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 52 jeudi 16 décembre 2010
  • 75. Closure memoization • Memoization: remember the outcome of previous (ideally side-effect free) invocations def c = { a, b ‐> sleep 1000; a + b }.memoize() assert c(1, 2) == 3 // after 1000ms assert c(1, 2) == 3 // return immediately   // other forms: // at least 10 invocations cached def cAtLeast = { ... }.memoizeAtLeast(10) // at most 10 invocations cached def cAtMost = { ... }.memoizeAtMost(10) // between 10 and 20 invocations cached def cAtLeast = { ... }.memoizeBetween(10, 20) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 53 jeudi 16 décembre 2010
  • 76. Closure trampoline • No more infamous StackOvervlow errors for deeply recursive algorithms – if you use closure trampolines explicitely def fact fact = { int n, BigInteger accu ‐>     n > 1 ? fact.trampoline(n ‐ 1, n * accu) : accu }.trampoline() def factorial = { int n ‐> fact(n, 1G) } assert factorial(1)    == 1 assert factorial(3)    == 6 assert factorial(1000) == 402387260077... Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 54 jeudi 16 décembre 2010
  • 77. New AST xforms (1/2) • Many new transformations coming up for removing even more boiler plate code @Log inject a logger in your classes @Field creates a field in your scripts @PackageScope improvements (methods & fields) @Synchronized providing safer synchronization semantics @InheritConstructor ex. when extending Exception @IndexedProperties JavaBeans indexed property support @AutoClone automatic cloning of your beans @AutoExternalizable automatic externalization of your beans Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 55 jeudi 16 décembre 2010
  • 78. New AST xforms (2/2) @ThreadInterrupt makes a script interruptible @TimedInterrupt interrupt after a period of time @ConditionalInterrupt interrupt with a custom condition @Canonical adds equals, hashCode, toString, ctor - @EqualsAndHashCode just equals and hashCode - @ToString just toString - @TupleConstructor adds a «tuple» constructor Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 56 jeudi 16 décembre 2010
  • 79. Java 7 / 8 / Project Coin • Alignment with JDK 7 will come in Groovy 1.9 • JSR-292 InvokeDynamic • Simple Closures (8) • Proposals from Project Coin – Strings in switch (7) – Automatic Resource Management (7) – Improved generics type inference (diamond <>) (7) – Simplified varargs method invocation (7) – Better integral literals (7) – Language support for collections (8?) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 57 jeudi 16 décembre 2010
  • 80. Java 7 / 8 / Project Coin • Alignment with JDK 7 will come in Groovy 1.9 • JSR-292 InvokeDynamic • Simple Closures (8) • Proposals from Project Coin – Strings in switch (7) – Automatic Resource Management (7) – Improved generics type inference (diamond <>) (7) – Simplified varargs method invocation (7) – Better integral literals (7) – Language support for collections (8?) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 57 jeudi 16 décembre 2010
  • 81. Java 7 / 8 / Project Coin • Alignment with JDK 7 will come in Groovy 1.9 • JSR-292 InvokeDynamic • Simple Closures (8) • Proposals from Project Coin – Strings in switch (7) – Automatic Resource Management (7) – Improved generics type inference (diamond <>) (7) – Simplified varargs method invocation (7) – Better integral literals (7) – Language support for collections (8?) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 57 jeudi 16 décembre 2010
  • 82. Java 7 / 8 / Project Coin • Alignment with JDK 7 will come in Groovy 1.9 • JSR-292 InvokeDynamic • Simple Closures (8) • Proposals from Project Coin – Strings in switch (7) – Automatic Resource Management (7) – Improved generics type inference (diamond <>) (7) – Simplified varargs method invocation (7) – Better integral literals (7) – Language support for collections (8?) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 57 jeudi 16 décembre 2010
  • 83. Java 7 / 8 / Project Coin • Alignment with JDK 7 will come in Groovy 1.9 • JSR-292 InvokeDynamic • Simple Closures (8) • Proposals from Project Coin – Strings in switch (7) – Automatic Resource Management (7) – Improved generics type inference (diamond <>) (7) – Simplified varargs method invocation (7) – Better integral literals (7) – Language support for collections (8?) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 57 jeudi 16 décembre 2010
  • 84. Improved DSL support • GEP-3: an extended command expression DSL – Groovy Extension Proposal #3 • Command expressions – basically top-level statements without parens – combine named and non-named arguments in the mix •for nicer Domain-Specific Languages – (methodName arguments)* Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 58 jeudi 16 décembre 2010
  • 85. Before GEP-3 • The idea: extend command-expressions, beyond top-level statements, for chained method calls • Before send("Hello").to("Graeme") check(that: margherita).tastes(good) sell(100.shares).of(MSFT) take(2.pills).of(chloroquinine).after(6.hours) wait(10.minutes).and(execute {  }) blend(red, green).of(acrylic) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 59 jeudi 16 décembre 2010
  • 86. With GEP-3 • The idea: extend command-expressions, beyond top-level statements, for chained method calls • After send "Hello"  to "Graeme" check that: margherita  tastes good sell 100.shares  of MSFT take 2.pills  of chloroquinine  after 6.hours wait 10.minutes  and execute {  } blend red, green  of acrylic Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 60 jeudi 16 décembre 2010
  • 87. With GEP-3 • The idea: extend command-expressions, beyond top-level statements, for chained method calls • After Less & co pare send "Hello"  to "Graeme" check that: margherita  tastes good mm ns sell 100.shares  of MSFT as take 2.pills  of chloroquinine  after 6.hours wait 10.minutes  and execute {  } blend red, green  of acrylic Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 60 jeudi 16 décembre 2010
  • 88. The pattern • A repetition of – method name – arguments (mix of named and normal) check  that: margherita  tastes  good method method named parameter parameter name name Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 61 jeudi 16 décembre 2010
  • 89. Summary • No need to wait for Java 7, 8, 9... – closures, properties, interpolated strings, extended annotations, metaprogramming, [YOU NAME IT]... Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 62 jeudi 16 décembre 2010
  • 90. Summary • No need to wait for Java 7, 8, 9... – closures, properties, interpolated strings, extended annotations, metaprogramming, [YOU NAME IT]... ’s s till Gro ovy novat ive in 20 03! si nce Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 62 jeudi 16 décembre 2010
  • 91. Summary • No need to wait for Java 7, 8, 9... – closures, properties, interpolated strings, extended annotations, metaprogramming, [YOU NAME IT]... ’s s till Gro ovy novat ive in 20 03! si nce Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 62 jeudi 16 décembre 2010
  • 92. d A a n Q Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. jeudi 16 décembre 2010
  • 93. Picture credits Myself http://www.flickr.com/photos/romainguy/783719255/sizes/l/in/photostream/ Big hat http://cdn.plussizecostumesupercenter.com/csc_inc/images/items/343x432/47703.jpg RIP http://gipsydan.files.wordpress.com/2009/11/rip.jpg 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/ Snail http://www.freakingnews.com/images/app_images/snail-0.jpg Usein bolt record http://www.phombo.com/sports/usain-bolt-beijing-2008-olympics/17450/full/popular/ Fibonacci figure http://cnx.org/content/m22060/latest/graphics1.jpg Fibonacci face http://www.robinkelly.co.nz/site/acupil/images/lfib.jpg Puzzle: http://www.everystockphoto.com/photo.php?imageId=263521 Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png Check mark: http://www.lnl.infn.it/~epics/WikiDumps/localhost/600px-symbol_ok.svg.png Puzzle: http://www.everystockphoto.com/photo.php?imageId=263521 Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png Green leaf: http://www.flickr.com/photos/epsos/3384297473/ Trafic light: http://rihancompany.com/var/243/35581-Traffic%20light%20drawing.jpg Butt kick: http://www.brentcsutoras.com/wp-content/uploads/2009/12/kick-ass-1.jpg Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 64 jeudi 16 décembre 2010