解釈されたコードとコンパイルされたコードの違いは、おそらくラフィエルのコメントが強調するフィクションです。
the claim seems to be trivially wrong without further assumptions: if there is
an interpreter, I can always bundle interpreter and code in one executable ...
事実は、コードは常にソフトウェア、ハードウェア、または両方の組み合わせによって解釈され、コンパイルプロセスはどちらになるかを判断できないということです。
コンパイルとみなすのは、ある言語(ソース)から別の言語(ターゲット)への翻訳プロセスです。また、のインタープリターは通常のインタープリターとは異なります。STST
コンパイルされたプログラムは、ある構文形式から別の構文形式に変換され、言語およびの意図されたセマンティクスが与えられると、およびは同じ計算動作を持ち、通常はいくつかのことを試みます複雑さや単純な効率(時間、スペース、表面、エネルギー消費)など、おそらく最適化のために変更します。正確な定義が必要になるため、機能的同等性については話さないようにしています。PSPTSTPSPT
実際、一部のコンパイラは、実行を「改善」するのではなく、単にコードのサイズを縮小するために使用されています。これは、プラトンシステムで使用されている言語の場合です(ただし、コンパイルとは呼ばれていません)。
コンパイルプロセス後にのインタープリターが不要になった場合、コードが完全にコンパイルされたと見なすことができます。少なくとも、それは理論的な質問ではなく工学的な質問としてあなたの質問を読むことができる唯一の方法です(理論的には、通訳をいつでも再構築できるからです)。S
問題を引き起こす可能性のあるものの1つ、afaikはメタ循環性です。これは、プログラムが独自のソース言語で構文構造を操作し、プログラムフラグメントを作成して、元のプログラムの一部であるかのように解釈する場合です。あなたが言語で任意のプログラムの断片を生成することができますので、無意味な構文フラグメントを操作する任意の計算の結果として、私はあなたが(エンジニアリングの観点から)、それはほぼ不可能にすることができ、言語にプログラムをコンパイルするために推測ように、フラグメントを生成するようになりました。したがって、のインタープリター、または少なくともからSSTTSSTで生成されたフラグメントをオンザフライでコンパイルするための(このドキュメントも参照)。S
しかし、これをどのように適切に定式化できるのかはわかりません(そして、今のところそれに時間がない)。そして、形式化されていない問題の大きな言葉は不可能です。
さらなる発言
36時間後に追加されました。この非常に長い続編をスキップすることもできます。
この質問に対する多くのコメントは、問題の2つの見解を示しています。それは無意味であると考える理論的見解と、残念ながらそれほど簡単に定式化されていない工学的見解です。
解釈とコンパイルを見る方法はたくさんありますが、いくつかをスケッチしてみます。できる限り非公式になろうとする
トゥームストーン図
初期の形式化(1960年代初期から1990年後半)の1つは、Tまたは
Tombstone図です。これらの図は、構成可能なグラフィカル要素で、インタプリタまたはコンパイラの実装言語、解釈またはコンパイルされるソース言語、およびコンパイラの場合のターゲット言語を提示しました。より複雑なバージョンでは、属性を追加できます。これらのグラフィック表現は、公理、推論規則、カリー・ハワードのような公理からの存在の証明からプロセッサ生成を機械的に導出するために使用できる推論ルールとして見ることができます(60年代に行われたかはわかりませんが:)。
部分評価
別の興味深い見方は、部分評価のパラダイムです。私は、いくつかの入力データが与えられたときに答えを計算する一種の関数実装として、プログラムの単純な見方を取っています。次に、インタプリタ
言語のためのプログラム取るプログラムである
に書き込まれた及びデータ、そのプログラムのためのセマンティクスに従って結果を計算。部分的な評価は二つの引数のプログラムを専門とする技術であると、唯一の引数、と言う、知られています。目的は、最終的に2番目の引数を取得したときに、より高速な評価を得ることです。ISSpSSdSa1a2a1a2。場合は特に便利ですより頻繁に変更と部分評価の費用として唯一のすべての計算法で償却することができます変化しています。a2a1a1a2
これは、アルゴリズムの設計でよくある状況です(多くの場合、SE-CSに関する最初のコメントのトピック)。データのより静的な部分が前処理されるため、すべてのアプリケーションで前処理のコストを償却できます。入力データのより多くの可変部分を持つアルゴリズムの。
最初の引数は実行されるプログラムであり、通常は異なるデータを使用して何度も実行される(または異なるデータを使用してサブパートを複数回実行する)ため、これもインタープリターの状況です。したがって、最初の引数としてこのプログラムで部分的に評価することにより、特定のプログラムのより高速な評価のためにインタープリターを特化することは自然な考えになります。これは、プログラムをコンパイルする方法と見なされる場合があり、その最初の(プログラム)引数でのインタープリターの部分評価によるコンパイルに関する重要な研究作業があります。
Smn定理
部分評価アプローチの良い点は、特にKleeneのSmn定理において、理論に根ざしているということです(理論は嘘つきになりますが)
。ここでは、純粋な理論家を混乱させないことを期待して、直感的なプレゼンテーションをしようとしています。
ゲーデル数を考える再帰関数の、あなたが見ることができますゲーデル数を与えられたように、ハードウェアとして
(読み取りオブジェクトコードをプログラムの)で定義された関数である(すなわち上のオブジェクトコードによって計算しますハードウェア)。φφpφpp
最も単純な形式では、定理は次のようにウィキペディアに記載されています(表記法の小さな変更まで)。
ゲーデル数の所与再帰関数の、原始再帰関数が存在する次のプロパティを持つ2つの引数は:すべてのゲーデル数のための部分計算関数二つの引数、式ととは、自然数と同じ組み合わせに対して定義され、それらの値はそのような組み合わせに対して等しくなります。換言すれば、関数の次伸長平等は、すべてに対して成り立つ:
φσqfφσ(q,x)(y)f(x,y)xyxφσ(q,x)≃λy.φq(x,y).
今、撮影インタープリタとして、プログラムのソースコードとして、およびデータとしてそのプログラムのため、我々は書くことができる:
qISxpSydφσ(IS,pS)≃λd.φIS(pS,d).
φISは
、ハードウェア上でのインタープリター実行、つまり言語書かれたプログラムを解釈する準備が整ったブラックボックスとして見ることができます。ISS
機能インタプリタを専門関数として見られるかもしれないプログラムの部分評価のように、。したがって、ゲーデル数は、プログラムコンパイル済みバージョンであるオブジェクトコードが含まれています。σISPSσ(IS,pS)pS
したがって、関数は
、言語で記述されたプログラムソースコードを引数として取り、そのプログラムのオブジェクトコードバージョンを返す関数とことができます。。したがって、は通常コンパイラと呼ばれます。CS=λqS.σ((IS,qS)qSSCS
いくつかの結論
しかし、私が言ったように、「理論は嘘つきになりえます」、または実際には1つに思えます。問題は、関数について何も知らないことです。実際にはそのような関数が多くあり、定理の証明は非常に単純な定義を使用する可能性がありますが、エンジニアリングの観点からは、Raphaelによって提案されたソリューションよりも優れている可能性があります:ソースコードインタプリタと。これはいつでも実行できるため、コンパイルは常に可能です。Q S I SσqSIS
コンパイラとは何かというより制限的な概念を形式化するには、より微妙な理論的アプローチが必要になります。私はその方向で何が行われたのか分かりません。部分評価で行われる非常に現実的な作業は、エンジニアリングの観点からより現実的です。そしてもちろん、カリー・ハワード同型に基づいて型理論の文脈で開発された、仕様の証明からプログラムを抽出するなど、コンパイラを書くための他のテクニックがあります。
ここでの私の目的は、Raphaelの発言が「クレイジー」ではないことを示すことですが、物事が明白ではなく、単純でさえないことを正気に思い起こさせることです。何かが不可能であると言うことは、それが不可能である理由と理由を正確に理解するためだけに、正確な定義と証明を必要とする強力な声明です。しかし、そのような証拠を表現するために適切な形式化を構築することは非常に難しいかもしれません。
これは、特定の機能がコンパイル可能でない場合でも、エンジニアが理解している意味で、標準のコンパイル手法は、そのような機能を使用しないプログラムの部分に常に適用できることです。
Gillesの重要な発言をフォローするには、言語によっては、コンパイル時に実行されるものと実行時に実行される必要があるものがあるため、特定のコードが必要であるため、コンパイルの概念は実際にあることがわかります。不明確であり、おそらく満足のいく方法で定義できない。コンパイルは最適化プロセスにすぎません。一部のアルゴリズムで静的データの前処理と比較したときに、部分評価のセクションで示しました。
複雑な最適化プロセスとして、コンパイルの概念は実際には連続体に属します。言語またはプログラムの特性に応じて、一部の情報が静的に利用でき、最適化が改善される場合があります。その他のものは、実行時に延期する必要があります。物事が本当に悪くなったときは、少なくともプログラムの一部について実行時にすべてを実行する必要があります。ソースコードをインタープリターにバンドルするだけで十分です。したがって、このバンドルは、このコンパイルの連続体のローエンドにすぎません。コンパイラに関する研究の多くは、以前は動的に行われていたことを静的に行う方法を見つけることに関するものです。コンパイル時のガベージコレクションは良い例のようです。
コンパイルプロセスでマシンコードを生成する必要があると言っても意味がないことに注意してください。インタープリターはマシンコードであるため、これがまさにバンドルです。