JscexはBSDライセンス契約を使用して正式に発表

6276 ワード

今回はJscexをしっかりやるつもりですが、実は技術的な障害が「順番に」突破できることはめったにありませんが、Jscexは確かにチャンスがあると思います.HTML 5、Node.jsはそれぞれ赤いものです.先日、私は2晩かけて半生の中国語英語でGithubのプロジェクトのトップページに完全だと思っていた説明文字を書いたが、数時間後にStratifiedJS(Jscexの目標と似たようなプロジェクト)の著者からメールが届き、StratifiedJSについていくつかのことを話した.私は彼にStratifiedJSのいくつかの詳細な問題を尋ね、Jscexの実現原理も簡単に紹介した.現在、JscexはBSDライセンス契約を使用して正式に発表されています(中国語ステーションも近いうちに発売されます)、さらに詳細な最適化を行い、普及し始めます.
最近の最適化は、不要なDelayメソッド呼び出しを除去することです.Delayの目的は、あるコードの実行時間を遅延させ、適切な時間にのみ実行されることを確保することです.これは、「遅延」ではなく、副作用のある言語にとって非常に重要です.F#でのDelayメソッドの署名は次のとおりです(Jscexと同様).
// async.Delay
((unit -> Async) -> Async)

Delay関数はネストされ続けることができ、効果から言えば違いはありません.例えば、次のようなものです.
builder.Delay(function () {
    return builder.Delay(function () {
        return builder.Delay(function () {
            return builder.Loop(...);
        });
    });
});

上のコードと直接のbuilder.Loopに比べて結果に影響はありませんが、生成コードの清潔さ、美しさ(これはデバッグ性に関連します)、パフォーマンスが損なわれることは明らかです.以前のJscexコンパイラでは、UglifyJS解析器から得られたASTを直接遍歴してコードを生成していたため、不要なDelayが生成されていました(もちろん、上記のように誇張することはありません).新しいコンパイラは構造とポリシーを再調整し、UglifyJSのASTを中間形式に変換します.Jscex ASTと呼んでから、コードジェネレータにJscex ASTからコードを生成させます.新しいジェネレータは、いくつかのdelayノードを省略して、その自ノードから直接コードを生成し、不要なDelayメソッド呼び出しを除去する目的を達成します.
たとえば、高速ソートのJscex関数です.
var bubbleSortAsync = eval(Jscex.compile("async", function (array) {
    for (var x = 0; x < array.length; x++) {
        for (var y = 0; y < array.length - x; y++) {
            var r = $await(compareAsync(array[y], array[y + 1]));
            if (r > 0) {
                $await(swapAsync(array, y, y + 1));
            }
        }
    }
}));

これにより、次のようなコードが生成されます(前の結果に比べてDelayメソッド呼び出しが省略されます).
var bubbleSortAsync = (function (array) {
    var $_builder_$ = Jscex.builders["async"];
    return $_builder_$.Start(this, $_builder_$.Delay(function () {
        
    
    
  
  
     
     
   
   return $_builder_$.Delay(
     
     
   
   function () {
    
    
  
  
            var x = 0;
            return $_builder_$.Loop(
                function () {
                    return x < array.length;
                },
                function () {
                    x++;
                },
                $_builder_$.Delay(function () {
                    
    
    
  
  
     
     
   
   return $_builder_$.Delay(
     
     
   
   function () {
    
    
  
  
                        var y = 0;
                        return $_builder_$.Loop(
                            function () {
                                return y < (array.length - x);
                            },
                            function () {
                                y++;
                            },
                            $_builder_$.Delay(function () {
                                return $_builder_$.Bind(compareAsync(...), function (r) {
                                    
    
    
  
  
     
     
   
   return $_builder_$.Delay(
     
     
   
   function () {
    
    
  
  
                                        if (r > 0) {
                                            return $_builder_$.Bind(swapAsync(...), function () {
                                                return $_builder_$.Normal();
                                            });
                                        } else {
                                            return $_builder_$.Normal();
                                        }
                                    });
                                });
                            }),
                            false
                        );
                    });
                }),
                false
            );
        });
    }));
})

もちろん、Jscexにはさらに最適化された空間があります.たとえば、「bind操作なし」を保持するコードブロックや、「ネストJscex関数」などが含まれます.最近は更新が絶えないはずです.JavaScriptで非同期プログラムを開発している場合は、Jscexを一緒に使用すると、プログラミング生活が著しく改善されることは間違いありません.
広告時間:第4回nBazaar技術交流会は4月23日(今週の土曜日)に暢星ビル(上海市浦東新区碧波路888号、地下鉄2号線張江高科駅下、徒歩10分)の副ビル3階会議室で開催されます.申し込んでいない友達も現場で申し込むことができます.リーダーの支持のため、私たちは現場で999元の盛大なBambookを幸運な観客の贈り物として送ります.また、トゥーリン出版社も十数冊の図書を積極的に発言する観客に提供します.詳細については、アクティビティのトップページを参照してください.
原文:JscexはBSDライセンス契約を使用して正式に発表