Scheme2Js Javascriptのコンパイラへのスキームです。いくつかの努力がR5RSにできるだけ近いことに費やされてきたが、我々は効率に主に集中しました。
通常Scheme2Jsはそれが手で書いたコードに匹敵する、Javascriptのコードを生成します。この性能を達成するために、Scheme2Js完全R5RS準拠していません。特に、それは、継続のためのサポートを欠いている正確な数、それは部分的にしか末尾再帰を扱います。
Scheme2Jsは、結果を変更することを可能にするいくつかのフラグを、提供します。
ยท--no-JS-ドット表記は、ドット表記でJavaScriptのフィールドへのアクセスを禁止します。このフラグは、のdocument.getElementByIdのようにフォームのxyのアクセスを無効にします。これは、JSフィールド機能を使用して有効な式であるアクセスするためにしかしまだ可能です。
ยท--mutable-文字列:文字列 - 操作のパフォーマンスを向上させるためとSchemeとJavaScriptコードとの間のインタフェースを容易にするために、デフォルトの実装では、JavaScriptの文字列にSchemeの文字列をマッピングします。 Schemeの文字列に反して、JavaScriptの文字列は、しかし、不変です。可変ですSchemeの文字列を表すJavaScriptクラス、このフラグマップの文字列、。その結果生成されたコードはわずかに遅いかもしれないが、それはJavaScriptコードとのインタフェースすることはより困難です。
ยท--encapsulateパーツ無名関数にプログラムをカプセル化します。唯一のグローバル変数は、この無名関数の外側にあります。一方で、これは無名関数への1つの関数呼び出しを紹介します。しかし、一方で、ほとんどのJavascriptの実装は、この最適化を高速に実行する必要があります。通常、ハッシュテーブルは、JavaScriptでのスコープを表すために使用されます。無名関数を使用してプログラム変数は、これらの変数へのアクセスを加速(理論的に)自分の小さいハッシュテーブルに分離されます。さらに重要な変数は、独自のハッシュテーブルではなく、グローバル変数からアクセス可能なグローバルハッシュテーブルに格納されています。それは間接的にグローバル変数の内容を変更することは非常に簡単です。インライン化または他の一般的な最適化は、したがって、グローバル変数に行うことは不可能です。匿名関数で、プログラムの変数を格納することにより、これらの最適化が再び可能となります。
ยท--optimize-VAR-数が得られたJavaScriptコードで使用される変数の数を減らすことができます。コードは高速に実行されますが、変数名が失われ、同じ変数を複数回使用されるかもしれないように、デバッグがより困難である場合があります。
ยท--optimize-しばらくこのフラグScheme2Jsでループしながら、一般的な最適化します。最適化されていないループは、多くの場合、フォームのであるが。
一方、(真){
(テスト)の場合
resVar =の解像度;
他の{
modify_loop_variable;
継続;
}
破ります;
}
この最適化は、これらのパターンを検索し、whileループの中にテストを移動します。
一方、(!テスト){
modify_loop_variable;
}
resVar =の解像度;
この最適化は、ごく最近になって実装されているので、まだデフォルトで有効になっていません。
ยท--verboseは、いくつかの情報を出力します。
ยท--no-インライン化は、すべての関数のインライン展開(定数はまだインライン化されるかもしれない)を無効にします。
ยท--inline-グローバルはScheme2Jsインライングローバル関数と定数をすることができます。これは、2つの望ましくない副作用があるかもしれない。いずれかのグローバル変数は、多くの場合、異なるモジュール間でデータを転送するために使用されます。それらへの参照はもう存在しない場合、一部のインライン関数は失われます。グローバル関数は、モジュールの外部で使用する場合は、1は、このフラグを使用しないでください。 (この動作はScheme2Jsの将来のバージョンで変更される可能性があります。)
ยท--unresolved--JSです:変数がバインドされていない場合、コンパイラは、変数が別のモジュールから、またはJavaScriptから来ていると仮定します。 JavaScriptのスキームインターフェイスのより詳細な議論のためにはJavaScript - セクションスキームを参照してください。
ยท--js-これは、Schemeの関数内でこの変数を提供します。この方法は、スキーム手順はJavaScriptオブジェクトのメソッドとして使用することができます。
ยท--no-tailrecはwhileループの最適化にtailrecを無効にします。あなたはテールRECSを変換するコンパイラのようにバグがあると思われる場合、あなたはこのフラグを試みることができます。
ยท--no-最適化·コールは、バイナリまたは単項演算のScheme2Jsのインライン展開を無効にします。インスタンスsci_plus(3、5)(3 + 5)に最適化されます。この最適化は非常に重要であり、それを無効にする理由は、通常はありません。
ยท--no-最適化-constsは、事前に一定の計算を無効にします。 (このフラグ付き)無効になっていない限り、化合物の定数は事前に計算され、その発生が一定に保持する変数への参照に置き換えられました。繰り返しになりますこれは、より速く、これらの定数へのアクセスが、新しい変数を導入しています。
ยท--no-最適化-boolifyはboolify最適化を無効にします。 JavaScriptのだとSchemeのboolifyは等価ではありません。JavaScriptは、スキームのみに#fを持っているのに対し、偽であることを、0、偽nullとundefinedと考えています。最適化されていないboolifyは、常に偽に対してテストを追加します。if(テスト== falseを!)... Scheme2Jsが見ることができる場合、テスト自体はブール値であること、それは不要なを削除することができます== falseをテストします!このフラグは、この最適化を無効にします。
ยท--d STAGEは、ステージSTAGE後にASTのドットファイルを(graphvizのを参照してください)出力します。可能な段階は次のとおりです。展開、ツリー、シンボル、ノードelim1、尾、インライン、定数伝播、RM-未使用VARS、キャプチャ、ノードelim2、一方、(TT「文」)、ノードelim3。通常、1つの場合を除き、デバッグのために、このフラグは必要ありません。
ยท--print-LOCSはJavaScriptファイルにコメントとして元の場所を表示します。これらの場所は、現在の文字オフセットファイルの先頭からです。
このリリースの新機能:
このマイナーチェンジとバグ修正がScheme2Jsにホップから移植されています。
このバージョン20100816の新機能です:
このScheme2Js「ランタイム·リーダーは、現在のキーワードを認識します。
いくつかのバグが修正されました。
このバージョン20081219の新機能:
このコンパイラが最適化されています。
今ははるかに高速であり、少ないメモリを消費します。
多くのバグが修正されました。
Scheme2Jsのデフォルトモジュールの句は、現在Biglooのいずれかのような。
このリリースでは、修飾された名前をサポートしています。
コメントが見つかりません