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

ある言語(ソース言語)のコードを読み取り、それを別の言語(ターゲット言語)の同等のプログラムに変換するプログラムに関する質問。

1
コンパイラのA正規化とK正規化の違いは何ですか?
管理標準形式は、各中間命令に名前が付いているプログラム中間表現です。GHCとOCamlで使用されます。 K正規化形式は、各命令が1つの割り当てと演算で構成される中間表現です。MLKit、Min-Caml、およびGoCamlで使用されます。 A正規化とK 正規化の両方に、継続を伴うlet式の生成が含まれます。 A正規化とK正規化は、まったく同じ変換のようです。それらが異なる名前に値するようなそれらの違いは何ですか?

1
クリティカルエッジを分割すると便利なのはいつですか?
一部のコンパイラには、制御フローグラフの重要なエッジを分割するユーティリティ関数があります。これはそれ自体最適化としてではなく、他の分析と変換を単純化するために行われていると思います。クリティカルエッジの分割が役立つのはどのような場合ですか?

2
意味保存の健全性(または正確性)または完全性
用語をある言語から別の言語に変換する場合、直感的に望ましいプロパティは、セマンティクスの保持です(たとえば、ここではCPS変換に使用されます)。 s⇓v⟹c(s)⇓c(v)s⇓v⟹c(s)⇓c(v) s \Downarrow v \implies c(s) \Downarrow c(v) しかし、これを古典的な用語の正しさ(または健全性)と論理システムの完全性と一致させることで、少し問題があります。通常、私は上記のステートメントをの完全性プロパティと見なし(正しさの定義を逆にします)。ccc ただし、直感的には、コンパイラーは完全ではなく正しいはずです(たとえば、型チェックは正しいプログラムを除外することが多いため)。上記の文の逆は、が単射である場合にのみ当てはまります。たとえば、ソース言語にブールとその演算が含まれていて、コンパイルでChurch-encodingを使用して置き換えられた場合、ターゲット言語はブールリテラルからコンパイルされた用語のブール演算を評価できます。ソース言語が評価できないラムダ抽象化。ccc 上記のステートメントがの完全性プロパティであると仮定するのは正しいのでしょうか?ccc 私はまた、非単射コンパイラは通常正しくないという私の結論で正しいのでしょうか?

1
GHC以外のスパインレスタグレスGマシンの実装はありますか?
サイモンペイトンジョーンズ(最近の王立協会会員)から、「ストックハードウェアに遅延関数型言語を実装する:Spineless Tagless G-Machine」というペーパーを読みました。 現在、このペーパーは、Haskellを実装するときにHaskellを遅延言語にして、当時抱えていたいくつかの問題を解決した方法の一部です。 比較可能な唯一の論文は次のようです。Java仮想マシン用のスパインレスタグレスGマシンに基づく遅延関数型プログラムのコンパイルが利用可能な実装がないようです。 接線的に関連しているのは、HaskellをJavaにコンパイルすることです。ただし、このアプローチでは、スパインレスタグレスGマシンの実装をGHCに残し、出力を読み取ります。 私の質問は、GHC以外にスパインレスタグレスGマシンの実装はありますか?
7 compilers 

4
なぜ複数の戻り値が一般的ではないのですか?
複数の戻り値について質問したいのですが、なぜこの構造がプログラミング言語で好まれないのですか(概念的および/または技術的な問題)。スタックフレームについて何か聞いたことがあります。また、戻り値と変数の戻り値のためにメモリを予約することで、これが問題になる可能性があります。 接触型言語(FORTHなど)では、関数からの複数の戻り値を持つことは一般的で非常に便利なものであり、java / cのような言語でこのようなものも役立つと思います(非常に基本的な例)。 x, y = multRet(5); multret(int x) { return x+1; return x+2; exit; } 明確にするために:私は複数の値を返す方法を尋ねていません(これは既知の回答を持つ既知の質問です)が、この習慣がプログラミング言語では一般的ではない理由を明確にしたいと思います。

1
オブジェクト指向言語用のタグなしのガベージコレクション
私は自分の言語に適したガベージコレクション手法を探していて、このペーパーを見つけました。ベンジャミンゴールドバーグは、厳密に型指定された言語のガベージコレクション手法について説明しているため、実行時の型情報の必要性がありません。 簡単に言えば、これは、コンパイルされたコードに直接、関数呼び出しの直後にガベージコレクション関数へのポインターを置くことによって行われます。次に、これを拡張して、MLのようなパラメトリック多態性をサポートします。 今私の質問:このテクニックをオブジェクト指向言語でどのように実装できるかについての作業はありましたか?仮想テーブルのポインタを使用した間接呼び出しを通じて多くの機能が実装されていますか?

1
REGEXPはプログラミング言語でどのように実装されていますか?
変数の有無にかかわらず、パターンマッチング用のプログラミング言語でのREGEXPの解釈またはコンパイルに関する優れた一般的な論文はありますか?私はDFAの構築について簡単な説明を求めているのではなく、プログラミング言語の実装で実際にそれがどのように行われるか、そして単純または難しいと考えられるものについての実際の論文を求めています。言語間の違いに影響があると思います。REGEXPの実装方法に関する正式な論文も役に立ちます:-)

1
C言語の構文はCFGによって完全に定義されていますか?
質問はそれだけで十分だと思います。C言語の構文は、コンテキストフリーの文法によって完全に定義されていますか、それとも、解析中に非コンテキストフリーの定義を必要とする可能性のある言語構成体がありますか? 非CFL構成の例として、使用前の変数の宣言を考えました。しかし、コンパイラ(Aho Ullman Sethi)では、C言語は名前に基づいて識別子を区別しないと述べられています。すべての識別子は、字句解析器によって「id」としてトークン化されます。CがCFGによって完全に定義されていない場合、誰でもCの非CFL構成の例を挙げていただけますか?

4
最初にDFAに変換する代わりにNFAを直接使用する実際のレクサーはありますか?
私はコンパイラでCourseraクラスを受講していますが、レクサーに関するレッスンでは、非決定性有限オートマトン(NFA)を使用して正規表現を解析する間に、決定論的有限オートマトン(DFA)との間に時空間トレードオフがあることを示唆しています。私が正しく理解している場合、トレードオフはNFAが小さいことですが、すべての可能な状態を同時に考慮する必要があるため、ほとんどの場合DFAに変換されるため、トラバースに時間がかかります。「実際の」生活でDFAの代わりにNFAを使用するレクサー、つまり、単なる概念実証ではなく、本番環境で使用されるコンパイラーはありますか?

2
モノイドは最適化に役立ちますか?
多くの一般的な操作はモノイドです。Haskellはこの観察を利用して、多くの高階関数をより一般的なものにしています(Foldable1つの例です)。 モノイドを使用してパフォーマンスを改善できる1つの明白な方法があります。プログラマーは操作の結合性をアサートしているため、操作を並列化できます。 モノイドを扱っていることを知って、コンパイラーがコードを最適化できる他の方法があるかどうか知りたいです。

3
コンパイラーは、配列への交互アクセスを検出してメモリーにインターリーブできますか?
配列が別の方法でアクセスされるループを最適化するコンパイラを設計することは可能ですか?たとえば、次のようになります。 // int[] a,b int sum = 0; for(int i = 0; i < n; i++) { sum += a[i] + b[i]; } 通常のシーケンシャルアレイ装置と、a[i]及びb[i]互いに離れメモリであってもよいです。したがって、優れたコンパイラ最適化はそれを検出しa[i]、b[i]常に「同時に」アクセスされることを検出し、インターリーブされた配列を格納します。a[0] b[0] a[1] b[1] ...つまり、1つのメモリアクセスでa[i]との両方を取得できますb[i]。

1
抽象構文ツリーを指数関数未満の時間で解析できませんか?
問題の抽象的な説明 私の見たところ、解析解除とは、ASTからトークンストリームを作成することを意味し、再度解析すると、等しいASTが生成される、つまりparse(unparse(AST)) = AST保持されるはずです。 これは、同じASTを生成する有効な解析ツリーを見つけることと同じです。 言語は、eBNFバリアントを使用した、コンテキストフリーのS属性の文法で記述されます。 したがって、アンパーサーは、すべての文法制約が保持されている通過ノードを通過する有効な「パス」を見つける必要があります。これは基本的に、文法生成規則へのASTノードの有効な割り当てを見つけることを意味します。これは一般に制約充足問題(CSP)であり、バックトラックすることにより、解析と同様に解決できます。O (eん)O(eん)O(e^n) 幸いなことに、構文解析では、GLRを使用してでこれを行うことができます(またはより適切に文法を制限します)。AST構造は文法生成規則構造に非常に近いので、実行時間が解析よりも悪い実装を見て本当に驚きました。XTextは解析にANTLRを使用し、解析解除にバックトラックを使用しています。O (ん3)O(ん3)O(n^3) ご質問 コンテキストフリーのS属性文法は、パーサーとアンパーサーが共有する必要があるすべてのものですか、それとも、たとえば、解析手法/パーサーの実装に制約がありますか? この問題は一般的にではないと感じています-天才がこれを手伝ってくれるでしょうか?O (eん)O(eん)O(e^n) StackOverflowでこの質問に対する回答を受け取りませんでした。ここで質問することを提案されましたが、私は冗長性が嫌いなので、ここで回答するように頼むことを許してくれるといいのですが。

6
すべての言語に意味的および論理的なエラーがある可能性はありますか?
私はPHPについて読んでおり、多くの著者がセマンティックエラーと論理エラーを別々に言及しています。セマンティックエラーの例として、不正な数のパラメーターで呼び出される関数が提供されます。これはパーサーによってキャッチされませんが、実行時にエラーをスローします。 しかし、C ++などの言語では、これはコンパイラーによってキャッチされます。その時それは構文エラーだと思います。意味的エラーと論理的エラーの違いは何ですか? たとえば、「コンピュータサイエンティストのように考える方法」では、著者は「論理エラー」と「意味エラー」を同じ意味で使用しています。一方、Visual Basic .NETでは。Primer Plusでは、「論理エラー」は「セマンティックエラー」から分離されています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.