SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
Groovy
                         基礎勉強会
                          Groovy実行の基礎
                      ∼コンパイラ処理系としての
                         Groovyを読み解く∼
                             2013/3/9 @青山オラクルセンター
                          NTTソフトウェア Grails推進室 上原潤二

        Slide # 1   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
自己紹介
      上原潤二(@uehaj)
         NTTソフトウェア株式会社Grails推進室
         JGGUG(日本Grails/Groovyユーザグループ)運営委員
         書籍執筆:
             プログラミングGROOVY(技術評論社)
             Grails徹底入門(翔泳社)
         G*Magazine Vol 6記事書きました →
         ブログ「Grな日々」
         GroovyServ, LispBuilder,
         GVM(Groovy JVM),
         Staticalizer開発者



        Slide #   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
お品書き
                    Groovyの実行のしくみ
                    ANTLRによる構文解析
                    ASMによるコード生成
                    まとめ


        Slide # 3   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
Groovy実行
          のしくみ

        Slide # 4   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
Groovyソースツリー
  src/main                        │ ├─builder                        │ ├─typehandling
  ├─groovy                        │ ├─expr                           │ └─wrappers
  │ ├─beans                       │ ├─stmt                           ├─syntax
  │ ├─grape                       │ └─tools                          ├─tools
  │ ├─inspect     今日の             ├─classgen                         │ ├─ast
  │ ├─io                          │ └─asm                            │ ├─gse
  │ ├─lang        テーマ             │    ├─indy                        │ ├─javac
  │ ├─security                    │    └─sc                          │ ├─shell
  │ ├─time                        ├─cli                              │ │ └─util
  │ ├─transform                   ├─control                          │ └─xml
  │ ├─ui                          │ ├─customizers                    ├─transform
  │ ├─util                        │ │ └─builder                      │ ├─sc
  │ │ └─logging                   │ ├─io                             │ │ └─transformers
  │ └─xml                         │ └─messages                       │ └─stc
  └─org                           ├─plugin                           ├─util
    ├─apache                      ├─reflection                       └─vmplugin
    │ └─commons                   │ └─stdclasses                      ├─v5
    │    └─cli                    ├─runtime                           ├─v6
    └─codehaus                    │ ├─callsite                        └─v7
      └─groovy                    │ ├─dgmimpl
       ├─antlr                    │ │ └─arrays
       │ ├─java                   │ ├─m12n
       │ ├─parser                 │ ├─memoize
       │ └─treewalker             │ ├─metaclass
       ├─ast                      │ ├─powerassert

        Slide # 5   Groovy基礎勉強会      Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
Javaコードの実行
                Javaソース

             javacコマンド

                 .classファイル


                       javaコマンド
   JVM


                標準クラスローダ

                     Javaクラス



         Slide # 6   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
Groovyコードの実行
                Javaソース                                          Groovyコード

             javacコマンド             groovycコマンド

                 .classファイル              .classファイル



                       javaコマンド                                     groovyコマンド
   JVM

                                                  Groovyクラスローダ
                標準クラスローダ                         (オンメモリ実行時コンパイラ)


                     Javaクラス            Javaクラス                               Javaクラス



         Slide # 7   Groovy基礎勉強会                             2011
                                   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
Groovyコードの実行
                                                                 Groovyコード

                                   groovycコマンド

                                         .classファイル


                                                                    groovyコマンド
   JVM

                標準クラスローダ                          Groovyクラスローダ
                                                 (オンメモリ実行時コンパイラ)


                                        Javaクラス                               Javaクラス



         Slide # 8
                 6   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
Groovyコード実行のためのコマンドとクラス

    groovycコマンド                     groovyコマンド                                   groovysh


                                   groovy.ui.GroovyMain
   o.c.g.tools.FileS                                                                groovyConsole
   ystemCompiler                  groovy.lang.GroovyShell
                                                                                 groovy.util.Groo
                                                                                 vyScriptEngine
                                  groovy.lang.GroovyClass
                                           Loader

     org.codehaus.groovy.controll.CompilationUnit


        Slide # 9   Groovy基礎勉強会        Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
CompilationUnit
             org.codehaus.groovy.controll.CompilationUnit


       CompilationUnitはコンパイル処理の中核
         「コンパイル処理を実行する単位」を表わすと同時
         にコンパイルのすべての過程を制御している。




        Slide # 10   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
JavaAwareCompilationUnit extends CompilationUnit




  (余談)JavaAwareCompilationUnit
                       extends CompilationUnit
                       ジョイントコンパイルオプション(-j,
                      --jointCompilation)を指定した場合に発動
                      Groovyソースに加えJavaソースをコンパイル
                      する能力を持つ
                      -jをつけないと、拡張子.javaのファイルは
                      Groovyコードとして解釈/コンパイルされる(!!)



                               Slide # 11          Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
 13年3月9日土曜日
CompilationUnit#compile()

   public	
  void	
  compile()	
  ..	
  {
   	
  	
  	
  	
  compile(Phases.ALL);	
  //全フェイズのコンパ
   イル処理を実行
   }

   public	
  void	
  compile(int	
  throughPhase)	
  ..	
  {
   //	
  指定したフェイズ「まで」コンパイル処理実行
   	
  	
  :
   }




        Slide # 12   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
フェイズとは何か?
      CompilationUnitが保持するコンパイルの進行
      状態である。
   INITIALIZATION(1)	
  	
  	
  	
  	
  	
  	
  	
  //ファイルを開いたり
   PARSING(2)	
  	
  	
  	
  	
  	
  	
  	
  	
  //字句・構文解析、ANTLRのAST構築
   CONVERSION(3)	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //CSTからASTへの変換
   SEMANTIC_ANALYSIS(4)	
  	
  	
  	
  	
  //ASTの意味解析と解明
   CANONICALIZATION(5)	
  	
  	
  	
  	
  	
  //ASTの補完
   INSTRUCTION_SELECTION(6)	
  //クラス生成(フェーズ1)
   CLASS_GENERATION(7)	
  	
  	
  	
  	
  	
  //クラス生成(フェーズ2)
   OUTPUT(8)	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //クラスをファイルに出力
   FINALIZATION(9)	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //後始末
   ALL(9)	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //後始末まですべて実行
        Slide # 13   Groovy基礎勉強会            Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
(参考) ASTとは?
       AST…Abstract Syntax Tree,抽象構文木
         構文木の一種で、論理的な構造を表わす
                CST(Concrete Syntax Tree, 具象構文木)

     例えば「a.foo(b,c)」を構文解析すると…
             CST                 .                         AST
                                                                              .
                         a           foo
                                                                     a            foo
                                           ()
                                     ,                                     b                 c
                             b             c

        Slide # 14   Groovy基礎勉強会               Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
GroovyConsoleのGroovy AST Browser




        Slide # 15   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
フェイズにもとづいたコンパイル処理

      CompilationUnitに、フェイズを指定して種々
      のphaseOperation(後述)を追加することで処
      理が制御される
         CompilationUnit#addPhaseOperation()
      あらかじめ決まっているもの以外に、以下が実
      行時に追加される
         AST変換
         CompilerCustomizerとしてのAST変換



        Slide # 16   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
(参考)フェイズとAST変換
      AST変換は、それぞれ適用されるフェイズを
      指定して定義されている
            フェイズ                                      実行されるAST変換
   INITIALIZATION                       -
   PARSING                              -
   CONVERSION                           @Grab
   SEMANTIC_ANALYSIS                    @Field, @Log, @PackageScope,
   CANONICALIZATION                     ほとんどのAST変換がここに所属
   INSTRUCTION_SELECTIO                 @TypeChecked, @CompileStatic
                                           CategoryASTTransformation
   CLASS_GENERATION
   N                                    -
                                           DelegateASTTransformation
   OUTPUT                               -
   FINALIZATION                         -
                                        ImmutableASTTransformation
        Slide # 17   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
phaseOperations
      PARSING:                                               AnnotationCollectorTransform
         SourceUnit#parse()                                  StaticVerifier
         AntlrParserPlugin#parseCST()//                      InnerClassCompletionVisitor
         CSTを作る                                              EnumCompletionVisitor
      CONVERSION:                                         CANONICALIZATION:
         convert(SourceUnit#convert() //                     compileCompleteCheck
         Generates an AST from the CST),                  CLASS_GENERATION:
         AntlrParserPlugin.buildAST()//
                                                             classgen(OptimizerVisitor,Generics
         ANTLR ASTからGroovyのASTを生成
                                                             Visitor, LabelVerifier,
         EnumVisitor                                         ClassCompletionVerifier,
      SEMANTIC_ANALYSIS:                                     ExtendedVerifier, ClassVisitor,
         resolve(VariableScopeVisitor,                       AsmClassGenerator)
         ResolveVisitor)                                  OUTPUT:
         staticImport(StaticImportVisitor)                   output
         InnerClassVisitor

        Slide # 18   Groovy基礎勉強会         Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
phaseOperations
      PARSING:                                             AnnotationCollectorTransform
         SourceUnit#parse()                                StaticVerifier
         AntlrParserPlugin#parseCST()//                    InnerClassCompletionVisitor
         CSTを作る                                            EnumCompletionVisitor
      CONVERSION:                                       CANONICALIZATION:
         convert(SourceUnit#convert() //                   compileCompleteCheck
         Generates an AST from the CST),                CLASS_GENERATION:
         AntlrParserPlugin.buildAST()//
                                                           classgen(OptimizerVisitor,Generics
         ANTLR ASTからGroovyのASTを生成
                                                           Visitor, LabelVerifier,
         EnumVisitor                                       ClassCompletionVerifier,
      SEMANTIC_ANALYSIS:               今日の                 ExtendedVerifier, ClassVisitor,
         resolve(VariableScopeVisitor,      AsmClassGenerator)
         ResolveVisitor)
                                       テーマ OUTPUT:
         staticImport(StaticImportVisitor)                 output
         InnerClassVisitor

        Slide # 18   Groovy基礎勉強会       Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
ANTLRによる
           構文解析

        Slide # 19   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
ANTLRによる構文解析処理




                     ANTLRって何?
         Wikipediaより
        ANTLR(ANother Tool for Language Recognition)とは、LL(*)構文解析に
        基づくパーサジェネレータである(バージョン3.xはLL(*)、2.xまではLL(k))。
        PCCTS(Purdue Compiler Construction Tool Set)の後継として1989年に
        開発され、現在も活発に開発が続いている。中心となっているのは、サンフラン
        シスコ大学の Terence Parr 教授である。
        ANTLR はLR法に基づいたパーサジェネレータと競合関係にあり、"ANT(i)-
        LR"(反LR)と読めるのも偶然ではない[要出典]。
        ANTLR はパーサだけでなくレキサーおよびツリーパーサも生成可能である。 文
        法の記述方法は、EBNFに似た形式となっている。



             再帰下降構文解析のコードを自動生成する
             Groovy 2.1が使っているのはANTLR 2.7.7
               3もしくは4への移行も企画されているらしい
            Slide # 20   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
AntlrParserPlugin.java
      パーサ(構文解析器)のメイン処理
         parseCST() …以下を呼び出してCSTを作った上
         で、ANTLRのASTに変換
             o.c.g.antlr.parser.GroovyLexer
             o.c.g.antlr.parser.GroovyRecognizer
         buildAST() …ANTLRのASTをGroovyのASTに変換




        Slide # 21   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
GroovyLexer.java, GroovyRecognizer.java

      groovy.gから自動生成されるのでGroovyソー
      スコードには含まれていない
      Groovyソースコードをコンパイルすると
      target/generated-sources配下にJavaソース
      が生成される。


        groovy.g                                            GroovyLexer.java
    (Groovy構文定義)                   ANTLR
                                                           GroovyRecognizer.java


        Slide # 22   Groovy基礎勉強会    Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
groovy.g
      ANTLR 2.7用のGroovy構文定義ファイル
         4324行あり、groovy中の最大級ソースの一つ

    ./src/main/org/codehaus/groovy/runtime/                                  14239行
    DefaultGroovyMethods.java

    ./src/main/org/codehaus/groovy/antlr/                                    4323行
    groovy.g

    ./subprojects/groovy-sql/src/main/java/groovy/sql/ 4229行
    Sql.java

    ./src/main/org/codehaus/groovy/runtime/                                  3865行
    StringGroovyMethods.java

        Slide # 23   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
groovy.gを覗いてみる
      ANTLRによるCompilationUnitの定義
   //	
  Compilation	
  Unit:	
  Groovyでは単一ファイルもしくはスクリプト。	
  
   //	
  このパーサの開始ルールです。
   compilationUnit
   	
  	
  	
  	
  	
  	
  	
  :
   //	
  ファイル冒頭文字列が"#!"の場合最初の行を無視
   	
  	
  	
  	
  	
  	
  	
  	
  (SH_COMMENT!)?
   //	
  ファイル冒頭にコメントがあっても良い
   	
  	
  	
  	
  	
  	
  	
  	
  nls!
   //	
  compilation	
  unitはopitionalなパッケージ定義から開始される
   	
  	
  	
  	
  	
  	
  	
  	
  (	
  	
  	
  (annotationsOpt	
  "package")=>	
  packageDefinition
   	
  	
  	
  	
  	
  	
  	
  	
  |	
  	
  	
  (statement[EOF])?
   	
  	
  	
  	
  	
  	
  	
  	
  )
   //	
  スクリプト本体は任意個数の文のシーケンス。
   //	
  セミコロンand/or改行をセパレータとして扱う
   	
  	
  	
  	
  	
  	
  	
  	
  (	
  sep!	
  (statement[sepToken])?	
  )*
   	
  	
  	
  	
  	
  	
  	
  	
  EOF!
   	
  	
  	
  	
  ;
        Slide # 24   Groovy基礎勉強会               Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
do-whileはどうなっている?
   /*OBS*	
  no	
  do-­‐while	
  statement	
  in	
  
   Groovy	
  (too	
  ambiguous)
   //	
  do-­‐while	
  statement
   	
  	
  |	
  	
  	
  "do"^	
  statement	
  "while"!	
  
   LPAREN!	
  strictContextExpression	
  
   RPAREN!	
  SEMI!
   *OBS*/




        Slide # 25   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
(余談)AntlrPerserPluginを
CompilerlerConfigrationで差し替える
 import	
  org.codehaus.groovy.control.*
 import	
  org.codehaus.groovy.antlr.*
 import	
  org.codehaus.groovy.syntax.*
 	
  
 class	
  Pascalizer	
  extends	
  ParserPluginFactory	
  {
 	
  	
  ParserPlugin	
  createParserPlugin()	
  {
 	
  	
  	
  	
  new	
  AntlrParserPlugin()	
  {
 	
  	
  	
  	
  	
  	
  Reduction	
  parseCST(SourceUnit	
  sourceUnit,	
  Reader	
  reader)	
  {
 	
  	
  	
  	
  	
  	
  	
  	
  def	
  s	
  =	
  reader.text.replaceAll('begin',	
  '{').replaceAll('end',	
  '}')
 	
  	
  	
  	
  	
  	
  	
  	
  s	
  =	
  s.replaceAll(/(*/,	
  '/*').replaceAll(/*)/,	
  '*/')
 	
  	
  	
  	
  	
  	
  	
  	
  super.parseCST(sourceUnit,	
  new	
  StringReader(s))
 	
  	
  	
  	
  	
  	
  }
 	
  	
  	
  	
  }
 	
  	
  }
 }	
  
 def	
  conf	
  =	
  new	
  CompilerConfiguration(pluginFactory:	
  new	
  Pascalizer())
 new	
  GroovyShell(binding,	
  conf).evaluate("""
 def	
  foo(arg)	
  begin	
  (*	
  コメントです	
  *)
 	
  println	
  arg
 end

 foo("hello	
  pascal!")
 """)
          Slide # 26   Groovy基礎勉強会                           参考: http://groovyconsole.appspot.com/script/3
                                                  Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
ASMによる
                           コード生成

        Slide # 27   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
ASMって何?
      Wikipediaより
      ObjectWeb ASM
      The ASM library is a project of the ObjectWeb consortium.
      It provides a simple API for decomposing, modifying, and
      recomposing binary Java classes (i.e. bytecode). The
      project was originally conceived and developed by Eric
      Bruneton. ASM is Java-centric at present, and does not
      currently have a backend that exposes other bytecode
      implementations (such as .NET bytecode,Python
      bytecode, etc.).

         Groovy 2.1が使っているのはASM 4.0

        Slide # 28   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
CompilatoinUnit#classgen
      CLASS_GENERATIONフェイズのphaseOperation
   new OptimizerVisitor(this).visitClass(classNode, source)
   new GenericsVisitor(source).visitClass(classNode)
   new Verifier().visitClass(classNode)
   new LabelVerifier(source).visitClass(classNode)
   new ClassCompletionVerifier(source).visitClass(classNode)
   new ExtendedVerifier(source).visitClass(classNode)

   ClassVisitor visitor = createClassVisitor()
   new AsmClassGenerator(source, context, visitor, sourceName)
      .visitClass(classNode)
   byte[] bytes = visitor.toByteArray();
   generatedClasses.add(new GroovyClass(classNode.getName(), bytes))
   // bytesに出力されたバイトコード列をGroovyクラス実体として結び付ける
   // 次のoutputフェーズでバイトコード列を出力する


         Slide # 29   Groovy基礎勉強会                Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
AsmClassGenerator
      以下を定義するVisitor                               visitSynchronizedStatement()
       visitClass()                                visitThrowStatement()
       visitClass()                                visitReturnStatement()
       visitGenericType()                          visitExpressionStatement()
       visitConstructor()                          visitTernaryExpression()
       visitMethod()                               visitDeclarationExpression()
       visitField()                                visitBinaryExpression()
       visitProperty()                             visitPostfixExpression()
       visitCatchStatement()                       visitPrefixExpression()
       visitBlockStatement()                       visitClosureExpression()
       visitForLoop()                              visitConstantExpression()
       visitWhileLoop()                            visitSpreadExpression()
       visitDoWhileLoop()                          visitSpreadMapExpression()
       visitIfElse()                               visitMethodPointerExpression()
       visitAssertStatement()                      visitUnaryMinusExpression()
       visitTryCatchFinally()                      visitUnaryPlusExpression()
       visitSwitch()                               visitBitwiseNegationExpression()
       visitCaseStatement()                        visitCastExpression()
       visitBreakStatement()                       visitNotExpression()
       visitContinueStatement()                    (以下略)

        Slide # 30   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
コード生成の例(whileループ)
  public	
  void	
  visitWhileLoop(WhileStatement	
  loop)	
  {
  	
  	
  controller.getStatementWriter().writeWhileLoop(loop);
  }

           StatementWriter#writeWhileLoop(WhileStatement loop):
                                                                                                                                                        生成バイトコード(予想)
 mv.visitLabel(continueLabel)
                                                                                                                                                        continueLabel:
 Expression	
  bool	
  =	
  loop.getBooleanExpression();
 bool.visit(controller.getAcg());                                                                                                                       	
  <bool式>

 controller.getOperandStack().jump(IFEQ,                                                                                                                IFEQ	
  	
  breaklabel1
 	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  breakLabel);
                                                                                                                                                        	
  <loopBlock>
 loop.getLoopBlock().visit(controller.getAcg());
                                                                                                                                                        GOTO	
  continueLabel
                                                                                                                                                        breakLabel
 mv.visitJumpInsn(GOTO,	
  continueLabel);
 mv.visitLabel(breakLabel);
                                                                                                           IFEQ: スタックトップの値が0の場合にジャンプする命令
                 Slide # 31          Groovy基礎勉強会                                                Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
(おまけ)Bytecode DSL
   @Bytecode
   int	
  foo()	
  {
   	
  	
  	
  	
  aload	
  0
   	
  	
  	
  	
  invokedynamic	
  
   'experiment',	
  '(LMain;)I',	
  [H_INVOKESTATIC,	
  'Main',	
  '
   bootstrap',	
  [CallSite,	
  Lookup,	
  String,	
  MethodType]]
   	
  	
  	
  	
  ireturn
   }


      ASMより簡単にbytecodeが生成できるyo!
      参考URL

         https://github.com/melix/groovy-bytecode-ast.git
         http://www.jroller.com/melix/entry/using_groovy_to_play_with

        Slide # 32   Groovy基礎勉強会        Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
まとめ
      Groovyの実行のコアにはいわゆる一つのコン
      パイラがある
      ANTLR、ASMなどの既存ライブラリ・ツール
      を上手くつかって綺麗に制御している
      構文解析にしろコード生成にしろVisitorだらけ
      である




        Slide # 33   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日
参考URL・商標
      http://www.antlr.org/
      http://asm.ow2.org/
      OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国
      における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合
      があります。
      記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標
      です




        Slide # 34   Groovy基礎勉強会   Copyright(C) 2013 NTT Software Corporation All rights reserved.
13年3月9日土曜日

Weitere ähnliche Inhalte

Was ist angesagt?

Groovy indy 20120222
Groovy indy 20120222Groovy indy 20120222
Groovy indy 20120222Nobuhiro Sue
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGUehara Junji
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Uehara Junji
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1Uehara Junji
 
Gws 20120521 gradle
Gws 20120521 gradleGws 20120521 gradle
Gws 20120521 gradleNobuhiro Sue
 
Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Uehara Junji
 
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ckIndy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ckUehara Junji
 
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118Uehara Junji
 
GroovyServ concept, how to use and outline.
GroovyServ concept, how to use and outline.GroovyServ concept, how to use and outline.
GroovyServ concept, how to use and outline.Uehara Junji
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basicTakuma Watabiki
 
JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話disc99_
 
Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Takuya Ueda
 
レビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみたレビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみたTakhisa Hirokawa
 
Gradleどうでしょう
GradleどうでしょうGradleどうでしょう
GradleどうでしょうTakuma Watabiki
 
Spring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswersSpring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswersTakuma Watabiki
 
ClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろうClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろうKazuhiro Hara
 
開発現場で使えるかもしれないGroovy
開発現場で使えるかもしれないGroovy開発現場で使えるかもしれないGroovy
開発現場で使えるかもしれないGroovyzgmf_mbfp03
 
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 ClojureYoshitaka Kawashima
 

Was ist angesagt? (20)

Groovy indy 20120222
Groovy indy 20120222Groovy indy 20120222
Groovy indy 20120222
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1
 
Gws 20120521 gradle
Gws 20120521 gradleGws 20120521 gradle
Gws 20120521 gradle
 
Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait
 
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ckIndy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
 
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118
 
GroovyServ concept, how to use and outline.
GroovyServ concept, how to use and outline.GroovyServ concept, how to use and outline.
GroovyServ concept, how to use and outline.
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basic
 
JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話
 
Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発
 
GContractsの基礎
GContractsの基礎GContractsの基礎
GContractsの基礎
 
レビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみたレビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみた
 
Gradleどうでしょう
GradleどうでしょうGradleどうでしょう
Gradleどうでしょう
 
Spring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswersSpring in-summer-gradle-hands on-withanswers
Spring in-summer-gradle-hands on-withanswers
 
ClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろうClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろう
 
開発現場で使えるかもしれないGroovy
開発現場で使えるかもしれないGroovy開発現場で使えるかもしれないGroovy
開発現場で使えるかもしれないGroovy
 
Bp study39 nodejs
Bp study39 nodejsBp study39 nodejs
Bp study39 nodejs
 
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
 

Ähnlich wie Groovy kisobenkyoukai20130309

G* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionG* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionKazuchika Sekiya
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradlekimukou_26 Kimukou
 
13.11.02 playgroundthon環境構築
13.11.02 playgroundthon環境構築13.11.02 playgroundthon環境構築
13.11.02 playgroundthon環境構築Kei Nakazawa
 
aboutDexcsPlus2022.pdf
aboutDexcsPlus2022.pdfaboutDexcsPlus2022.pdf
aboutDexcsPlus2022.pdfEtsuji Nomura
 
プログラミング学習のための学習
プログラミング学習のための学習プログラミング学習のための学習
プログラミング学習のための学習siranon *
 
Jvm internal
Jvm internalJvm internal
Jvm internalGo Tanaka
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackTakahiro Yoshimura
 
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼうGraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼうKoichi Sakata
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_GebNobuhiro Sue
 
こんにちはGroovy
こんにちはGroovyこんにちはGroovy
こんにちはGroovyirof N
 
開発を彩る技術たち
開発を彩る技術たち開発を彩る技術たち
開発を彩る技術たちOda Shinsuke
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp CodereadingHiro Yoshioka
 
VMを改めて学んで見る
VMを改めて学んで見るVMを改めて学んで見る
VMを改めて学んで見るkishima7
 

Ähnlich wie Groovy kisobenkyoukai20130309 (20)

Hudson using Groovy #jggug
Hudson using Groovy  #jggugHudson using Groovy  #jggug
Hudson using Groovy #jggug
 
G* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionG* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - Introduction
 
Code Pack の話
Code Pack の話Code Pack の話
Code Pack の話
 
TruffleSqueakの紹介
TruffleSqueakの紹介TruffleSqueakの紹介
TruffleSqueakの紹介
 
Jenkins と groovy
Jenkins と groovyJenkins と groovy
Jenkins と groovy
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
 
13.11.02 playgroundthon環境構築
13.11.02 playgroundthon環境構築13.11.02 playgroundthon環境構築
13.11.02 playgroundthon環境構築
 
aboutDexcsPlus2022.pdf
aboutDexcsPlus2022.pdfaboutDexcsPlus2022.pdf
aboutDexcsPlus2022.pdf
 
Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
 
プログラミング学習のための学習
プログラミング学習のための学習プログラミング学習のための学習
プログラミング学習のための学習
 
Jvm internal
Jvm internalJvm internal
Jvm internal
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼうGraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
 
こんにちはGroovy
こんにちはGroovyこんにちはGroovy
こんにちはGroovy
 
開発を彩る技術たち
開発を彩る技術たち開発を彩る技術たち
開発を彩る技術たち
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp Codereading
 
VMを改めて学んで見る
VMを改めて学んで見るVMを改めて学んで見る
VMを改めて学んで見る
 
ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料
 

Mehr von Uehara Junji

Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUehara Junji
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Uehara Junji
 
New feature of Groovy2.0 G*Workshop
New feature of Groovy2.0 G*WorkshopNew feature of Groovy2.0 G*Workshop
New feature of Groovy2.0 G*WorkshopUehara Junji
 
G* Workshop in fukuoka 20120901
G* Workshop in fukuoka 20120901G* Workshop in fukuoka 20120901
G* Workshop in fukuoka 20120901Uehara Junji
 
JJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsJJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsUehara Junji
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Uehara Junji
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development lifeUehara Junji
 
Groovy 1.8の新機能について
Groovy 1.8の新機能についてGroovy 1.8の新機能について
Groovy 1.8の新機能についてUehara Junji
 
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...Uehara Junji
 
Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224Uehara Junji
 
Easy Going Groovy 2nd season on DevLOVE
Easy Going Groovy 2nd season on DevLOVEEasy Going Groovy 2nd season on DevLOVE
Easy Going Groovy 2nd season on DevLOVEUehara Junji
 
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Uehara Junji
 
Groovy, Transforming Language
Groovy, Transforming LanguageGroovy, Transforming Language
Groovy, Transforming LanguageUehara Junji
 
Jggug Nagoya 20090925 Groovy
Jggug Nagoya 20090925 GroovyJggug Nagoya 20090925 Groovy
Jggug Nagoya 20090925 GroovyUehara Junji
 
G*WS 3rd Lightning talk
G*WS 3rd Lightning talkG*WS 3rd Lightning talk
G*WS 3rd Lightning talkUehara Junji
 
Groovy Now And Future
Groovy Now And FutureGroovy Now And Future
Groovy Now And FutureUehara Junji
 
Seasar Conference2008 Grails(Final)
Seasar Conference2008 Grails(Final)Seasar Conference2008 Grails(Final)
Seasar Conference2008 Grails(Final)Uehara Junji
 
Groovy Conference2008 Nttsoft
Groovy Conference2008 NttsoftGroovy Conference2008 Nttsoft
Groovy Conference2008 NttsoftUehara Junji
 

Mehr von Uehara Junji (20)

Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
 
New feature of Groovy2.0 G*Workshop
New feature of Groovy2.0 G*WorkshopNew feature of Groovy2.0 G*Workshop
New feature of Groovy2.0 G*Workshop
 
G* Workshop in fukuoka 20120901
G* Workshop in fukuoka 20120901G* Workshop in fukuoka 20120901
G* Workshop in fukuoka 20120901
 
JJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsJJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/Grails
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
Groovy 1.8の新機能について
Groovy 1.8の新機能についてGroovy 1.8の新機能について
Groovy 1.8の新機能について
 
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
 
Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224
 
Easy Going Groovy 2nd season on DevLOVE
Easy Going Groovy 2nd season on DevLOVEEasy Going Groovy 2nd season on DevLOVE
Easy Going Groovy 2nd season on DevLOVE
 
Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)Easy Going Groovy(Groovyを気軽に使いこなそう)
Easy Going Groovy(Groovyを気軽に使いこなそう)
 
Clojure
ClojureClojure
Clojure
 
Groovy, Transforming Language
Groovy, Transforming LanguageGroovy, Transforming Language
Groovy, Transforming Language
 
Jggug Nagoya 20090925 Groovy
Jggug Nagoya 20090925 GroovyJggug Nagoya 20090925 Groovy
Jggug Nagoya 20090925 Groovy
 
Lisp Builder
Lisp BuilderLisp Builder
Lisp Builder
 
G*WS 3rd Lightning talk
G*WS 3rd Lightning talkG*WS 3rd Lightning talk
G*WS 3rd Lightning talk
 
Groovy Now And Future
Groovy Now And FutureGroovy Now And Future
Groovy Now And Future
 
Seasar Conference2008 Grails(Final)
Seasar Conference2008 Grails(Final)Seasar Conference2008 Grails(Final)
Seasar Conference2008 Grails(Final)
 
Groovy Conference2008 Nttsoft
Groovy Conference2008 NttsoftGroovy Conference2008 Nttsoft
Groovy Conference2008 Nttsoft
 

Groovy kisobenkyoukai20130309

  • 1. Groovy 基礎勉強会 Groovy実行の基礎 ∼コンパイラ処理系としての Groovyを読み解く∼ 2013/3/9 @青山オラクルセンター NTTソフトウェア Grails推進室 上原潤二 Slide # 1 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 2. 自己紹介 上原潤二(@uehaj) NTTソフトウェア株式会社Grails推進室 JGGUG(日本Grails/Groovyユーザグループ)運営委員 書籍執筆: プログラミングGROOVY(技術評論社) Grails徹底入門(翔泳社) G*Magazine Vol 6記事書きました → ブログ「Grな日々」 GroovyServ, LispBuilder, GVM(Groovy JVM), Staticalizer開発者 Slide # Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 3. お品書き Groovyの実行のしくみ ANTLRによる構文解析 ASMによるコード生成 まとめ Slide # 3 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 4. Groovy実行 のしくみ Slide # 4 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 5. Groovyソースツリー src/main │ ├─builder │ ├─typehandling ├─groovy │ ├─expr │ └─wrappers │ ├─beans │ ├─stmt ├─syntax │ ├─grape │ └─tools ├─tools │ ├─inspect 今日の ├─classgen │ ├─ast │ ├─io │ └─asm │ ├─gse │ ├─lang テーマ │ ├─indy │ ├─javac │ ├─security │ └─sc │ ├─shell │ ├─time ├─cli │ │ └─util │ ├─transform ├─control │ └─xml │ ├─ui │ ├─customizers ├─transform │ ├─util │ │ └─builder │ ├─sc │ │ └─logging │ ├─io │ │ └─transformers │ └─xml │ └─messages │ └─stc └─org ├─plugin ├─util ├─apache ├─reflection └─vmplugin │ └─commons │ └─stdclasses ├─v5 │ └─cli ├─runtime ├─v6 └─codehaus │ ├─callsite └─v7 └─groovy │ ├─dgmimpl ├─antlr │ │ └─arrays │ ├─java │ ├─m12n │ ├─parser │ ├─memoize │ └─treewalker │ ├─metaclass ├─ast │ ├─powerassert Slide # 5 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 6. Javaコードの実行 Javaソース javacコマンド .classファイル javaコマンド JVM 標準クラスローダ Javaクラス Slide # 6 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 7. Groovyコードの実行 Javaソース Groovyコード javacコマンド groovycコマンド .classファイル .classファイル javaコマンド groovyコマンド JVM Groovyクラスローダ 標準クラスローダ (オンメモリ実行時コンパイラ) Javaクラス Javaクラス Javaクラス Slide # 7 Groovy基礎勉強会 2011 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 8. Groovyコードの実行 Groovyコード groovycコマンド .classファイル groovyコマンド JVM 標準クラスローダ Groovyクラスローダ (オンメモリ実行時コンパイラ) Javaクラス Javaクラス Slide # 8 6 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 9. Groovyコード実行のためのコマンドとクラス groovycコマンド groovyコマンド groovysh groovy.ui.GroovyMain o.c.g.tools.FileS groovyConsole ystemCompiler groovy.lang.GroovyShell groovy.util.Groo vyScriptEngine groovy.lang.GroovyClass Loader org.codehaus.groovy.controll.CompilationUnit Slide # 9 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 10. CompilationUnit org.codehaus.groovy.controll.CompilationUnit CompilationUnitはコンパイル処理の中核 「コンパイル処理を実行する単位」を表わすと同時 にコンパイルのすべての過程を制御している。 Slide # 10 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 11. JavaAwareCompilationUnit extends CompilationUnit (余談)JavaAwareCompilationUnit extends CompilationUnit ジョイントコンパイルオプション(-j, --jointCompilation)を指定した場合に発動 Groovyソースに加えJavaソースをコンパイル する能力を持つ -jをつけないと、拡張子.javaのファイルは Groovyコードとして解釈/コンパイルされる(!!) Slide # 11 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 12. CompilationUnit#compile() public  void  compile()  ..  {        compile(Phases.ALL);  //全フェイズのコンパ イル処理を実行 } public  void  compile(int  throughPhase)  ..  { //  指定したフェイズ「まで」コンパイル処理実行    : } Slide # 12 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 13. フェイズとは何か? CompilationUnitが保持するコンパイルの進行 状態である。 INITIALIZATION(1)                //ファイルを開いたり PARSING(2)                  //字句・構文解析、ANTLRのAST構築 CONVERSION(3)                        //CSTからASTへの変換 SEMANTIC_ANALYSIS(4)          //ASTの意味解析と解明 CANONICALIZATION(5)            //ASTの補完 INSTRUCTION_SELECTION(6)  //クラス生成(フェーズ1) CLASS_GENERATION(7)            //クラス生成(フェーズ2) OUTPUT(8)                                //クラスをファイルに出力 FINALIZATION(9)                    //後始末 ALL(9)                                      //後始末まですべて実行 Slide # 13 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 14. (参考) ASTとは? AST…Abstract Syntax Tree,抽象構文木 構文木の一種で、論理的な構造を表わす CST(Concrete Syntax Tree, 具象構文木) 例えば「a.foo(b,c)」を構文解析すると… CST . AST . a foo a foo () , b c b c Slide # 14 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 15. GroovyConsoleのGroovy AST Browser Slide # 15 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 16. フェイズにもとづいたコンパイル処理 CompilationUnitに、フェイズを指定して種々 のphaseOperation(後述)を追加することで処 理が制御される CompilationUnit#addPhaseOperation() あらかじめ決まっているもの以外に、以下が実 行時に追加される AST変換 CompilerCustomizerとしてのAST変換 Slide # 16 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 17. (参考)フェイズとAST変換 AST変換は、それぞれ適用されるフェイズを 指定して定義されている フェイズ 実行されるAST変換 INITIALIZATION - PARSING - CONVERSION @Grab SEMANTIC_ANALYSIS @Field, @Log, @PackageScope, CANONICALIZATION ほとんどのAST変換がここに所属 INSTRUCTION_SELECTIO @TypeChecked, @CompileStatic CategoryASTTransformation CLASS_GENERATION N - DelegateASTTransformation OUTPUT - FINALIZATION - ImmutableASTTransformation Slide # 17 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 18. phaseOperations PARSING: AnnotationCollectorTransform SourceUnit#parse() StaticVerifier AntlrParserPlugin#parseCST()// InnerClassCompletionVisitor CSTを作る EnumCompletionVisitor CONVERSION: CANONICALIZATION: convert(SourceUnit#convert() // compileCompleteCheck Generates an AST from the CST), CLASS_GENERATION: AntlrParserPlugin.buildAST()// classgen(OptimizerVisitor,Generics ANTLR ASTからGroovyのASTを生成 Visitor, LabelVerifier, EnumVisitor ClassCompletionVerifier, SEMANTIC_ANALYSIS: ExtendedVerifier, ClassVisitor, resolve(VariableScopeVisitor, AsmClassGenerator) ResolveVisitor) OUTPUT: staticImport(StaticImportVisitor) output InnerClassVisitor Slide # 18 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 19. phaseOperations PARSING: AnnotationCollectorTransform SourceUnit#parse() StaticVerifier AntlrParserPlugin#parseCST()// InnerClassCompletionVisitor CSTを作る EnumCompletionVisitor CONVERSION: CANONICALIZATION: convert(SourceUnit#convert() // compileCompleteCheck Generates an AST from the CST), CLASS_GENERATION: AntlrParserPlugin.buildAST()// classgen(OptimizerVisitor,Generics ANTLR ASTからGroovyのASTを生成 Visitor, LabelVerifier, EnumVisitor ClassCompletionVerifier, SEMANTIC_ANALYSIS: 今日の ExtendedVerifier, ClassVisitor, resolve(VariableScopeVisitor, AsmClassGenerator) ResolveVisitor) テーマ OUTPUT: staticImport(StaticImportVisitor) output InnerClassVisitor Slide # 18 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 20. ANTLRによる 構文解析 Slide # 19 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 21. ANTLRによる構文解析処理 ANTLRって何? Wikipediaより ANTLR(ANother Tool for Language Recognition)とは、LL(*)構文解析に 基づくパーサジェネレータである(バージョン3.xはLL(*)、2.xまではLL(k))。 PCCTS(Purdue Compiler Construction Tool Set)の後継として1989年に 開発され、現在も活発に開発が続いている。中心となっているのは、サンフラン シスコ大学の Terence Parr 教授である。 ANTLR はLR法に基づいたパーサジェネレータと競合関係にあり、"ANT(i)- LR"(反LR)と読めるのも偶然ではない[要出典]。 ANTLR はパーサだけでなくレキサーおよびツリーパーサも生成可能である。 文 法の記述方法は、EBNFに似た形式となっている。 再帰下降構文解析のコードを自動生成する Groovy 2.1が使っているのはANTLR 2.7.7 3もしくは4への移行も企画されているらしい Slide # 20 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 22. AntlrParserPlugin.java パーサ(構文解析器)のメイン処理 parseCST() …以下を呼び出してCSTを作った上 で、ANTLRのASTに変換 o.c.g.antlr.parser.GroovyLexer o.c.g.antlr.parser.GroovyRecognizer buildAST() …ANTLRのASTをGroovyのASTに変換 Slide # 21 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 23. GroovyLexer.java, GroovyRecognizer.java groovy.gから自動生成されるのでGroovyソー スコードには含まれていない Groovyソースコードをコンパイルすると target/generated-sources配下にJavaソース が生成される。 groovy.g GroovyLexer.java (Groovy構文定義) ANTLR GroovyRecognizer.java Slide # 22 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 24. groovy.g ANTLR 2.7用のGroovy構文定義ファイル 4324行あり、groovy中の最大級ソースの一つ ./src/main/org/codehaus/groovy/runtime/ 14239行 DefaultGroovyMethods.java ./src/main/org/codehaus/groovy/antlr/ 4323行 groovy.g ./subprojects/groovy-sql/src/main/java/groovy/sql/ 4229行 Sql.java ./src/main/org/codehaus/groovy/runtime/ 3865行 StringGroovyMethods.java Slide # 23 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 25. groovy.gを覗いてみる ANTLRによるCompilationUnitの定義 //  Compilation  Unit:  Groovyでは単一ファイルもしくはスクリプト。   //  このパーサの開始ルールです。 compilationUnit              : //  ファイル冒頭文字列が"#!"の場合最初の行を無視                (SH_COMMENT!)? //  ファイル冒頭にコメントがあっても良い                nls! //  compilation  unitはopitionalなパッケージ定義から開始される                (      (annotationsOpt  "package")=>  packageDefinition                |      (statement[EOF])?                ) //  スクリプト本体は任意個数の文のシーケンス。 //  セミコロンand/or改行をセパレータとして扱う                (  sep!  (statement[sepToken])?  )*                EOF!        ; Slide # 24 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 26. do-whileはどうなっている? /*OBS*  no  do-­‐while  statement  in   Groovy  (too  ambiguous) //  do-­‐while  statement    |      "do"^  statement  "while"!   LPAREN!  strictContextExpression   RPAREN!  SEMI! *OBS*/ Slide # 25 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 27. (余談)AntlrPerserPluginを CompilerlerConfigrationで差し替える import  org.codehaus.groovy.control.* import  org.codehaus.groovy.antlr.* import  org.codehaus.groovy.syntax.*   class  Pascalizer  extends  ParserPluginFactory  {    ParserPlugin  createParserPlugin()  {        new  AntlrParserPlugin()  {            Reduction  parseCST(SourceUnit  sourceUnit,  Reader  reader)  {                def  s  =  reader.text.replaceAll('begin',  '{').replaceAll('end',  '}')                s  =  s.replaceAll(/(*/,  '/*').replaceAll(/*)/,  '*/')                super.parseCST(sourceUnit,  new  StringReader(s))            }        }    } }   def  conf  =  new  CompilerConfiguration(pluginFactory:  new  Pascalizer()) new  GroovyShell(binding,  conf).evaluate(""" def  foo(arg)  begin  (*  コメントです  *)  println  arg end foo("hello  pascal!") """) Slide # 26 Groovy基礎勉強会 参考: http://groovyconsole.appspot.com/script/3 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 28. ASMによる コード生成 Slide # 27 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 29. ASMって何? Wikipediaより ObjectWeb ASM The ASM library is a project of the ObjectWeb consortium. It provides a simple API for decomposing, modifying, and recomposing binary Java classes (i.e. bytecode). The project was originally conceived and developed by Eric Bruneton. ASM is Java-centric at present, and does not currently have a backend that exposes other bytecode implementations (such as .NET bytecode,Python bytecode, etc.). Groovy 2.1が使っているのはASM 4.0 Slide # 28 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 30. CompilatoinUnit#classgen CLASS_GENERATIONフェイズのphaseOperation new OptimizerVisitor(this).visitClass(classNode, source) new GenericsVisitor(source).visitClass(classNode) new Verifier().visitClass(classNode) new LabelVerifier(source).visitClass(classNode) new ClassCompletionVerifier(source).visitClass(classNode) new ExtendedVerifier(source).visitClass(classNode) ClassVisitor visitor = createClassVisitor() new AsmClassGenerator(source, context, visitor, sourceName) .visitClass(classNode) byte[] bytes = visitor.toByteArray(); generatedClasses.add(new GroovyClass(classNode.getName(), bytes)) // bytesに出力されたバイトコード列をGroovyクラス実体として結び付ける // 次のoutputフェーズでバイトコード列を出力する Slide # 29 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 31. AsmClassGenerator 以下を定義するVisitor visitSynchronizedStatement() visitClass() visitThrowStatement() visitClass() visitReturnStatement() visitGenericType() visitExpressionStatement() visitConstructor() visitTernaryExpression() visitMethod() visitDeclarationExpression() visitField() visitBinaryExpression() visitProperty() visitPostfixExpression() visitCatchStatement() visitPrefixExpression() visitBlockStatement() visitClosureExpression() visitForLoop() visitConstantExpression() visitWhileLoop() visitSpreadExpression() visitDoWhileLoop() visitSpreadMapExpression() visitIfElse() visitMethodPointerExpression() visitAssertStatement() visitUnaryMinusExpression() visitTryCatchFinally() visitUnaryPlusExpression() visitSwitch() visitBitwiseNegationExpression() visitCaseStatement() visitCastExpression() visitBreakStatement() visitNotExpression() visitContinueStatement() (以下略) Slide # 30 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 32. コード生成の例(whileループ) public  void  visitWhileLoop(WhileStatement  loop)  {    controller.getStatementWriter().writeWhileLoop(loop); } StatementWriter#writeWhileLoop(WhileStatement loop): 生成バイトコード(予想) mv.visitLabel(continueLabel) continueLabel: Expression  bool  =  loop.getBooleanExpression(); bool.visit(controller.getAcg());  <bool式> controller.getOperandStack().jump(IFEQ, IFEQ    breaklabel1                                                                    breakLabel);  <loopBlock> loop.getLoopBlock().visit(controller.getAcg()); GOTO  continueLabel breakLabel mv.visitJumpInsn(GOTO,  continueLabel); mv.visitLabel(breakLabel); IFEQ: スタックトップの値が0の場合にジャンプする命令 Slide # 31 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 33. (おまけ)Bytecode DSL @Bytecode int  foo()  {        aload  0        invokedynamic   'experiment',  '(LMain;)I',  [H_INVOKESTATIC,  'Main',  ' bootstrap',  [CallSite,  Lookup,  String,  MethodType]]        ireturn } ASMより簡単にbytecodeが生成できるyo! 参考URL https://github.com/melix/groovy-bytecode-ast.git http://www.jroller.com/melix/entry/using_groovy_to_play_with Slide # 32 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 34. まとめ Groovyの実行のコアにはいわゆる一つのコン パイラがある ANTLR、ASMなどの既存ライブラリ・ツール を上手くつかって綺麗に制御している 構文解析にしろコード生成にしろVisitorだらけ である Slide # 33 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日
  • 35. 参考URL・商標 http://www.antlr.org/ http://asm.ow2.org/ OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国 における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合 があります。 記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標 です Slide # 34 Groovy基礎勉強会 Copyright(C) 2013 NTT Software Corporation All rights reserved. 13年3月9日土曜日