JscexはBSDライセンス契約を使用して正式に発表
6276 ワード
今回はJscexをしっかりやるつもりですが、実は技術的な障害が「順番に」突破できることはめったにありませんが、Jscexは確かにチャンスがあると思います.HTML 5、Node.jsはそれぞれ赤いものです.先日、私は2晩かけて半生の中国語英語でGithubのプロジェクトのトップページに完全だと思っていた説明文字を書いたが、数時間後にStratifiedJS(Jscexの目標と似たようなプロジェクト)の著者からメールが届き、StratifiedJSについていくつかのことを話した.私は彼にStratifiedJSのいくつかの詳細な問題を尋ね、Jscexの実現原理も簡単に紹介した.現在、JscexはBSDライセンス契約を使用して正式に発表されています(中国語ステーションも近いうちに発売されます)、さらに詳細な最適化を行い、普及し始めます.
最近の最適化は、不要なDelayメソッド呼び出しを除去することです.Delayの目的は、あるコードの実行時間を遅延させ、適切な時間にのみ実行されることを確保することです.これは、「遅延」ではなく、副作用のある言語にとって非常に重要です.F#でのDelayメソッドの署名は次のとおりです(Jscexと同様).
Delay関数はネストされ続けることができ、効果から言えば違いはありません.例えば、次のようなものです.
上のコードと直接のbuilder.Loopに比べて結果に影響はありませんが、生成コードの清潔さ、美しさ(これはデバッグ性に関連します)、パフォーマンスが損なわれることは明らかです.以前のJscexコンパイラでは、UglifyJS解析器から得られたASTを直接遍歴してコードを生成していたため、不要なDelayが生成されていました(もちろん、上記のように誇張することはありません).新しいコンパイラは構造とポリシーを再調整し、UglifyJSのASTを中間形式に変換します.Jscex ASTと呼んでから、コードジェネレータにJscex ASTからコードを生成させます.新しいジェネレータは、いくつかのdelayノードを省略して、その自ノードから直接コードを生成し、不要なDelayメソッド呼び出しを除去する目的を達成します.
たとえば、高速ソートのJscex関数です.
これにより、次のようなコードが生成されます(前の結果に比べてDelayメソッド呼び出しが省略されます).
もちろん、Jscexにはさらに最適化された空間があります.たとえば、「bind操作なし」を保持するコードブロックや、「ネストJscex関数」などが含まれます.最近は更新が絶えないはずです.JavaScriptで非同期プログラムを開発している場合は、Jscexを一緒に使用すると、プログラミング生活が著しく改善されることは間違いありません.
広告時間:第4回nBazaar技術交流会は4月23日(今週の土曜日)に暢星ビル(上海市浦東新区碧波路888号、地下鉄2号線張江高科駅下、徒歩10分)の副ビル3階会議室で開催されます.申し込んでいない友達も現場で申し込むことができます.リーダーの支持のため、私たちは現場で999元の盛大なBambookを幸運な観客の贈り物として送ります.また、トゥーリン出版社も十数冊の図書を積極的に発言する観客に提供します.詳細については、アクティビティのトップページを参照してください.
原文: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ライセンス契約を使用して正式に発表