あなたは2つの異なることについて尋ねていると思います。
- すべてのプログラムをデータとして表現するプログラミング言語の能力。
- データとしてのプログラムについての推論。
分析のためには、それらを区別しておくと便利です。前者に焦点を当てます。
データがメタプログラミングや
ホモイコニシティなどの条件の下でプログラムを表現、操作(および実行)するプログラミング言語の能力。
(厄介な)方法で、すべての有名なプログラミング言語はメタプログラミングを行うことができます。つまり、文字列に対して外部プログラム(コンパイラ、リンカなど)を呼び出す機能と共に文字列データ型を使用します。システム最初)。しかし、それはおそらくあなたが言っていることではありません。おそらく素晴らしい構文を心がけています。ほとんどすべての文字列がプログラムを表すわけではないため、文字列はプログラム表現の優れた構文ではありません。つまり、文字列データ型にはプログラム表現メカニズムとして見たときに多くの「ジャンク」が含まれます。さらに悪いことに、文字列演算の代数は、プログラム構築の代数とは本質的に関係がありません。
おそらくあなたが念頭に置いているのは、もっと素晴らしいものです。例えば、もし、その後、プログラムされ ⟨ P ⟩であるPが、操作および分析のために手でデータとして。これはしばしば引用と呼ばれます。実際には、引用は柔軟性に欠けるため、代わりに準引用を使用します。これは、引用を「埋める」データを提供するプログラムを実行できる「穴」を持つ引用の一般化です。たとえば、⟨ IP⟨ P⟩P条件を表す準クォートの代わりに、我々は穴を有している状態である [ ⋅ ]。プログラムの場合は Mのデータに評価さ ⟨ のx > 0 ⟩、その後、準引用 ⟨ I F
⟨ I F[ ⋅ ]t h e n7e l s e8 + 9 ⟩
[ ⋅ ]M⟨ のx > 0 ⟩データに評価
⟨ I F⟨ I F[ M]t h e n7e l s e8 + 9 ⟩
⟨I Fバツ> 0th e n7Eのリットルs e8 + 9 ⟩ 。
(は引用されたプログラム、つまりデータとしてのプログラムを返す通常のプログラム(データとしてのプログラムではないことに注意してください。)これが機能するためには、プログラムを表すデータ型が必要です。通常、そのデータ型はAST(抽象構文ツリー)と呼ばれ、ASTの省略メカニズムとして(準)クォートを見ることができます。M
いくつかのプログラミング言語は、準プログラミングやメタプログラミングのためのその他の機能を提供します。このマクロ機能を備えたLispが、プログラムをデータとして扱うこの機能を開拓しました。おそらく残念なことに、Lispベースのマクロの力は、長い間Lispの最小限の構文に依存していると長い間見られていました。MetaML(1)になって初めて、構文が豊富な最新の言語がメタプログラミングができることが示されました。それ以来、MetaOCaml(2)(MetaMLの子孫、プログラムをデータとして入力する方法の問題を解決するための現在進行中の探求におけるブレークスルーにとって重要)、Template Haskell(3)およびConverge(4)(最初の言語私の意見では、すべての主要なメタプログラミング機能を入手してください)は、さまざまな最新のプログラミング言語がメタプログラミングを収容できることを示しています。私たちが取ることができることを認識することが重要です任意のプログラミング言語メタプログラミング言語にそれを回すと、L m個のP
であるLデータとして、自身のプログラムを表す(及び評価)の能力と一緒。LLm pL
データとして与えられた実行中のプログラムの結果を表現するには、(データとして与えられた)プログラムを入力として受け取り、それを実行して結果を返す関数を追加します。例えば、もしPは 17に評価プログラムであり、⟨ P ⟩の(準)引用バージョンP、すなわちP、データとして、E V L(⟨ P ⟩e v a l(⋅ )P⟨ P⟩PPも返し17ここで微妙なのすべての方法があります私はそのような疑問として、ここでは無視してることをするときE V L(⟨P⟩ )メタプログラムされたプログラムが評価されています(コンパイル時と実行時のメタプログラムの区別が生じます)、型の処理または評価の失敗、からPへの移行過程でバインドされた変数と解放された変数の処理⟨ P ⟩、またはその逆。P⟨ P⟩
二次元については、データとして与えられたプログラムについての推論。プログラムをデータに変換できるとすぐに、それらは「通常の」データであり、データと見なすことができます。Joshuaが指摘したように、依存型や契約、インタラクティブな定理証明、自動化ツールなど、あらゆる種類の証明技術を使用できます。ただし、推論プロセスで言語のセマンティクスを表現する必要があります。その言語が必要に応じてメタプログラミング機能を持っている場合、物事は少しトリッキーになる可能性があり、この方向ではあまり作業が行われていません。また、メタプログラミングに関する推論に関するカリー・ハワードに基づく研究もあります(6、7、8)。これらのロジックベースのアプローチ、また、タイプベースのアプローチ(2)は、将来のすべてのメタプログラミング段階で保持されるプロパティを実際に表現できます。(2)とは別に、これらの論文はいずれも実装されていません。
要約すると、あなたが求めたものは実装されましたが、それは非常に微妙であり、特に型と合理化された推論に関係する未解決の質問がまだあります。
Wタハ。多段プログラミング:その理論と応用。
W・タハとMFニールセン。環境分類子。
T.シアードとS.ペイトンジョーンズ。Haskellのテンプレートメタプログラミング。
L.トラット。動的に型指定されたオブジェクト指向言語でのコンパイル時メタプログラミング。
M. Berger、L。Tratt、同種メタプログラミングのプログラムロジック。
R. Davies、F。Pfenning、段階的計算のモード解析。
R.デイビス、結合時間分析への時相論理アプローチ。
塚田哲也、五十嵐明子。環境分類子の論理的基盤。