スターリンのコンパイラは残酷に最適化しますが、どうやって?


14

JM Siskindの研究声明は次のように述べています。

Stalinは、プログラム全体の静的分析を実行し、その分析の結果を使用して非常に効率的なコードを生成するSchemeの最適化コンパイラです。スターリンは、多数の静的分析手法を利用しています。反復モノバリアントフロー分析を使用して、フロー指向分割を実行するポリバリアントフロー分析の新しい形式を実行します。プロシージャの特殊なコピーのクローニングと、そのようなクローンへのターゲットの呼び出しサイトごとの割り当てです。フロー分析の結果を使用して、ライフタイム分析、エスケープ分析、ポイントツー分析、およびマストエイリアス分析を実行します。これらの分析は、変数のグローバリゼーションやローカリゼーションなどの手法を使用してほとんどのクロージャースロットを削除し、静的バックチェーンを圧縮し、通常プログラムからほとんどのクロージャーを削除する新しい形式の軽量クロージャー変換をサポートします。また、上記の分析を使用して、フロー指向の領域ベースのストレージ管理をサポートします。この場合、ランタイムガベージコレクションは、抽象値ごとおよびプログラムポイントごとに静的な割り当てと割り当て解除に置き換えられます。また、非常に効率的なファーストクラスの継続をサポートするために、Screamerで開拓された技術の拡張を使用して、フロー指向の軽量CPS変換を実行します。最後に、フロー指向のインライン化と低レベルの表現選択をサポートし、タグの実装(または非実装)、タグのチェック、および抽象値ごとおよびプログラムポイントごとのタグディスパッチを選択します。これにより、ほとんどのランタイムタグ、タグチェック、タグ付け、タグストリッピング、タグディスパッチ、ボックス化、およびプログラムからのボックス化解除がなくなります。ランタイムガベージコレクションは、抽象値ごとおよびプログラムポイントごとに静的な割り当てと割り当て解除に置き換えられます。また、非常に効率的なファーストクラスの継続をサポートするために、Screamerで開拓された技術の拡張を使用して、フロー指向の軽量CPS変換を実行します。最後に、フロー指向のインライン化と低レベルの表現選択をサポートし、タグの実装(または非実装)、タグのチェック、および抽象値ごとおよびプログラムポイントごとのタグディスパッチを選択します。これにより、ほとんどのランタイムタグ、タグチェック、タグ付け、タグストリッピング、タグディスパッチ、ボックス化、およびプログラムからのボックス化解除がなくなります。ランタイムガベージコレクションは、抽象値ごとおよびプログラムポイントごとに静的な割り当てと割り当て解除に置き換えられます。また、非常に効率的なファーストクラスの継続をサポートするために、Screamerで開拓された技術の拡張を使用して、フロー指向の軽量CPS変換を実行します。最後に、フロー指向のインライン化と低レベルの表現選択をサポートし、タグの実装(または非実装)、タグのチェック、および抽象値ごとおよびプログラムポイントごとのタグディスパッチを選択します。これにより、ほとんどのランタイムタグ、タグチェック、タグ付け、タグストリッピング、タグディスパッチ、ボックス化、およびプログラムからのボックス化解除がなくなります。非常に効率的なファーストクラスの継続をサポートするために、Screamerで開拓された技術の拡張を使用します。最後に、フロー指向のインライン化と低レベルの表現選択をサポートし、タグの実装(または非実装)、タグのチェック、および抽象値ごとおよびプログラムポイントごとのタグディスパッチを選択します。これにより、ほとんどのランタイムタグ、タグチェック、タグ付け、タグストリッピング、タグディスパッチ、ボックス化、およびプログラムからのボックス化解除がなくなります。非常に効率的なファーストクラスの継続をサポートするために、Screamerで開拓された技術の拡張を使用します。最後に、フロー指向のインライン化と低レベルの表現選択をサポートし、タグの実装(または非実装)、タグのチェック、および抽象値ごとおよびプログラムポイントごとのタグディスパッチを選択します。これにより、ほとんどのランタイムタグ、タグチェック、タグ付け、タグストリッピング、タグディスパッチ、ボックス化、およびプログラムからのボックス化解除がなくなります。これらの分析と最適化により、スターリンは、特に数値が集中するコードの場合、2〜100の範囲で他のすべてのSchemeコンパイラよりも優れた非常に効率的なコードを生成できます。スターリンは多くの場合、手書きのcおよびFortranコードよりも優れたコードを生成します。

クロージャー/関数呼び出しの実装に関する次の非常に興味深い論文を見つけることができました:Flow-Directed Lightweight Closure Conversion。また、著者にメールを送り、クロージャー変換ペーパーに書かれていると言われている他のトピックに関するペーパーについて尋ねました。

Siskind、JM 2000a。フロー指向の軽量CPS変換。準備中。

Siskind、JM 2000b。フロー指向のポリ分散。準備中。

Siskind、JM 2000c。フロー指向の表現選択。準備中。

Siskind、JM 2000d。フロー指向のストレージ管理。準備中

あいにく、彼はそれらの論文を書くことを決して手に入れませんでした。あなたへの私の質問は次のとおりです。これらのトピックをカバーする代替または関連する論文はありますか?スターリン(または他のコンパイラー)が、ガベージコレクションされ、動的に型付けされ、ファーストクラスの機能をサポートし、ファーストクラスの継続でさえも、このような効率的なコードに静的にコンパイルできるSchemeなどの高レベル言語をコンパイルする方法を学ぶことに非常に興味があります。フロー分析に関する論文は非常に豊富ですが、そのような分析の結果を使用して上記の最適化を行うことに関する論文は豊富ではありません。

回答:


11

重要なのは、おそらくプログラム全体の分析とプログラム全体の最適化を使用するという事実です。プログラムの振る舞いについて知れば知るほど、専門化してインライン化し、パフォーマンスを向上させることができます。

標準ML用のMLtonコンパイラーも同様のことを行います(http://mlton.org/)。http://mlton.org/pages/References/attachments/060916-mlton.pdfというプレゼンテーションが(少なくとも)1つあります。

以前の作業は、ワシントン大学のクレイグチェンバーズと彼のグループによって行われました(例:http : //www.cs.washington.edu/research/projects/cecil/www/pubs/jdean-thesis.html)。これは、Selfおよび後のCecil / Vortexのコンテキストで行われました。

おそらく、Scheme / Lispコミュニティにはもっと多くの作業があります。あなたはおそらくグーグル「プログラム全体の最適化」を検討したいと思うでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.