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

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

1
絞り込みタイプの推測
職場では、動的言語に関する型情報を推論する必要があります。次のように、ステートメントのシーケンスをネストされたlet式に書き換えます。 return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } 一般的なタイプ情報から始めて、より具体的なタイプを推測しようとしているので、自然な選択は絞り込みタイプです。たとえば、条件演算子は、trueブランチとfalseブランチの型の和集合を返します。単純なケースでは、非常にうまく機能します。 ただし、次のタイプを推測しようとしたときに、思わぬ障害に遭遇しました。 function …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

3
文法
缶誰かが私に制作しようとバックトラックと理由を再帰下降構文解析啓発とS → A(この順番では)文法によって形成された言語認識していないS → A S Aを| A。S→aSaS→aSaS \rightarrow aSaS→aaS→aaS \rightarrow aaS→aSa | aaS→aSa | aaS \rightarrow aSa\ |\ aa 言語からの単語を解析するだけのようです。{a2n | n≥1}{a2n | n≥1}\{a^{2^n}\ |\ n \ge 1 \} たとえば、このABNFパーサージェネレーターをプロダクションルールとともに使用して、そのようなパーサーを生成しましたがS = "a" S "a" / "aa"、パーサーはを認識しませんaaaaaa。 パースツリーの左端からのノードの連結が7で始まるまでは、プロダクションを使用し、その後、ツリーが見えるまでプロダクションS → a aを選択して、パースツリーを上に移動することを期待します。このような:S→aSaS→aSaS \rightarrow aSaaS→aaS→aaS \rightarrow aa S / | \ a …

2
最近のコンピューターの理論上のレジスタの最小数は?
私は学部の研究でコンパイラのコースを受講し、おもちゃのJavaのような言語でソースプログラムをおもちゃのアセンブリ言語(インタプリタがありました)にコンパイルするコンパイラを書きました。プロジェクトでは、「実際の」ネイティブ実行可能ファイルに密接に関連するターゲットマシンについて、次のようないくつかの仮定を行いました。 専用スタックポインタ( "SP")レジスタによって追跡されるランタイムスタック 専用ヒープポインター( "HP")レジスターによって追跡される動的オブジェクト割り当て用のヒープ 専用のプログラムカウンタレジスタ(「PC」) ターゲットマシンには16個のレジスタがあります データの操作(ジャンプなどとは対照的)はレジスタ間操作です レジスター割り当てを最適化として使用することについてユニットにたどり着いたとき、それは私に不思議に思いました:そのようなマシンのレジスターの理論上の最小数はいくつですか?コンパイラーで5つのレジスター(SP、HP、PC、および2進演算のストレージとして使用するための2つ)を使用したことを前提にしています。レジスター割り当てのような最適化は確かにより多くのレジスターを利用することができますが、スタックやヒープのような構造を維持しながら、より少ないレジスターでうまくいく方法はありますか?レジスタアドレス指定(レジスタ間操作)では少なくとも2つのレジスタが必要だと思いますが、3つ以上必要ですか?

1
文字列とCFGが与えられた場合、文字列の後に続くことができる文字(CFGの定型形式)は?
してみましょう、端末とのセットでNいくつかの文脈自由文法の非終端記号の集合G。ΣΣ\SigmaNNNGGG 私は文字列持っていると言うように、X 、A Y ∈ S(G )xは、yは∈ (Σ ∪ N )*およびS(Gは)のsentential形態であるG。a∈(Σ∪N)+a∈(Σ∪N)+a \in (\Sigma \cup N)^+xay∈S(G)xay∈S(G)x a y \in \mathcal{S}(G)x,y∈(Σ∪N)∗x,y∈(Σ∪N)∗x,y\in (\Sigma \cup N)^*S(G)S(G)\mathcal{S}(G)GGG 与えられた、Iセットを決定したいC = { B | W BをZ ∈ S(G )、B ∈ Σ ∪ N }を。GGGC= { b ∣ w a b z∈ S(G )、B ∈ Σ ∪ N}C={b∣wabz∈S(G),b∈Σ∪N}C …

3
プログラム分析の開始
プログラム分析を始めるためのリソースを探しています。 私がこのトピックについて見つけた唯一の本は、ニールソンとニールソンの本です。 それ以外には、「プログラム分析」が章か何かに沿った「コンパイラ」本だけがあるようです。 人々は他のリソースを知っていますか?

2
それ自体でプログラミング言語をコンパイルする
私はコンピュータサイエンスの学生です。独自のプログラミング言語(命令の少ない基本言語)を作成したい。 私は構文解析を行う方法を知っています。すでにPerlでそれを行いました。記事では、コンパイラーについて何かを読みました。コンパイラーはそれ自体で行われます。 たとえば、CコンパイラはCで書かれています。それはどのように可能ですか?自分の言語を作ることはできますが、どうすれば実行できるのかわかりません。何か案が? それは本当に良い質問で、ブログでプロジェクトを書くことができます。

1
静的型チェックが保守的すぎるのは不自然な例では何ですか?
でプログラミング言語で概念、ジョン・ミッチェルは、静的な型チェックが原因で停止問題の(過度に厳格な)は、必ずしも保守的であることを書き込みます。彼は例として以下を与えます: if (complicated-expression-that-could-run-forever) then (expression-with-type-error) else (expression-with-type-error) 誰かが実際に問題となる不自然な答えを提供できますか? 私はJavaが次のような場合に動的にチェックされるキャストを許可することを理解しています: if (foo instanceof Person) { Person p = (Person) foo; : } しかし、私は、言語間の問題よりも、Java言語/コンパイラーの欠陥の必要性を考えています。

3
データフロー分析、抽象的な解釈、および型推論の同等性?
最近の質問に対する @Babouの回答は、データフロー分析の同等性(推論または証明できる事実と推論アルゴリズムを実行する時間の複雑さの両方の観点から)に関する論文を読んだことを思い出します、抽象解釈、および型推論。 一部のサブケース(フォワードコンテキスト依存の手続き間データフロー分析と抽象的な解釈の間など)では、同等性は私には比較的明白ですが、他の比較については問題がより微妙に思えます。たとえば、Hindley-Milner型推論を使用して、フロー依存のデータフロー分析で証明できるいくつかのプロパティを証明する方法を理解できません。 データフロー分析、抽象的な解釈、および型推論の間の同等性(または違い)について議論している独創的なリファレンスは何ですか?

3
クロスコンパイラのTダイアグラム
Red Dragon Book CompilersのBootstrappingを研究していて、クロスコンパイラーのTダイアグラムがかなり混乱していることがわかりました。「コンパイラ1からコンパイラ2を実行する」が何を意味するのか理解できません。誰かがいくつかのより良い説明、類推、または実際のコンパイラに関連する例を提供できますか? 最初にいくつかの表記。 私は言語のコンパイラの平均 言語で書かれた出力言語/マシンコード生成。これは墓石またはT-diagramsです。L SN=LSN=LSN= LLLSSSNNN コンパイラーのコンパイル マシンNのコードを生成する実装言語Sの新しい言語Lのクロスコンパイラーがあるとします。 L SN=LSN=LSN= マシンMで実行されている既存のSコンパイラもマシンMのコードを実装しているとします。 SMM=SMM=SMM= LMNを生成するためにSMMを介してLSNを実行する コンパイラの構築 L MN= L SN+ SMMLMN=LSN+SMMLMN = LSN + SMM

1
型レベルでの連結の表現
スタックに基づいて、連結パラダイムに従って、小さな単純な言語を作成することにより、連結プログラミングについて詳しく学びたいと思います。 残念ながら、私は連結言語とそれらの実装に関する多くのリソースを見つけていません。そのため、私の可能なことを前もって申し訳ありません。 したがって、私は言語を関数の連結の単純なシーケンスとして定義し、ASTでリストとして表しています。 data Operation = Concat [Operation] | Quotation Operation | Var String | Lit Literal | LitOp LiteralOperation data Literal = Int Int | Float Float data LiteralOperation = Add | Sub | Mul | Div 次のプログラム4 2 swap dup * +(に対応2 * 2 + 4)が解析されると、次のASTが得られます。 Concat [Lit …


4
コンパイラーを作成してプログラミング言語を作成しますか?
たとえば、自分でプログラミング言語を作成したいと考えました。見た目と動作をどのように決定するかをすべて決定したと仮定すると、そのためのコンパイラーを作成するだけでよいですか? たとえば、高レベルのJavaコードはテキスト以外の何かであり、このテキストは、コンパイラがそれを受け入れて別の何かに変換するための正しい形式になっていますか? 私の質問は、プログラミング言語の作成はコンパイラを介して行われるのですか?ハイレベルで結構です。

1
C / C ++と競合する高品質のLISP / Schemeコンパイラ
理論的に言えば、コンパイルされたCと競合できるコードを生成できるLisp / Schemeコンパイラを使用することは可能でしょうか。 私のテストでは、現在のコンパイラ(Bigloo、SBCL、Gambit、Chickenなど)が同等のCコードより20〜50倍遅いことがわかりました。 のみ外れ値スターリンコンパイラです。単純なプログラムの場合は、Cと同等のバイナリが生成されます。しかし、疑わしいのは、他のプロジェクト(Bigloo、Chicken、Clozureなど)が、スターリンが使用するトリック(「プログラム全体の最適化」)の実装を試みていないことです。等)。 私は90年代半ばからLISPの大ファンで、C / C ++ /。NET / etcを使用して通常の半分の時間でプロジェクトを実行できるようにしたいのですが...パフォーマンス問題は大きな障害です。 質の高いLISPコンパイラが不足しているのは、深刻な時間とお金がこのテーマに費やされていないためか、コンパイラテクノロジの現状を考えると、これは単に実行可能なタスクではないのでしょうか。

3
Cスタイルの/ ** /コメントの正規表現の導出
私はCスタイル言語のパーサーに取り組んでおり、そのパーサーにはCスタイルの/ ** /コメントに一致する正規表現が必要です。今、私はこの表現をウェブ上で見つけました: /\*([^\*]*\*+[^\*/])*([^\*]*\*+|[^\*]*\*/ しかし、ご覧のとおり、これはやや乱雑な表現であり、実際に一致させたいかどうかが正確に一致するかどうかはわかりません。 それらが本当に正しいことを手動で簡単に確認でき、その後上記の正規表現に変換可能(「コンパイル可能」)な正規表現を(厳密に)定義する別の方法はありますか?

4
科学計算用の高速で無駄のないJavaScript:どの機能を維持する必要がありますか?
ここで私は数学教育の障壁を下げることに本当に興味があります。 目標: 私はJavaScriptコミュニティ用に作成されてほしいと思います。これは、Pythonベースの/リンクされた科学的および高性能なコンピューティングライブラリに相当します(それらのすばらしいリストはSageなどから入手できます)。そして私はそれを望んでいます。なぜなら、私は、JavaScriptを学ぶ人々が、Python(および会社)を学ぶ必要なく、科学的および数値計算に簡単に入ることができるようにしたいからです。(基本的にはいつかPythonを習得したので、Pythonを学ぶのは簡単ですが、これはおそらく、JavaScriptの制限されたサブセットをPythonにコンパイルするのが簡単になることを示唆しています。) 仮説法: 私がターゲットとしている市場(「人間のコンパイラー」)はすでにJavaScriptを知っているプログラマーであるため、私は主にJavaScriptとの違いが最小限の新しい言語に興味があります。私がそれらの人々をターゲットにしたいのは、RPythonとCythonがPythonで行うように、より高速なCにコンパイルするコードを書くための最小限の異なる言語を彼らに与えることです。私はたくさんのJavaScript機能を放棄するつもりです。最小限の機能を追加するように注意してください。Lua、Dart、ECMA Harmony(正式なリリース日はありません)を確実に調べます。 、または私は間違っていますか?)など。これらはすべて、JavaScriptの現在の(2012)実装に非常によく似ているためです。 疑わしい動機: 私は個人的に、物事をより速く実行できる言語/ツールセットを学びたいと思っています(このため、Erlangを自分で学習しています)が、ここでは特に、そのようなことをしていない他の人のためにバー(申し訳ありません)を下げることに興味があります意欲。これは、「ケーキを手に入れて食べたいので、問題の調査に時間をかけている」状況の1つにすぎません。私はコンピュータ言語設計の経験が非常に限られていますが、生態系のハッキングの観点から見ると、この問題は研究するのに十分興味深いと思われるので、すぐにもっと多くのことをしたいと思っています。

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