タグ付けされた質問 「compilers」

5
コンパイラの正当性の証明
私はコンパイラの正当性の証拠をカバーするチュートリアル資料を探しています。できれば、初歩の学生のレベルで、表現法を使用してください。 あるいは、問題を説明するために使用できる簡単なコンパイラーの例を知っていますか?(最初に出てきた例は、中置から後置式への翻訳者でした。しかし、構文の帰納法以外の興味深いことは何も示しませんでした。)

2
モジュラーコンパイラでPottierとGauthierのポリモーフィックな非機能化を使用した人はいますか?
機能停止とは、高次プログラムを1次プログラムに変換するプログラム変換です。アイデアは、プログラムが与えられた場合、有限数のラムダ抽象化があるため、各ラムダをIDで置き換え、各関数アプリケーションをそのIDで分岐する適用プロシージャの呼び出しで置き換えることができるということです。これは関数型言語のコンパイラーで使用されることもあり ますが、その適用性は、機能停止がプログラム全体の変換であるという事実によって制限されるため(プログラム内のすべての関数を静的に知る必要があります)、プログラム全体のコンパイラーのみがそれ。 ただし、PottierとGauthierには、GADTを含むより洗練された型付けを使用した、多相型型の非機能化アルゴリズムがあります。エンコードが指定されると、タグではないが高次関数を含むラムダデータ型にキャッチオールケースを追加することができます。つまり、モジュールごとにエンコードを使用して機能を無効にすることができるはずです。 誰かがこれをやったことがあり、このアイデアを使用しているコンパイラを指し示していますか?(おもちゃのコンパイラは大丈夫であり、実際に推奨されます。)


1
スターリンのコンパイラは残酷に最適化しますが、どうやって?
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などの高レベル言語をコンパイルする方法を学ぶことに非常に興味があります。フロー分析に関する論文は非常に豊富ですが、そのような分析の結果を使用して上記の最適化を行うことに関する論文は豊富ではありません。
14 compilers 


2
依存型のコンパイラはインタープリターよりもはるかに難しいですか?
このチュートリアルのように、依存型の実装について何かを学びましたが、それらのほとんどはインタープリターの実装です。私の質問は、型チェックのために依存型の引数を実際に評価できるため、依存型のコンパイラを実装するのはコンパイラよりもはるかに難しいようです。 そう 私の素朴な印象は正しいですか? それが正しい場合、依存型をサポートする静的にチェックされた言語の実装に関する例/リソースはありますか?

1
プログラムの最小化
回路の最小化は、特定の回路のサイズを最小化するための問題です。一般的なプログラムに似たものはありますか? 特に私の質問は- 特定のプログラムの命令数を最小限にするアルゴリズムが存在しますか?私はそれが決定不可能な問題であることを知っていますが、何か最適なものを返すソリューションを探していません。 これを行うために既存のコンパイラー変換を適用できますが、事前に検索するために非常に狭い変換とアルゴリズムのセットを定義する必要がないものを探しています。 編集:私が持っているもう1つの問題は、そのような意味論的に同等なプログラムの空間全体を探究することを可能にする健全で完全な計算が可能か、それとも不可能かということです。

1
エイリアス分析に関する文献
私はCSで修士論文を書いていて、エイリアス分析を扱っています。私が興味を持っているのは、Javaライクな言語向けの手続き内のフロー依存の必須エイリアスと多言語エイリアス分析です。 私はこの主題の基本を詳細に説明しているテキストを探していますが、本当に適切なものを見つけることができませんでした。 私はコンパイラと静的分析に関する多くの教科書を生き延びましたが、そこには何も見つかりませんでした。 私はエイリアス分析が使用されている多くの論文を見つけましたが、それらのほとんどはエイリアス分析が適用される問題に焦点を当てており、エイリアス分析アルゴリズムを詳細に説明していません。他のものはCに焦点を合わせていますが、これは一般的なポインタの複雑さが増したために適切ではありません。 私が見つけた最高のテキストは、WhaleyとRinardによる論文「Compositional Pointer and Escape Analysis for Java Programs」です。それは素晴らしい論文であり、良い出発点ですが、エイリアス分析については特に説明していません。 問題は非常に一般的なようですので、私はそれを解決するために利用できるいくつかの標準的なアルゴリズムがあると期待しました。 誰かがこの主題に関するテキストへのポインタを持っていますか?

2
Coq / Agdaの認定コンパイラーと最適化
Martin-Löf型理論で公式化された検証済みコンパイラー、つまりCoq / Agdaに興味があります。現在、小さなおもちゃの例を書いています。これにより、私の最適化が正しいことを証明できます。たとえば、ゼロの加算、つまり "x + 0"のような式は削除できます。 通常のコンパイラで実行するのが難しい最適化はありますか?通常のコンパイラでは実行できない最適化を可能にするプログラムの特定のプロパティを証明することは可能ですか?(すなわち、定理証明で可能である推論なしで) 私はアイデアや例に興味があり、またトピックに関する参考文献にも興味があります。 関連する質問: コンパイラの正当性の証明 編集:剛がコメントにうまく書いているように:コンパイラが(たとえば)Cで書かれている場合は実装が困難で、コンパイラが(たとえば)Coqで書かれている場合は実装が容易な最適化手法を探しています。Agdaが(haskellを介して)Cにコンパイルされると、CでもAgdaで可能なすべてのことを実行できます。おそらくCoq / Agdaのような定理証明者の唯一の利点は、コンパイラーと最適化を検証できることです。 edit2:Vijay DIの提案に従って、これまで読んだことを書いてください。私は主にINRIAのXavier LeroyとCompCertプロジェクトに焦点を当てました(80ページの論文があり、読みやすいと思います)。2番目の関心は、インタラクティブプログラムに関するAnton Setzerの作業にありました。私はおそらく、彼の研究はIOプログラムとIOプログラムのバイシミュレーションに関する特性を証明するために使用できると思います。Sewellについて言及していただきありがとうございます。ICFPで彼の "ジャングルからの物語"の話を聞いて、おそらく彼の論文の2〜3冊を読んだ。しかし、私は彼の作品と彼の共著者の作品を具体的には見ていません。 コンパイラーの最適化に関する論文をどこから始めて探すかはまだわかりませんでした。たとえば、検証されたコンパイラの設定でどの最適化を見ると興味深いでしょうか。

1
Haskellの型クラスの可能な実装とは何ですか?それらの(欠点)は何ですか?
私の知る限り、型クラスの制約を持つHas​​kell関数は、特定の各型クラスの必要な実装を持つ辞書を受け取る追加の引数を持つ関数に内部的にコンパイルされます。 型クラスをコンパイルする方法は他にありますか? もしそうなら、彼らの(不)利点は何ですか? そして、どのコンパイラがそれらを使用しますか?

3
アルゴリズム分析を自動化できますか?
コンパイラが最悪の場合の漸近分析を自動的に実行できるように、プログラミング言語とコンパイラの可能性について誰かが考えましたか?私が考えているユースケースは、コードを書いてコンパイルするプログラミング言語です。コンパイラーは、コードがO(n ^ 2)で実行されることを教えてくれます(たとえば)。これは、アルゴリズム分析を行う賢い人々が行うこと、おそらくループを数えることなどによって行われます。 問題の問題を停止するため、そしてP = NPの場合の多項式時間で実行されるSATのLevinアルゴリズムなど、ダブテールで機能するプログラムを使用できるため、プログラミング言語を十分に制限して、このようなもの。特定の種類のプログラミング言語がそのようなコンパイラーを使用できないようにする否定的な結果はありますか? 正確な漸近分析ではなく、「興味深い」上限を与えるシステムにも興味があります。 私は特にしていないでブラックボックスと特定の長さの入力からのサンプルの統計的手法に興味を持って、プログラムにかかる時間を見つけます。これらの方法は非常に興味深いですが、私が探している方法ではありません。おおよその限界を与える正確な方法に興味があります。 誰かが私にこの方向での仕事についてのいくつかの参照を指摘してくれれば私は非常に感謝します。

1
コードとコンパイラの最適化のための機械学習?
より効率的なコード(つまり、コンパイル時と実行時のヒューリスティック)を生成するためにMLを調査しています。私はphd(コンパイラ、hpc)を持っていますが、MLの経験はほとんどありません。 既存の作品への参照をいただければ幸いです。 さらに重要なのは、どの機械学習技術を探求するべきか? 各データサンプルは、コード+テスト実行+パフォーマンスデータです 正しいラベル付けされた多数のデータサンプル 変更する多数のパラメーター 任意のサンプルを任意のパラメーターで再実行できます(および正しいラベルを取得します) サンプルを実行および再実行するための大量のCPU そして、私の非常に疑わしい仮定のいくつか... コードの多くはすでにローカルに最適化されています(基本的なコンパイラー最適化) 一部のパラメータは「高レベルの概念」です。たとえば、配列をリンクリストに置き換えます。(したがって、小さなパラメーターの変更はさまざまな効果をもたらします) 望ましい改善には限界がある(xKの改善は「十分に良い」であり、Kはよく知られている) パラメータはまばらで、つまりほとんどゼロです(ほとんどのコードは基本的に良好であり、有益な変更は比較的少ないと思われます)。 私に私の道を設定するための任意のポインタはいただければ幸いです

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