SSブログ
English Version

独自言語 picle のコンパイラ化(その5) [PIC]

  picle言語 のPIC24FJ用セルフコンパイラ製作の続編です。
  1. インタープリタとの速度比較
     picleコンパイラがほぼ動く状態になりました。ディバッグ用に表示していたコンパイル時のアセンブリ言語のニーモニック表示をオフにして実行させるとコンパイル時間は殆ど気にならない程度でした。
     picle言語の大規模なソースはまだ無いので「 PIC24FJ64GAでGAME言語(その4) 」に追記した picle言語版ライフゲームのソースでの体感速度です。
     最初はrun後に少し待ち時間がありましたがInit()の処理前に "start"と表示するようにしたところ run 後すぐに"start"が表示されました。

     元々フラッシュメモリへの書込みのアセンブル言語処理をある程度まとまったブロック単位の書込みにして高速化しようと思っていましたが、この作業のプライオリティを一旦低くします。

     気になる実行速度についてですが、インタープリタとの簡単な比較をしてみます。コンパイラを作成する過程でインタープリタ側の速度改善箇所も見つかりましたがコンパイラが最終目的なので反映していません ^^;

     適当なベンチマークプログラムが無かったので「PIC24FJ64GAでGAME言語 ^^ 」で紹介した素数を求めるプログラム(配列を使わない低速なアルゴリズムのもの)をアレンジして使いました。
     シリアル通信の影響をなくし純粋に処理速度比較するために処理途中の表示をコメントアウトしています。

     1200以下の素数を求める処理時間比較は下記のようにコンパイラが76倍の実行速度という結果でした ^^
     インタープリタ版ではソースをインタープリットしながら実行するという原理的な速度低下は当然ありますが、変数アクセスの度に変数サーチするのと proc/func コールの都度、処理名サーチ及びローカル変数の領域確保することが処理速度低下の1要因だと思います。
     尚、処理時間は picle に実装している 10ms 毎に割込み処理でデクリメントされる Timer_ 変数を使って計測しました。

     インタープリタ  コンパイラ  速度比 
    28880[ms]
    380[ms]
    76倍


  2. 素数プログラムのコンパイル結果
     コンパイル結果を下記に示します。従来からの変更点としては
    • 変数専用スタックの廃止
       前回の「独自言語 picle のコンパイラ化(その4)」のコンパイルサンプルでは W13 レジスタを使って一時的な変数専用のスタックを実現していましたが W15(スタックレジスタ)のスタックに統合しました。
    • exit()用エントリ
       前回記事でexit()用エントリのために W15 レジスタを保存していましたが、これだけでは不十分で W14 レジスタも保存する必要があったので追加しました。
    • Input_()処理
       インタープリタ版では入力文字列を数式評価処理し、計算式の入力を可能にしていましたが、今回のコンパイラ版では直値入力のみにしました。

    素数プログラムのコンパイル例
    :l
    
       1:# sosuu
       2:
       3:var Cnt;
       4:
       5:proc ans(n) {
       6:   Cnt = Cnt + 1;
       7:#  PrnStr_("¥nNo");
       8:#  PrnDecF_(Cnt,3);
       9:#  PrnChar_(':');
      10:#  PrnDecF_(n,4);
      11:}
      12:
      13:
      14:proc main() {
      15:   var i,j,max;
      16:   PrnStr_("¥ninput Max:");
      17:   max=Input_();
      18:   Timer_ = 32000;
      19:   Cnt=0;
      20:   if (max>1) {
      21:           ans(2);
      22:   }
      23:   for (i=3;i<=max;i=i+2) {
      24:           for (j=2;j<i;j=j+1) {
      25:                   if (i%j=0) {
      26:                           j=i+1;
      27:                   }
      28:           }
      29:           if (j=i) {
      30:                   ans(i);
      31:           }
      32:   }
      33:   PrnStr_("¥nAnswer is ");
      34:   PrnDec_(Cnt);
      35:   PrnStr_( "¥ntime[ms] : " );
      36:   PrnDec_( (32000 - Timer_) * 10 );
      37:}
      38:
    :run
    
    8000 : MOV W15,[e5ah]
    8002 : MOV W14,[e5ch]
    8004 : BRA 801eh
    8006 : MOV [e5ch],W14
    8008 : MOV [e5ah],W15
    800a : RETURN
    800c : LNK #2
    800e : MOV W0,[W14+0h]
    8010 : MOV [bd4h],W0
    8012 : MOV W0,[W15++]
    8014 : MOV #1h,W0
    8016 : ADD W0,[--W15],W0
    8018 : MOV W0,[bd4h]
    801a : ULNK
    801c : RETURN
    801e : LNK #6
    8020 : MOV #18a3h,W0
    8022 : RCALL 162eh
    8024 : RCALL 17e8h
    8026 : MOV W0,[W14+4h]
    8028 : MOV #7d00h,W0
    802a : MOV W0,[bd2h]
    802c : MOV #0h,W0
    802e : MOV W0,[bd4h]
    8030 : MOV [W14+4h],W0
    8032 : MOV W0,[W15++]
    8034 : MOV #1h,W0
    8036 : CP  W0,[--W15]
    8038 : CLR W0
    803a : BRA GE,803eh
    803c : INC W0,W0
    803e : CP0 W0
    8040 : BRA Z,8046h
    8042 : MOV #2h,W0
    8044 : RCALL 800ch
    8046 : MOV #3h,W0
    8048 : MOV W0,[W14+0h]
    804a : MOV [W14+0h],W0
    804c : MOV W0,[W15++]
    804e : MOV [W14+4h],W0
    8050 : CP  W0,[--W15]
    8052 : CLR W0
    8054 : BRA LT,8058h
    8056 : INC W0,W0
    8058 : CP0 W0
    805a : BRA Z,80d2h
    805c : MOV #2h,W0
    805e : MOV W0,[W14+2h]
    8060 : MOV [W14+2h],W0
    8062 : MOV W0,[W15++]
    8064 : MOV [W14+0h],W0
    8066 : CP  W0,[--W15]
    8068 : CLR W0
    806a : BRA LE,806eh
    806c : INC W0,W0
    806e : CP0 W0
    8070 : BRA Z,80b0h
    8072 : MOV [W14+0h],W0
    8074 : MOV W0,[W15++]
    8076 : MOV [W14+2h],W0
    8078 : MOV [--W15],W2
    807a : CP0 W0
    807c : BTSC [42h],#1
    807e : RCALL 1850h
    8080 : MOV W0,W3
    8082 : REPEAT 17
    8084 : DIV.S W2,W3
    8086 : MOV W1,[bd0h]
    8088 : MOV W1,W0
    808a : MOV W0,[W15++]
    808c : MOV #0h,W0
    808e : CP  W0,[--W15]
    8090 : CLR W0
    8092 : BTSC [42h],#1
    8094 : INC W0,W0
    8096 : CP0 W0
    8098 : BRA Z,80a4h
    809a : MOV [W14+0h],W0
    809c : MOV W0,[W15++]
    809e : MOV #1h,W0
    80a0 : ADD W0,[--W15],W0
    80a2 : MOV W0,[W14+2h]
    80a4 : MOV [W14+2h],W0
    80a6 : MOV W0,[W15++]
    80a8 : MOV #1h,W0
    80aa : ADD W0,[--W15],W0
    80ac : MOV W0,[W14+2h]
    80ae : BRA 8060h
    80b0 : MOV [W14+2h],W0
    80b2 : MOV W0,[W15++]
    80b4 : MOV [W14+0h],W0
    80b6 : CP  W0,[--W15]
    80b8 : CLR W0
    80ba : BTSC [42h],#1
    80bc : INC W0,W0
    80be : CP0 W0
    80c0 : BRA Z,80c6h
    80c2 : MOV [W14+0h],W0
    80c4 : RCALL 800ch
    80c6 : MOV [W14+0h],W0
    80c8 : MOV W0,[W15++]
    80ca : MOV #2h,W0
    80cc : ADD W0,[--W15],W0
    80ce : MOV W0,[W14+0h]
    80d0 : BRA 804ah
    80d2 : MOV #1975h,W0
    80d4 : RCALL 162eh
    80d6 : MOV [bd4h],W0
    80d8 : RCALL 17dah
    80da : MOV #199fh,W0
    80dc : RCALL 162eh
    80de : MOV #7d00h,W0
    80e0 : MOV W0,[W15++]
    80e2 : MOV [bd2h],W0
    80e4 : MOV [--W15],W2
    80e6 : SUB W2,W0,W0
    80e8 : MOV W0,[W15++]
    80ea : MOV #ah,W0
    80ec : MOV [--W15],W2
    80ee : MUL.SS W2,W0,W0
    80f0 : RCALL 17dah
    80f2 : ULNK
    80f4 : RETURN
    input Max:1200
    Answer is 196
    time[ms] : 380
    :
    


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0)  トラックバック(3) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 3