SlideShare une entreprise Scribd logo
1  sur  50
Télécharger pour lire hors ligne
Groovy, past, present, future
    with a 1.7 update
    Guillaume Laforge
    Groovy Project Manager




                                    © 2010 SpringSource, A division of VMware. All rights reserved

lundi 22 mars 2010
Guillaume Laforge



     Groovy Project Manager
       •working on Groovy since 2003

     G2One ➜ SpringSource ➜ VMWare

     Initiated the creation of Grails

     Co-author of Groovy in Action

     Speaker: JavaOne, QCon, Devoxx, JavaZone, SpringOne,
       JAX, DSL DevCon, Google I/O, and many more...




                                                             2

lundi 22 mars 2010
Contact information

     Email
       • glaforge@vmware.com


     Twitter
       • @glaforge


     Blog
       • http://glaforge.free.fr/blog/groovy


     Groovy mailing-lists
       • http://old.nabble.com/codehaus---Groovy-f11866.html




                                                               3

lundi 22 mars 2010
A little story




                     4

lundi 22 mars 2010
About the content



     This presentation was prepared with the examples I’ve used in my
       article written for InfoQ
       • http://www.infoq.com/articles/groovy-1-6

     And from the release notes I’ve prepared for Groovy 1.7
       • http://groovy.codehaus.org/Groovy+1.7+release+notes

     For more information, don’t hesitate to read those two articles!




                                                                         5

lundi 22 mars 2010
Most popular alternative language for the JVM

     In terms of...
       • Poll and survey popularity
       • Books available on the shelves
       • Jobs on the job boards
       • Integration in other products
       • Download numbers
       • Community activity
       • Innovation




                                                    6

lundi 22 mars 2010
In terms of polls & surveys




                                  7

lundi 22 mars 2010
In terms of books




                        8

lundi 22 mars 2010
In terms of jobs




                       9

lundi 22 mars 2010
In terms of integration in other projects and products

     Groovy is integrated in many Open Source projects and Commercial
       products

       • Spring, IntelliJ IDEA, SAP Composition on Grails, RIFE, Mule ESB, Apache Camel,
          eXo Platform, SOAP UI, JBoss SEAM, XWiki, Oracle OC4J, SpringSource tcServer,
          Oracle Data Integrator, Canoo WebTest, Oracle Busines Components, IBM
          WebSphere sMash, CodeStreet MarketData Works, SpringSource Hyperic HQ

       • Mutual of Omaha, US National Cancer Institute, Patterson Institute for Cancer
          Research, IRSN, European Patent Office...


     and many more I’ve omitted!




                                                                                           10

lundi 22 mars 2010
In terms of download numbers

     Number of downloads per month
       • 2003: a few hundreds
       • 2005: ~5k
       • 2008: ~35k
       • 2009: ~70k

     Add to that number
       • all the integrations...
       • all the artifacts downloads from Maven’s repository!

     Highly successful OSS project!




                                                                11

lundi 22 mars 2010
In terms of community activity

     Very high traffic on the mailing-lists
       • 1500+ members
     Dedicated conferences
       • Groovy Grails eXchange
       • SpringOne 2GX
       • GR8 Conference (Europe / USA)
       • Excellent coverage of Groovy and Grails at all major conferences around the world
     Dedicated podcast
       • GrailsPodcast
     Dedicated online PDF magazine
       • GroovyMag




                                                                                             12

lundi 22 mars 2010
In terms of innovation

     JAX Innovation Award
       • Biggest German Java conference
     Groovy won first prize in 2007
       • Grails scored second in 2008
       • Spring arrived first in 2006




                                          13

lundi 22 mars 2010
Playing with Groovy

     You can play with these
       examples within the
       Groovy Web Console
       hosted on Google App Engine




       • http://groovyconsole.appspot.com




                                            14

lundi 22 mars 2010
nda
                   Ag e
                                                                                            • Past (Groovy 1.6)

                                                                                            • Present (Groovy 1.7)

                                                                                            • Future (Groovy 1.8+)




    Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   15
lundi 22 mars 2010
nda
                   Ag e                                                                     • Past (Groovy 1.6)
                                                                                                    – Syntax enhancements
                                                                                                    – Compile-time metaprogramming
                                                                                                    – The Grape module system

                                                                                                    – Miscelanous
                                                                                                            •Runtime metaprogramming
                                                                                                             additions
                                                                                                            •Built-in JSR-223 scripting engine
                                                                                                            •JMX Builder
                                                                                                            •OSGi readiness




    Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                16
lundi 22 mars 2010
Multiple assignments

     Newly defined variables
       •def (a, b) = [1, 2]
          assert a == 1 && b == 2



     Typed variables
       •def (int a, int b) = [1, 2]



     Assign to existing variables
       •def lat, lng
          (lat, lng) = geocode(‘Paris’)



     The classical ‘swap case’
       •(a, b) = [b, a]



                                          17

lundi 22 mars 2010
More optional returns

     Return value of last expression of the last if/else, try/catch, switch/
       case statement

     def m1() { if (true) 1 else 0 }

     def m2(b) {
                     try {
                         if (b) throw new Exception()
                         1
                     } catch(any) { 2 }
                     finally { 3 }
       }
       assert m2(false) == 1 && m2(true) == 2




                                                                                18

lundi 22 mars 2010
Compile-time metaprogramming

     With metaprogramming, Groovy’s able to modify the behaviour of
       programs... at runtime

     Groovy 1.6 introduced AST Transformations
       • AST: Abstract Syntax Tree
       • Ability to change what’s being compiled at compile-time!
          • No runtime impact!
          • Lets you change the semantics of your programs!
          • Nice way of implementing patterns and removing boiler-plate technical code


     Two kinds of transformations: global and local




                                                                                         19

lundi 22 mars 2010
AST Transformations in Groovy 1.6

     Several transformations finds their way
       • @Singleton — okay, not really a pattern :-)
       • @Immutable, @Lazy, @Delegate
       •@Newify
       • @Category and @Mixin
       •@PackageScope
       • Swing’s @Bindable and @Vetoable
       • Grape’s @Grab

     Let’s have a look at some of them




                                                       20

lundi 22 mars 2010
The @Singleton anti-pattern

     The evil Java singleton
       •public class Evil {
                     public static final Evil instance =
                         new Evil();
                     privavte Evil() {}
                     Evil getInstance() { return instance; }
          }



     In Groovy now:
       •@Singleton class Evil {}



     A lazy version also:
       •@Singleton(lazy = true) class Evil {}




                                                               21

lundi 22 mars 2010
@Immutable

     To properly implement immutable classes
       • No mutators (state musn’t change)
       • Private final fields
       • Defensive copying of mutable components
       • Proper equals() / hashCode() / toString() for comparisons, or for keys in maps,
          etc.

       •@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




                                                                                      22

lundi 22 mars 2010
@Lazy, not just for lazy dudes!

     When you need to lazily evaluate or instantiate complex data
       structures for class fields, mark them with the @Lazy annotation

       •class Dude {
                     @Lazy pets = retrieveFromSlowDB()
          }

     Groovy will handle the boiler-plate code for you!




                                                                          23

lundi 22 mars 2010
@Delegate, not just for managers!

     You can delegate to fields of your class
       • Think multiple inheritance

       •class Employee {
                     def doTheWork() { "done" }
          }
          class Manager {
              @Delegate Employee slave = new Employee()
          }
          def god = new Manager()
          assert god.doTheWork() == "done"



     Damn manager will get all the praise...




                                                          24

lundi 22 mars 2010
Grab a Grape

     Groovy Advanced Packaging Engine
       • Helps you distribute scripts without dependencies
       • Just declare your dependencies with @Grab
          • Will look for dependencies in Maven or Ivy repositories

       •@Grab(    group = 'org.mortbay.jetty',
                 module = 'jetty-embedded',
                version = '6.1.0' )
          def startServer() {
              def srv = new Server(8080)
              def ctx = new Context(srv , "/", SESSIONS)
              ctx.resourceBase = "."
              ctx.addServlet(GroovyServlet, "*.groovy")
              srv.start()
          }




                                                                      25

lundi 22 mars 2010
ExpandoMetaClass DSL


       Before
         •Number.metaClass.multiply = { Amount amount ->
                         amount.times(delegate)
           }
           Number.metaClass.div = { Amount amount ->
               amount.inverse().times(delegate)
           }



       In Groovy 1.6
         •Number.metaClass {
                     multiply { Amount amount ->
                         amount.times(delegate)
                     }
                     div { Amount amount ->
                         amount.inverse().times(delegate)
                     }
           }




                                                            26

lundi 22 mars 2010
Runtime mixins

     Inject new behavior to types at runtime

       •class FlyingAbility {
                     def fly() { "I'm ${name} and I fly!" }
          }
          class JamesBondVehicle {
              String getName() { "James Bond's vehicle" }
          }
          JamesBondVehicle.mixin FlyingAbility
          assert new JamesBondVehicle().fly() ==
              "I'm James Bond's vehicle and I fly!"




                                                              27

lundi 22 mars 2010
Miscelanous


       JMX builder
         • A new builder for easily exposing, interacting with JMX beans, listening to event,
           defining timers, etc.

       OSGi
         • Groovy’s JAR is already OSGi compatible by sporting the right attributes in the
           manifest

       JSR-223
         • An implementation of the javax.script.* APIs is now part of Groovy by default

       Swing console
         • Customizable graphical representation of results
         • Clickable stacktraces and error messages
         • Drag’n Drop, code indentation, add JARs to the classpath



                                                                                                28

lundi 22 mars 2010
nda
                   Ag e                                                                     • Present (Groovy 1.7)
                                                                                                    – Inner classes
                                                                                                    – Annotations
                                                                                                    – Grape enhancements
                                                                                                    – Power asserts
                                                                                                    – AST viewer and AST builder
                                                                                                    – Customize the Groovy Truth




    Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.       29
lundi 22 mars 2010
AIC and NC

     AIC: Anonymous Inner Classes
       NC: Nested Classes

     For Java-compatibility sake, we’re brining AIC / NC support into
       Groovy
       • copy’n paste compatibility? :-)

     Not much to see beyond the usual standard Java AIC / NC concept




                                                                         30

lundi 22 mars 2010
Annotations everywhere!

     Groovy supports of annotations since Groovy 1.5
       • a couple minor differences, for instance for arrays

     In Groovy 1.7, you can add annotations on
       • imports
       • packages
       • variable declarations

     Handy for Grape!

     Source-level annotations, available through the AST




                                                               31

lundi 22 mars 2010
Terser Grape

     Ability to put the @Grab annotation on imports!
       •@Grab(group = 'net.sf.json-lib',
               module = 'json-lib', version = '2.3',
           classifier = 'jdk15')
          import net.sf.json.groovy.*

       •def root = new JsonSlurper().parseText(...)



     Put @Grab on variable declarations and use the shorter notation
       •@Grab('net.sf.json-lib:json-lib:2.3:jdk15')
          def builder =
              new net.sf.json.groovy.JsonGroovyBuilder()




                                                                        32

lundi 22 mars 2010
Grab resolver

     Dependencies aren’t always available in Maven’s repository,
       so you may need to specify a different place to search libraries
       • before, one had to modify grapeConfig.xml



     Groovy 1.7 introduces a Grape resolver
       •@GrabResolver(name = 'restlet.org',
                        root = 'http://maven.restlet.org')
          @Grab(group = 'org.restlet',
               module =' org.restlet', version='1.1.6')
          import org.restlet.Restlet
          // ...




                                                                          33

lundi 22 mars 2010
Power Asserts

     Enhanced assert statement and output
       •def energy = 7200 * 10**15 + 1
          def mass = 80
          def celerity = 300000000
          assert energy == mass * celerity ** 2




                                                  34

lundi 22 mars 2010
AST transformations

     With Groovy 1.6 came AST transformations

     But...
       • you need a deep knowledge of the Groovy internals
       • it’s not easy to know what the AST looks like
       • writing transformations can be pretty verbose

     Groovy 1.7 introduces
       • an AST viewer
       • an AST builder




                                                             35

lundi 22 mars 2010
AST Viewer




                     36

lundi 22 mars 2010
AST Builder

     Ability to build AST parts

       • from a String
          •new AstBuilder().buildFromString(''' "Hello" ''')



       • from code
          •new AstBuilder().buildFromCode { "Hello" }



       • from specification
          •List<ASTNode> nodes = new AstBuilder().buildFromSpec {
                     block {
                         returnStatement {
                             constant "Hello"
                         }
                     }
             }




                                                                    37

lundi 22 mars 2010
Customize the Groovy Truth!

     Ability to customize the Groovy Truth by implementing of method
       boolean asBoolean()

     Your own predicate

       •class Predicate {
                     boolean value
                     boolean asBoolean() { value }
          }
          if (new Predicate(value: false)) {
              println true
          } else {
              println false
          }




                                                                        38

lundi 22 mars 2010
SQL improvements

     Batch updates

       •sql.withBatch { stmt ->
                     ["Paul", "Jochen", "Guillaume"].each { name ->
                         stmt.addBatch "insert into PERSON (name) values ($name)"
                     }
          }



     Transactions

       •def persons = sql.dataSet("person")
          sql.withTransaction {
              persons.add name: "Paul"
              persons.add name: "Jochen"
              persons.add name: "Guillaume"
          }




                                                                                39

lundi 22 mars 2010
nda
                   Ag e                                                                     • Future (Groovy 1.8+)
                                                                                                    – Extended annotations
                                                                                                    – DSL: command statements
                                                                                                      improvements
                                                                                                    – Pattern matching
                                                                                                    – Parser combinators
                                                                                                    – New MOP
                                                                                                    – JDK 7
                                                                                                            •Project Coin
                                                                                                            •Simple closures for Java
                                                                                                            •InvokeDynamic




    Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                  40
lundi 22 mars 2010
Groovy 1.8
          and beyond...


       • Caution!

       • The following features are still
         subject to discussion, and may
         very well never see
         the light of day!




lundi 22 mars 2010
Groovy 1.8, end of 2010

     Plan to provide various runtime improvements
       to make Groovy faster and faster
       • Avoiding most synchronization (volatile fields, explicit synchronization, etc...)
       • Leveraging the Java Memory Model operation ordering to simulate synchronization


     Make Groovy more modular
       • Probably using Grape’s module system
       • Breaking Groovy into smaller JARs
          • not everybody needs everything (JMX, SQL, Swing...)




     Align Groovy with JDK 7 / Java 7
       • Review project coin proposals where it makes sense
       • Incorporate / integrate with InvokeDynamic (JSR-292)
       • Interoperate with Java simple closures


                                                                                             42

lundi 22 mars 2010
Extended annotations

     Go beyond Java 5,
       and let annotations support more type parameters
       • closures, lists, maps, ranges



     Possible use cases
       • validation, pre- and post-conditions

       • @Validate({ name.size() > 4 })
          String name

       •@PreCondition({ msg != null })
          void outputToUpperCase(String msg) {
              println msg.toUpperCase()
          }




                                                          43

lundi 22 mars 2010
Command-expression based DSL



       Groovy lets you omit parentheses for top-level expressions,
         and mix named and non-named arguments

       Idea: extend to nested/chained expressions
         • send "Hello" to "Jochen"
           send "Hello", from: "Guillaume" to "Jochen"
           sell 100.shares of VMW
           take 2.pills of chloroquinine in 6.hours
           every 10.minutes do { }
           given { } when { } then { }
           blend red, green of acrylic



       Plays nicely with Java builder style APIs!




                                                                      44

lundi 22 mars 2010
Pattern matching

     Structural pattern matching on PO(J|G)Os
     First experiments will be done as module
       • if successful, possibly integrated in core

     term.match { // or match(term) {}
                     Num(value) {}
                     Plus(left, right) {}
                     Num(value: 5) {}
                     Num(value > 0) {}
                     Plus(left: Plus(left: a, right: 2), right) {}
                     Plus(left: a, right: b) | Minus(left: a, right: b) {}
                     Object(left, right) {}
                     nothing { }
       }




                                                                             45

lundi 22 mars 2010
Parser combinators

     Same as pattern matching, experiments need to be done as a module,
       before possible integration in core
       • Also need Groovy modularity to be implemented



     def language = grammar {
                 digit: ~/[0-9]/
                 letter: ~/[a-zA-Z]/
                 identifier: letter + ( letter | digit ){n}
                 number: digit{n}
       }
       grammar.parse(...)




                                                                       46

lundi 22 mars 2010
nda
                   Ag e
                                                                                            • Summary

                                                                                            • Questions & Answers




    Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   47
lundi 22 mars 2010
Summary



     Groovy, still inovative, since 2003!
       • Newever versions always bring their share of new features and libraries to simplify the
         life of the developer
       • And there’s more to come!



     But Groovy’s more than just a language, it’s a very active and lively
       ecosystem with tons of great projects
       • Grails, Gradle, GPars, Spock, Gaelyk, etc...




                                                                                               48

lundi 22 mars 2010
Questions & Answers




                          49

lundi 22 mars 2010
Photo credits

       Caution: http://www.disastersuppliesusa.com/catalog/ee44.jpg

       Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png




                                                                                           50

lundi 22 mars 2010

Contenu connexe

Similaire à Groovy 1 7 Update, past, present, future - S2G Forum 2010

Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009
Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009
Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009Guillaume Laforge
 
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume LaforgeGroovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume LaforgeGuillaume Laforge
 
Go, Docker & Kubernetes
Go, Docker &  KubernetesGo, Docker &  Kubernetes
Go, Docker & KubernetesGlobant
 
Implementing Groovy Domain-Specific Languages - S2G Forum - Munich 2010
Implementing Groovy Domain-Specific Languages - S2G Forum - Munich 2010Implementing Groovy Domain-Specific Languages - S2G Forum - Munich 2010
Implementing Groovy Domain-Specific Languages - S2G Forum - Munich 2010Guillaume Laforge
 
Introduction to go lang
Introduction to go langIntroduction to go lang
Introduction to go langAmal Mohan N
 
Laug Mootools And Common Js
Laug   Mootools And Common JsLaug   Mootools And Common Js
Laug Mootools And Common JsSkills Matter
 
Building Apps with PhoneGap
Building Apps with PhoneGap Building Apps with PhoneGap
Building Apps with PhoneGap alunny
 
Introduction to Go
Introduction to GoIntroduction to Go
Introduction to Gozhubert
 
Ruby JIT Compilation - Mykhail Bortnyk
Ruby JIT Compilation - Mykhail Bortnyk Ruby JIT Compilation - Mykhail Bortnyk
Ruby JIT Compilation - Mykhail Bortnyk Ruby Meditation
 
Ruby JIT Compilation
Ruby JIT CompilationRuby JIT Compilation
Ruby JIT CompilationAmoniac OÜ
 
CPSeis &amp; GeoCraft
CPSeis &amp; GeoCraftCPSeis &amp; GeoCraft
CPSeis &amp; GeoCraftbillmenger
 
Survivability of software projects in Gnome: A replication study
Survivability of software projects in Gnome: A replication studySurvivability of software projects in Gnome: A replication study
Survivability of software projects in Gnome: A replication studyTom Mens
 
JBoss @ Slovakia, UNIZA & TUKE Universities November 2013
JBoss @ Slovakia, UNIZA & TUKE Universities November 2013JBoss @ Slovakia, UNIZA & TUKE Universities November 2013
JBoss @ Slovakia, UNIZA & TUKE Universities November 2013Vaclav Tunka
 
Bar Camp Auckland - Mongo DB Presentation BCA4
Bar Camp Auckland - Mongo DB Presentation BCA4Bar Camp Auckland - Mongo DB Presentation BCA4
Bar Camp Auckland - Mongo DB Presentation BCA4John Ballinger
 
JBoss @ CVUT FIT April 2013
JBoss @ CVUT FIT April 2013JBoss @ CVUT FIT April 2013
JBoss @ CVUT FIT April 2013Vaclav Tunka
 
GoLang - Why It Matters
GoLang -  Why It MattersGoLang -  Why It Matters
GoLang - Why It Mattersrahul
 
Feelin' Groovy: An Afternoon of Reflexive Metaprogramming
Feelin' Groovy: An Afternoon of Reflexive MetaprogrammingFeelin' Groovy: An Afternoon of Reflexive Metaprogramming
Feelin' Groovy: An Afternoon of Reflexive MetaprogrammingMatt Stine
 

Similaire à Groovy 1 7 Update, past, present, future - S2G Forum 2010 (20)

Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009
Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009
Groovy, to Infinity and Beyond - Groovy/Grails eXchange 2009
 
Základy GWT
Základy GWTZáklady GWT
Základy GWT
 
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume LaforgeGroovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
 
Go, Docker & Kubernetes
Go, Docker &  KubernetesGo, Docker &  Kubernetes
Go, Docker & Kubernetes
 
Implementing Groovy Domain-Specific Languages - S2G Forum - Munich 2010
Implementing Groovy Domain-Specific Languages - S2G Forum - Munich 2010Implementing Groovy Domain-Specific Languages - S2G Forum - Munich 2010
Implementing Groovy Domain-Specific Languages - S2G Forum - Munich 2010
 
Introduction to go lang
Introduction to go langIntroduction to go lang
Introduction to go lang
 
Laug Mootools And Common Js
Laug   Mootools And Common JsLaug   Mootools And Common Js
Laug Mootools And Common Js
 
Building Apps with PhoneGap
Building Apps with PhoneGap Building Apps with PhoneGap
Building Apps with PhoneGap
 
Introduction to Go
Introduction to GoIntroduction to Go
Introduction to Go
 
Golang
GolangGolang
Golang
 
Ruby JIT Compilation - Mykhail Bortnyk
Ruby JIT Compilation - Mykhail Bortnyk Ruby JIT Compilation - Mykhail Bortnyk
Ruby JIT Compilation - Mykhail Bortnyk
 
Ruby JIT Compilation
Ruby JIT CompilationRuby JIT Compilation
Ruby JIT Compilation
 
CPSeis &amp; GeoCraft
CPSeis &amp; GeoCraftCPSeis &amp; GeoCraft
CPSeis &amp; GeoCraft
 
Whats New In Groovy 1.6?
Whats New In Groovy 1.6?Whats New In Groovy 1.6?
Whats New In Groovy 1.6?
 
Survivability of software projects in Gnome: A replication study
Survivability of software projects in Gnome: A replication studySurvivability of software projects in Gnome: A replication study
Survivability of software projects in Gnome: A replication study
 
JBoss @ Slovakia, UNIZA & TUKE Universities November 2013
JBoss @ Slovakia, UNIZA & TUKE Universities November 2013JBoss @ Slovakia, UNIZA & TUKE Universities November 2013
JBoss @ Slovakia, UNIZA & TUKE Universities November 2013
 
Bar Camp Auckland - Mongo DB Presentation BCA4
Bar Camp Auckland - Mongo DB Presentation BCA4Bar Camp Auckland - Mongo DB Presentation BCA4
Bar Camp Auckland - Mongo DB Presentation BCA4
 
JBoss @ CVUT FIT April 2013
JBoss @ CVUT FIT April 2013JBoss @ CVUT FIT April 2013
JBoss @ CVUT FIT April 2013
 
GoLang - Why It Matters
GoLang -  Why It MattersGoLang -  Why It Matters
GoLang - Why It Matters
 
Feelin' Groovy: An Afternoon of Reflexive Metaprogramming
Feelin' Groovy: An Afternoon of Reflexive MetaprogrammingFeelin' Groovy: An Afternoon of Reflexive Metaprogramming
Feelin' Groovy: An Afternoon of Reflexive Metaprogramming
 

Plus de Guillaume Laforge

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Guillaume Laforge
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Guillaume Laforge
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Guillaume 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
 

Plus de Guillaume Laforge (20)

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
Groovy 2 and beyond
Groovy 2 and beyondGroovy 2 and beyond
Groovy 2 and beyond
 
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 1 7 Update, past, present, future - S2G Forum 2010

  • 1. Groovy, past, present, future with a 1.7 update Guillaume Laforge Groovy Project Manager © 2010 SpringSource, A division of VMware. All rights reserved lundi 22 mars 2010
  • 2. Guillaume Laforge  Groovy Project Manager •working on Groovy since 2003  G2One ➜ SpringSource ➜ VMWare  Initiated the creation of Grails  Co-author of Groovy in Action  Speaker: JavaOne, QCon, Devoxx, JavaZone, SpringOne, JAX, DSL DevCon, Google I/O, and many more... 2 lundi 22 mars 2010
  • 3. Contact information  Email • glaforge@vmware.com  Twitter • @glaforge  Blog • http://glaforge.free.fr/blog/groovy  Groovy mailing-lists • http://old.nabble.com/codehaus---Groovy-f11866.html 3 lundi 22 mars 2010
  • 4. A little story 4 lundi 22 mars 2010
  • 5. About the content  This presentation was prepared with the examples I’ve used in my article written for InfoQ • http://www.infoq.com/articles/groovy-1-6  And from the release notes I’ve prepared for Groovy 1.7 • http://groovy.codehaus.org/Groovy+1.7+release+notes  For more information, don’t hesitate to read those two articles! 5 lundi 22 mars 2010
  • 6. Most popular alternative language for the JVM  In terms of... • Poll and survey popularity • Books available on the shelves • Jobs on the job boards • Integration in other products • Download numbers • Community activity • Innovation 6 lundi 22 mars 2010
  • 7. In terms of polls & surveys 7 lundi 22 mars 2010
  • 8. In terms of books 8 lundi 22 mars 2010
  • 9. In terms of jobs 9 lundi 22 mars 2010
  • 10. In terms of integration in other projects and products  Groovy is integrated in many Open Source projects and Commercial products • Spring, IntelliJ IDEA, SAP Composition on Grails, RIFE, Mule ESB, Apache Camel, eXo Platform, SOAP UI, JBoss SEAM, XWiki, Oracle OC4J, SpringSource tcServer, Oracle Data Integrator, Canoo WebTest, Oracle Busines Components, IBM WebSphere sMash, CodeStreet MarketData Works, SpringSource Hyperic HQ • Mutual of Omaha, US National Cancer Institute, Patterson Institute for Cancer Research, IRSN, European Patent Office...  and many more I’ve omitted! 10 lundi 22 mars 2010
  • 11. In terms of download numbers  Number of downloads per month • 2003: a few hundreds • 2005: ~5k • 2008: ~35k • 2009: ~70k  Add to that number • all the integrations... • all the artifacts downloads from Maven’s repository!  Highly successful OSS project! 11 lundi 22 mars 2010
  • 12. In terms of community activity  Very high traffic on the mailing-lists • 1500+ members  Dedicated conferences • Groovy Grails eXchange • SpringOne 2GX • GR8 Conference (Europe / USA) • Excellent coverage of Groovy and Grails at all major conferences around the world  Dedicated podcast • GrailsPodcast  Dedicated online PDF magazine • GroovyMag 12 lundi 22 mars 2010
  • 13. In terms of innovation  JAX Innovation Award • Biggest German Java conference  Groovy won first prize in 2007 • Grails scored second in 2008 • Spring arrived first in 2006 13 lundi 22 mars 2010
  • 14. Playing with Groovy  You can play with these examples within the Groovy Web Console hosted on Google App Engine • http://groovyconsole.appspot.com 14 lundi 22 mars 2010
  • 15. nda Ag e • Past (Groovy 1.6) • Present (Groovy 1.7) • Future (Groovy 1.8+) Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 15 lundi 22 mars 2010
  • 16. nda Ag e • Past (Groovy 1.6) – Syntax enhancements – Compile-time metaprogramming – The Grape module system – Miscelanous •Runtime metaprogramming additions •Built-in JSR-223 scripting engine •JMX Builder •OSGi readiness Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 16 lundi 22 mars 2010
  • 17. Multiple assignments  Newly defined variables •def (a, b) = [1, 2] assert a == 1 && b == 2  Typed variables •def (int a, int b) = [1, 2]  Assign to existing variables •def lat, lng (lat, lng) = geocode(‘Paris’)  The classical ‘swap case’ •(a, b) = [b, a] 17 lundi 22 mars 2010
  • 18. More optional returns  Return value of last expression of the last if/else, try/catch, switch/ case statement  def m1() { if (true) 1 else 0 }  def m2(b) { try { if (b) throw new Exception() 1 } catch(any) { 2 } finally { 3 } } assert m2(false) == 1 && m2(true) == 2 18 lundi 22 mars 2010
  • 19. Compile-time metaprogramming  With metaprogramming, Groovy’s able to modify the behaviour of programs... at runtime  Groovy 1.6 introduced AST Transformations • AST: Abstract Syntax Tree • Ability to change what’s being compiled at compile-time! • No runtime impact! • Lets you change the semantics of your programs! • Nice way of implementing patterns and removing boiler-plate technical code  Two kinds of transformations: global and local 19 lundi 22 mars 2010
  • 20. AST Transformations in Groovy 1.6  Several transformations finds their way • @Singleton — okay, not really a pattern :-) • @Immutable, @Lazy, @Delegate •@Newify • @Category and @Mixin •@PackageScope • Swing’s @Bindable and @Vetoable • Grape’s @Grab  Let’s have a look at some of them 20 lundi 22 mars 2010
  • 21. The @Singleton anti-pattern  The evil Java singleton •public class Evil { public static final Evil instance = new Evil(); privavte Evil() {} Evil getInstance() { return instance; } }  In Groovy now: •@Singleton class Evil {}  A lazy version also: •@Singleton(lazy = true) class Evil {} 21 lundi 22 mars 2010
  • 22. @Immutable  To properly implement immutable classes • No mutators (state musn’t change) • Private final fields • Defensive copying of mutable components • Proper equals() / hashCode() / toString() for comparisons, or for keys in maps, etc. •@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 22 lundi 22 mars 2010
  • 23. @Lazy, not just for lazy dudes!  When you need to lazily evaluate or instantiate complex data structures for class fields, mark them with the @Lazy annotation •class Dude { @Lazy pets = retrieveFromSlowDB() }  Groovy will handle the boiler-plate code for you! 23 lundi 22 mars 2010
  • 24. @Delegate, not just for managers!  You can delegate to fields of your class • Think multiple inheritance •class Employee { def doTheWork() { "done" } } class Manager { @Delegate Employee slave = new Employee() } def god = new Manager() assert god.doTheWork() == "done"  Damn manager will get all the praise... 24 lundi 22 mars 2010
  • 25. Grab a Grape  Groovy Advanced Packaging Engine • Helps you distribute scripts without dependencies • Just declare your dependencies with @Grab • Will look for dependencies in Maven or Ivy repositories •@Grab( group = 'org.mortbay.jetty', module = 'jetty-embedded', version = '6.1.0' ) def startServer() { def srv = new Server(8080) def ctx = new Context(srv , "/", SESSIONS) ctx.resourceBase = "." ctx.addServlet(GroovyServlet, "*.groovy") srv.start() } 25 lundi 22 mars 2010
  • 26. ExpandoMetaClass DSL  Before •Number.metaClass.multiply = { Amount amount -> amount.times(delegate) } Number.metaClass.div = { Amount amount -> amount.inverse().times(delegate) }  In Groovy 1.6 •Number.metaClass { multiply { Amount amount -> amount.times(delegate) } div { Amount amount -> amount.inverse().times(delegate) } } 26 lundi 22 mars 2010
  • 27. Runtime mixins  Inject new behavior to types at runtime •class FlyingAbility { def fly() { "I'm ${name} and I fly!" } } class JamesBondVehicle { String getName() { "James Bond's vehicle" } } JamesBondVehicle.mixin FlyingAbility assert new JamesBondVehicle().fly() == "I'm James Bond's vehicle and I fly!" 27 lundi 22 mars 2010
  • 28. Miscelanous  JMX builder • A new builder for easily exposing, interacting with JMX beans, listening to event, defining timers, etc.  OSGi • Groovy’s JAR is already OSGi compatible by sporting the right attributes in the manifest  JSR-223 • An implementation of the javax.script.* APIs is now part of Groovy by default  Swing console • Customizable graphical representation of results • Clickable stacktraces and error messages • Drag’n Drop, code indentation, add JARs to the classpath 28 lundi 22 mars 2010
  • 29. nda Ag e • Present (Groovy 1.7) – Inner classes – Annotations – Grape enhancements – Power asserts – AST viewer and AST builder – Customize the Groovy Truth Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 29 lundi 22 mars 2010
  • 30. AIC and NC  AIC: Anonymous Inner Classes NC: Nested Classes  For Java-compatibility sake, we’re brining AIC / NC support into Groovy • copy’n paste compatibility? :-)  Not much to see beyond the usual standard Java AIC / NC concept 30 lundi 22 mars 2010
  • 31. Annotations everywhere!  Groovy supports of annotations since Groovy 1.5 • a couple minor differences, for instance for arrays  In Groovy 1.7, you can add annotations on • imports • packages • variable declarations  Handy for Grape!  Source-level annotations, available through the AST 31 lundi 22 mars 2010
  • 32. Terser Grape  Ability to put the @Grab annotation on imports! •@Grab(group = 'net.sf.json-lib', module = 'json-lib', version = '2.3', classifier = 'jdk15') import net.sf.json.groovy.* •def root = new JsonSlurper().parseText(...)  Put @Grab on variable declarations and use the shorter notation •@Grab('net.sf.json-lib:json-lib:2.3:jdk15') def builder = new net.sf.json.groovy.JsonGroovyBuilder() 32 lundi 22 mars 2010
  • 33. Grab resolver  Dependencies aren’t always available in Maven’s repository, so you may need to specify a different place to search libraries • before, one had to modify grapeConfig.xml  Groovy 1.7 introduces a Grape resolver •@GrabResolver(name = 'restlet.org', root = 'http://maven.restlet.org') @Grab(group = 'org.restlet', module =' org.restlet', version='1.1.6') import org.restlet.Restlet // ... 33 lundi 22 mars 2010
  • 34. Power Asserts  Enhanced assert statement and output •def energy = 7200 * 10**15 + 1 def mass = 80 def celerity = 300000000 assert energy == mass * celerity ** 2 34 lundi 22 mars 2010
  • 35. AST transformations  With Groovy 1.6 came AST transformations  But... • you need a deep knowledge of the Groovy internals • it’s not easy to know what the AST looks like • writing transformations can be pretty verbose  Groovy 1.7 introduces • an AST viewer • an AST builder 35 lundi 22 mars 2010
  • 36. AST Viewer 36 lundi 22 mars 2010
  • 37. AST Builder  Ability to build AST parts • from a String •new AstBuilder().buildFromString(''' "Hello" ''') • from code •new AstBuilder().buildFromCode { "Hello" } • from specification •List<ASTNode> nodes = new AstBuilder().buildFromSpec { block { returnStatement { constant "Hello" } } } 37 lundi 22 mars 2010
  • 38. Customize the Groovy Truth!  Ability to customize the Groovy Truth by implementing of method boolean asBoolean()  Your own predicate •class Predicate { boolean value boolean asBoolean() { value } } if (new Predicate(value: false)) { println true } else { println false } 38 lundi 22 mars 2010
  • 39. SQL improvements  Batch updates •sql.withBatch { stmt -> ["Paul", "Jochen", "Guillaume"].each { name -> stmt.addBatch "insert into PERSON (name) values ($name)" } }  Transactions •def persons = sql.dataSet("person") sql.withTransaction { persons.add name: "Paul" persons.add name: "Jochen" persons.add name: "Guillaume" } 39 lundi 22 mars 2010
  • 40. nda Ag e • Future (Groovy 1.8+) – Extended annotations – DSL: command statements improvements – Pattern matching – Parser combinators – New MOP – JDK 7 •Project Coin •Simple closures for Java •InvokeDynamic Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 40 lundi 22 mars 2010
  • 41. Groovy 1.8 and beyond... • Caution! • The following features are still subject to discussion, and may very well never see the light of day! lundi 22 mars 2010
  • 42. Groovy 1.8, end of 2010  Plan to provide various runtime improvements to make Groovy faster and faster • Avoiding most synchronization (volatile fields, explicit synchronization, etc...) • Leveraging the Java Memory Model operation ordering to simulate synchronization  Make Groovy more modular • Probably using Grape’s module system • Breaking Groovy into smaller JARs • not everybody needs everything (JMX, SQL, Swing...)  Align Groovy with JDK 7 / Java 7 • Review project coin proposals where it makes sense • Incorporate / integrate with InvokeDynamic (JSR-292) • Interoperate with Java simple closures 42 lundi 22 mars 2010
  • 43. Extended annotations  Go beyond Java 5, and let annotations support more type parameters • closures, lists, maps, ranges  Possible use cases • validation, pre- and post-conditions • @Validate({ name.size() > 4 }) String name •@PreCondition({ msg != null }) void outputToUpperCase(String msg) { println msg.toUpperCase() } 43 lundi 22 mars 2010
  • 44. Command-expression based DSL  Groovy lets you omit parentheses for top-level expressions, and mix named and non-named arguments  Idea: extend to nested/chained expressions • send "Hello" to "Jochen" send "Hello", from: "Guillaume" to "Jochen" sell 100.shares of VMW take 2.pills of chloroquinine in 6.hours every 10.minutes do { } given { } when { } then { } blend red, green of acrylic  Plays nicely with Java builder style APIs! 44 lundi 22 mars 2010
  • 45. Pattern matching  Structural pattern matching on PO(J|G)Os  First experiments will be done as module • if successful, possibly integrated in core  term.match { // or match(term) {} Num(value) {} Plus(left, right) {} Num(value: 5) {} Num(value > 0) {} Plus(left: Plus(left: a, right: 2), right) {} Plus(left: a, right: b) | Minus(left: a, right: b) {} Object(left, right) {} nothing { } } 45 lundi 22 mars 2010
  • 46. Parser combinators  Same as pattern matching, experiments need to be done as a module, before possible integration in core • Also need Groovy modularity to be implemented  def language = grammar { digit: ~/[0-9]/ letter: ~/[a-zA-Z]/ identifier: letter + ( letter | digit ){n} number: digit{n} } grammar.parse(...) 46 lundi 22 mars 2010
  • 47. nda Ag e • Summary • Questions & Answers Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 47 lundi 22 mars 2010
  • 48. Summary  Groovy, still inovative, since 2003! • Newever versions always bring their share of new features and libraries to simplify the life of the developer • And there’s more to come!  But Groovy’s more than just a language, it’s a very active and lively ecosystem with tons of great projects • Grails, Gradle, GPars, Spock, Gaelyk, etc... 48 lundi 22 mars 2010
  • 49. Questions & Answers 49 lundi 22 mars 2010
  • 50. Photo credits Caution: http://www.disastersuppliesusa.com/catalog/ee44.jpg Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png 50 lundi 22 mars 2010