SlideShare a Scribd company logo
を10分で紹介する
JavaOne Tokyo 2012 JVM言語BOF

   日本Grails/Groovyユーザ会
    NTTソフトウェア株式会社
          上原 潤二

          2012.4.4
自己紹介
上原潤二(@uehaj)
 NTTソフトウェア株式会社 Grails推進室
 JGGUG運営委員
 本書いた!
   プログラミングGROOVY(技術評論社)
   Grails徹底入門(翔泳社)
 ブログ「Grな日々」
 GroovyServ, LispBuilder, GVM開発者
アジェンダ
Groovyの概要
Groovyの機能紹介
 AST変換
 静的Groovyの歩み




 3
Groovyとは何か
  Java VM上で動作する今どきのスクリプト言語
    Javaと互換性がある・連携しやすい
    ➡正しいJavaコードは 正しいGroovyコード
                      ほぼ


  ツール、フレームワーク、ライブラリ群から成る
  エコシステム

           Groovyエコシステム
   ツール          フレームワー      ライブラリ
Gradle, Gant,     ク        GroovyFX,
   Spock,       Grails,     GPars,...
       4
他の言語と比べると・・・貪欲
 良いところはイタダク!
  大クラス主義,コレクション操作,etc.
  マルチメソッド
  GPars(並列処理モデルの総合デパート)
   Actor/STM/Agent/Dataflow/callAsync/
   ParallelArray/MapReduce/ForkJoin/CSP/....




    5
特徴的な機能:AST変換
C/C++の「プリプロセッサマクロ」の
ようにコードをコンパイル時に変換する
アノテーションで起動する
例: @WithReadWriteLock
 Read Write Lock
   書き中の書きはブロック
   書き中の読みはブロック
   読み中の書きはブロック
   読み中の読みはブロックしない
@WithReadWriteLock
import groovy.transform.WithReadLock
import groovy.transform.WithWriteLock

class Sample {
    @WithReadLock
    char[] read(){
        // 読み出しアクセス
      }
      @WithWriteLock
      void write(char c){
          // 書き込みアクセス
    }
}
            ※java.util.concurrent.locks.ReadWriteLockをさらに容易
            に使うためのラッパー

            7
多数のAST変換
Bindable               InheritConstructors
ListenerList           NotYetImplemented
Vetoable               PackageScope
Category               Synchronized
Delegate               ThreadInterrupt
Lazy                   TimedInterrupt
Mixin                  ToString
Newify                 TupleConstructor
Singleton              TypeChecked
AutoClone              WithReadLock
AutoExternalize        WithWriteLock
Canonical              Commons
CompileStatic          Log
ConditionalInterrupt   Log4j
EqualsAndHashCode      Slf4j
Field                  Grab
Immutable              power assert
IndexedProperty
       8
Groovyの新機能(2.0∼)
   Java 7対応
    二進リテラル
    リテラル中の下線
    マルチキャッチ
    InvokeDynamic対応
    try-with-resourceなどはいまのところ未
   Groovy自体のモジュール化
   静的型チェック
   静的コンパイル
    9
静的Groovyの歩み

                      静的型チェッ
                      ク(STC)
 G++
                      静的コンパイル
2009∼2011             (experimentalブランチ)

                        Groovy 2.0.0-beta-x
            コードベースの      2011∼
            継続性はない
     10
STC/静的コンパイル(AST変換)

 @TypeChecked
  ➡静的型チェック(型を確定することでわかるエ
    ラーをコンパイル時にチェック)
 @CompileStatic
  ➡静的コンパイル(性能向上)




       11
STC:フローセンシティブタイピング


def a = -3

a.abs()
a.toUpperCase()

a = "ABC"

a.abs()
a.toUpperCase()
    12
STC:フローセンシティブタイピング

                  aはint型と
def a = -3

a.abs()
a.toUpperCase()

a = "ABC"

a.abs()
a.toUpperCase()
    12
STC:フローセンシティブタイピング

                  aはint型と
def a = -3

a.abs()
a.toUpperCase()

a = "ABC"          aはString型

a.abs()
a.toUpperCase()
    12
STC:フローセンシティブタイピング

                  aはint型と
def a = -3
                      [Static type checking] -
a.abs()              Cannot find matching
                     method
a.toUpperCase()      java.lang.Integer#toUpperCa
                     se()
a = "ABC"          aはString型

a.abs()
a.toUpperCase()
    12
STC:フローセンシティブタイピング

                  aはint型と
def a = -3
                        [Static type checking] -
a.abs()                Cannot find matching
                       method
a.toUpperCase()        java.lang.Integer#toUpperCa
                       se()
a = "ABC"          aはString型

a.abs()
                    [Static type checking] - Cannot
a.toUpperCase()    find matching method
    12
                   java.lang.String#abs()
静的コンパイル
 String foo(String s) {
     s.toUpperCase()
 }




 @CompileStatic
 String bar(String s) {
     s.toUpperCase()
 }
静的コンパイル
 String foo(String s) {
     s.toUpperCase()
 }             public String   foo(String s)
                {
                  CallSite acallsite[] = $getCallSiteArray();
                  return
                (String)ScriptBytecodeAdapter.castToType(acallsite[
                0].call(s), java/lang/String);
                }
 @CompileStatic
 String bar(String s) {
     s.toUpperCase()
 }
静的コンパイル
 String foo(String s) {
     s.toUpperCase()
 }             public String   foo(String s)
                {
                  CallSite acallsite[] = $getCallSiteArray();
                  return
                (String)ScriptBytecodeAdapter.castToType(acallsite[
                0].call(s), java/lang/String);
                }
 @CompileStatic
 String bar(String s) {
     s.toUpperCase()
 }              public String bar(String s)
                 {
                     return s.toUpperCase();
                 }
なぜSTC/静的コンパイルなのか?
  Groovyの利点: 動的・簡潔・高機
  能・コンパイル不要…
   「動的」が不要な人→STC
  indyを待てない/indy以上の速度→静
  的コンパイル




    14
まとめ
続きはコーディング大会で…!




  15
参考リンク
http://www.jroller.com/melix/entry/
static_type_checking_talk_from




     16

More Related Content

Java One 2012 Tokyo JVM Lang. BOF(Groovy)

Editor's Notes

  1. 17:00スタート。17:40まで。\n\nScala, Jrubyは競合しない。それぞれの良さがある。\n\n
  2. Grな日々、2007年から執筆しています。\n日本初のオリジナル書籍プログラミングGroovyを執筆しました。\n
  3. こんな感じでぱぱっと紹介します。\nごくごくかいつまんで\n
  4. \n
  5. http://www.cspjapan.org/index.htm\nCommunicating Sequential Processes\n\nDartsはGroovyをぱくってる!\n
  6. \n
  7. \n
  8. \n
  9. java.util.concurrent.locks.ReadWriteLockを使ったコードに変換してくれます。\n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. 「高機能なJava」「簡潔なJava」「コンパイル不要Java」としてGroovyを使う人も少なからずいる\n\n
  21. \n
  22. \n