2016-11-12 9 views
0

多くの言語には、イントロスペクションとリフレクションがあります。 しかし、いくつかは他のものより明らかに優れています。 この点でどの言語が「より良い」ものであるか、またその理由は何か。最高のイントロスペクション機能とリフレクション機能を備えたプログラミング言語はどれですか?

+1

[これは良い質問ではありません](http://stackoverflow.com/help/dont-ask)「より良い」という言葉を建設的に定義する方法はなく、実際の問題を解決することはできません。なぜなら、イントロスペクションとリフレクションでどれほど優れているかに基づいてタスクのプログラミング言語を選択しないからです。 –

+0

@ JeroenMostert:「反射が実際に提供することができる、潜在的に無限のプロパティセットの数」として、よりよく定義できます。これは、コードについて任意の質問をすることが目標であれば、便利な定義です。私の答えを見てください。 –

答えて

1

反射は基本的にソースプログラムのプロパティを抽出する機能です。 任意のプロパティ(例えば、任意のすべて)のソースコードを検査するには、検査可能なソースコードまたは少なくとも一部のソースコードが必要です。

実行時反映を許可する言語には、多くのプロパティのうちのどれを検査できるかがあらかじめ決められています。その数と結果の詳細は言語設計者によって決定されています。ランタイムスペースとリフレクションの時間がかかるため、ソースコード全体を保持する意思がないため、実質的にすべての言語で(言語に固有の)反映/検査の制限があります。したがって、言語設計者が有用と考えるもの、比較的簡単に計算してコンパクトに格納できるものを反映しています。これらの制限は、コンパイルされた言語では特に強く、その目的は実行とリソース(通訳者とは対照的に)で効率的であることです。

したがって、一般的にコメントや特定の変数が保持する可能性のある値の範囲に関する情報を反映して取得することはできません。

非常に多くの反射能力を提供する言語の1つがLISPです。これは、LISPプログラムのソーステキストが、LISPリストと同型であることを意識しているためです。これは、少なくとも解釈されたときにLISPがどのようにプログラムコードを格納するかです。 LISPはそのようなリストすべてに直接アクセスできるため、LISPプログラムは自分のコードを直接検査することができます。 [多くのLISPでコンパイルが可能です。これらは、検査可能なものに関する制限に関して、他のすべてのコンパイルされた言語と同じ制限を有する]。

したがって、言語のイントロスペクト/リフレクションの能力は、実際には制限されます。

ソーステキストの任意のプロパティに完全にアクセスするには、以外の言語をの外に設定する必要があります。その結果、完全なソースコードを実際に検査することができます。

Program transformation systems (PTS)は、これに最も近いツールです。 PTSは一般に、ソースコードを直接反映したabstract syntax treesにソースコードを解析し、同等のスタンドインとして機能することができます。より良いものは、実際には空白に関するコメントと情報を保持します。 PTSを使用して、カスタム、任意のアルゴリズムを記述して、ASTを乗り越え、これらのASTから任意の情報を抽出することができます。

PTSを使用した場合の非常に優れた副作用の1つは、コードを検査した後、PTSがコードを変換したり、つまり、問題や機会を分析し、結果としてプログラムを強化します。

多分、夢の言語は、それに完全なPTSが組み込まれている言語でしょう。 (私の会社のDMS製品であるPTSは、このプロパティを持つ小さなDSLセットであり、DMSを使用して検査/変換し、永続的に拡張します)通常、DMSは他の言語の検査/変換を行います。

関連する問題