• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            Ragel State Machine Compiler

            老魚頭昨天向俺們推薦了 Ragel State Machine Compiler 這個東東,一個可以生成協議處理代碼的工具。還舉了個例子,簡簡單單的幾行代碼:

             

            int atoi( char *str )

            {

             char *p = str;

             int cs, val = 0;

             bool neg = false;

             

             %%{

              action see_neg {

               neg = true;

              }

             

              action add_digit {

               val = val * 10 + (fc - '0');

              }

             

              main :=

               ( '-'@see_neg | '+' )? ( digit @add_digit )+

               '\n' @{ fbreak; };

             

              # Initialize and execute.

              write init;

              write exec noend;

             }%%

             

             if ( neg )

              val = -1 * val;

             

             if ( cs < atoi_first_final )

              cerr << "atoi: there was an error" << endl;

             

             return val;

            };

             

            生成的基于狀態機的代碼,比c里面那500多行實現的atoi函數更加高效。比如上面這段代碼,會生成下面的c代碼:

             

            int atoi( char *str )

            {

             char *p = str;

             int cs, val = 0;

             bool neg = false;

             

             

            #line 27 "atoi.c"

             {

             cs = atoi_start;

             }

             

            #line 31 "atoi.c"

             {

             switch ( cs )

             {

            case 1:

             switch( (*p) ) {

              case 43: goto st2;

              case 45: goto tr2;

             }

             if ( 48 <= (*p) && (*p) <= 57 )

              goto tr3;

             goto st0;

            st0:

             goto _out0;

            tr2:

            #line 23 "atoi.rl"

             {

               neg = true;

              }

             goto st2;

            st2:

             p += 1;

            case 2:

            #line 52 "atoi.c"

             if ( 48 <= (*p) && (*p) <= 57 )

              goto tr3;

             goto st0;

            tr3:

            #line 27 "atoi.rl"

             {

               val = val * 10 + ((*p) - '0');

              }

             goto st3;

            st3:

             p += 1;

            case 3:

            #line 63 "atoi.c"

             if ( (*p) == 10 )

              goto tr4;

             if ( 48 <= (*p) && (*p) <= 57 )

              goto tr3;

             goto st0;

            tr4:

            #line 33 "atoi.rl"

             { goto _out4; }

             goto st4;

            st4:

             p += 1;

            case 4:

            #line 74 "atoi.c"

             goto st0;

             }

             _out0: cs = 0; goto _out;

             _out4: cs = 4; goto _out;

             

             _out: {}

             }

            #line 38 "atoi.rl"

             

             

             if ( neg )

              val = -1 * val;

             

             if ( cs < atoi_first_final )

              cerr << "atoi: there was an error" << endl;

             

             return val;

            };

             

             

             

            他說,Nginx里面花了好幾百行來實現HTTP協議的解析,用Ragel100多行就可以搞定了,效率更高,人肉優化器不值錢了(參見網址上面的 http11_parser.rl 代碼)

             

            今天試了一下,用來寫一個判斷一個Java String是否為數字串:

             

            public class IsInt

            {

             

            %%{

             machine is_int;

             write data noerror;

            }%%

             

             public static void main(String[] args)

             {

              long begin = System.currentTimeMillis();

              for (int i=0; i<100000000; i++) {

                  isIntStr("123456789p");

               isIntStr("8487389247");

              }

              System.out.println(System.currentTimeMillis() - begin);

             

              begin = System.currentTimeMillis();

              for (int i=0; i<100000000; i++) {

                  isAllNumber("123456789p");

               isAllNumber("8487389247");

              }

              System.out.println(System.currentTimeMillis() - begin);

             }

             

             public static boolean isAllNumber(String str)  

             {   

              char[] c = str.toCharArray();

              boolean blReturn = true;  

              for(int ni=0; ni<c.length; ni++)  

              {  

               if(c[ni]<48 || c[ni]>57)

               {  

                blReturn = false; 

                break;

               }

              }

              return blReturn;  

             }

             

             public static boolean isIntStr(String str)

             {

              char[] data = str.toCharArray();

              int p=0, cs=0;

              boolean isInt = true;

             

              %%{

               main := (digit+)? any @{ isInt = false; fbreak; };

             

               write init;

               write exec noend;

              }%%

             

              return isInt;

             }

            }

             

             

             

            使用 ragel.exe -J IsInt.rl | rlgen-java.exe 命令生成 java 代碼,編譯運行,結果是:

             

            27750

            30938

             

            可見生成的代碼比那簡單實現的更高:)

             

            RoR架構上面使用的Mongrel服務器,原來也是使用了Ragel

            posted on 2008-12-24 14:58 肥仔 閱讀(2953) 評論(1)  編輯 收藏 引用 所屬分類: 狀態機 & 自動機 & 形式語言

            評論

            # re: Ragel State Machine Compiler  回復  更多評論   

            大哥,這個Ragel我很想入門,但官方的pdf看不懂啊。可以詳細解釋一下“判斷Java String是否為數字串”這個例子嗎?我連這個例子都看不懂……先謝謝了。
            2009-06-24 20:54 | lizhang2009
            亚洲欧美成人久久综合中文网| 丰满少妇人妻久久久久久4| 精品乱码久久久久久夜夜嗨 | 秋霞久久国产精品电影院| 99久久精品国产高清一区二区| 亚洲精品乱码久久久久久按摩 | 亚洲国产精品成人久久| 四虎久久影院| 中文精品久久久久国产网址| 久久99精品久久久久久秒播| 久久亚洲AV无码精品色午夜 | 亚洲中文字幕久久精品无码喷水| 久久久精品人妻一区二区三区蜜桃 | 中文字幕亚洲综合久久2| 精品久久人人爽天天玩人人妻| 国产成人无码久久久精品一| 久久亚洲AV无码精品色午夜| 狠狠精品久久久无码中文字幕| 欧美亚洲国产精品久久| 亚洲精品tv久久久久| 无码8090精品久久一区| 国产69精品久久久久99| 国产精品美女久久久久网| 久久久婷婷五月亚洲97号色| 亚洲国产精品综合久久一线| 久久综合色老色| 99精品久久久久久久婷婷| 国色天香久久久久久久小说| 男女久久久国产一区二区三区| 97精品依人久久久大香线蕉97| 久久久久亚洲AV成人网人人网站 | 久久综合噜噜激激的五月天| 亚洲精品无码久久久| 久久精品无码免费不卡| 久久亚洲欧美日本精品| 久久久久免费视频| 性欧美丰满熟妇XXXX性久久久| .精品久久久麻豆国产精品| 亚洲一区中文字幕久久| 久久精品国产男包| 国产亚洲成人久久|