生成コードの最適化の検討 >>
                                                                   2006/10/13 MT
                                                                   2006/10/20 MT
■最適化で何を行うか?
  1.不要な処理を出力しない。
  2.不要な変数を保持しない。※20061020リリースでは保留とする。
■最適化の方針
  1.コード生成時に mapping definition を一通り見て、不要な処理を出力しない。
  2.カレントノードの祖先を見て、不要な処理を出力しない。
  3.コード生成時にオプションをつけ、不要な処理を出力しない。
    ※20061020リリースでは保留とする。
■最適化の実作業
  - デバッグライトはデバッグオプションがある時だけ出力する。
  - 全体を見て、不要な処理を出力しない。
     -> グローバルチェック。
     -> データの初期化削除などに用いる。
  - bit / byte / data / value において、不要な処理を出力しない。
     -> ローカルチェック。
     -> コンテナ処理の削除などに用いる。
     -> list、loop、interleave を含むスキーマであったとしても、それらが祖先にな
        ければ、それに関する処理は行わないようにする。)
  - ライブラリ関数
     -> 必要な処理のみを出力する。
     ※ここまでは手は回らない。
  ※必要か不要かをどのように判定するか?
    1.チェック処理をもうけ、フラグをシェルの実行オプションとして付与する。
      -> コマンドのインタフェース変わってしまう。
    2.動的にチェックし、その都度出力するかどうか判定しながら実行する。
      -> 処理が煩雑になる。
      -> 20061020リリースではこの判定方式で行う。
  ※この時、処理を減らす前の状態でも、正しく動くことを確認する必要があるか?
     -> 「昔通り全て出力するオプション」を付与する。
■改修方法
  - チェック方法
     -> 子孫にそのデータを含むかどうかのフラグを変数に格納する。
          
            
          
  - 変数宣言や初期化の削除
      
        変数宣言;
        初期化; 
      
  - その他の処理の削除
      
        処理;
      
  ※以下のケースの厳密な最適化まで今回は行わなくてもよい。
      
        
          
            
          
        
      
この時、byte の pushContainer()、popContainer() は不要。
■改修箇所
  - src/java/jp/jaxa/isas/ums/codeGenerator/GeneratorMain.java
  - src/java/jp/jaxa/isas/ums/codeGenerator/Generator.java
  - src/txtclng.tmp
  - src/txtjava.tmp
      実行オプションの解析処理を追加する。
  - txt2clng.xsl
  - txt2java.xsl
      
      
      
      
        
      
      
        
      
      
        
      
  - defineMapping.xsl
      ums__list_t       *ums__list;
      ums__loop_t       *ums__loop;
      ums__interleave_t *ums__interleave;
      ums__thread_mng_interleave_t  ums__thread_mng_interleave;
      ums__thread_mng_interleave_t *ums__thread_mng_interleavep = &ums__thread_mng_interleave;
      ums__list = &(list);
          
      ums__loop = &(loop);
      ums__interleave = &(il);
      ums__loop = &( loop );
      ums__list = &( list );
      ums__interleave = &( il );
      if (  ) {
        thread_new =  ums__thread_mngp, ums__debug;
      }
  - tool_java.xsl
  - tool_clng.xsl
      
      
      ※list と interleave をはずすときは、祖先をチェックする。
  - bit
  if (  ums__thread_mngp, ums__interleave, +, ums__debug  ) break;
case +:
       ums__thread_mngp, ums__interleave, -, ums__debug ;
case -:
  - byte
  if (  ums__thread_mngp, ums__interleave, +, ums__debug  ) break;
case +:
       ums__thread_mngp, ums__interleave, -, ums__debug ;
case -:
  - list
 if (  ums__thread_mngp, ums__interleave, +, ums__debug  ) break;
case +:
      
       ums__thread_mngp, ums__interleave, -, ums__debug ;
case -:
  - value
    
    
  - data
    
    
                                                                            以上