質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1492閲覧

リフレクションとは何ですか?

rocket

総合スコア41

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/09/12 16:45

リフレクション、、

C++にはRTTIがあって、プログラムの実行中にこのRTTIから取得した情報を使って何かの処理をするという。

同様にC#ですと、メタ情報があって、例えばテキストデータからクラスのインスタンスを生成するという事が出来るらしいですが、この際にメタ情報を読んでくる、
このメタ情報を参照する事がリフレクションという事でしょうか?

(ちなみに、RTTIはメタ情報という事で合っているのか合っていないのかご指摘いただきたいです。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こんにちは。

基本的に関数名や変数名、変数の型などは、プログラムの実行には不要な情報です。アセンブラやC/C++などでは、実行時にはこれらの情報は原則として全て削ぎ落とされています。従って、プログラムの実行中に、関数名や変数名、変数の型を参照することは原則としてできません。

なぜなら、型情報は当該変数を操作するマシン語へ変換してしまえば、後は不要です。また関数名や変数名は遅くとも実行直前までにメモリ・アドレスへ変換されます。実行のためにはアドレスが確定していれば十分ですし、その方が高速ですので。
このようなプログラムを実行するためには不要だけどプログラムを記述する際に使う情報を「メタ情報」と呼ぶことが多いようです。

C++はRTTIの仕組みにより、このメタ情報のごく一部(型名や型の識別ID)を読み出すことができます。
(クラスのメンバ・リストやenum型のシンボル・リスト等を得ることはできません。)
この機能を「リフレクション」と呼ぶには抵抗を感じます。また、そのように表現している記述を見たことはないです。

このメタ情報を参照する事がリフレクションという事でしょうか?

参照だけに限定した機能を「リフレクション」と表現する記述は見たことはないです。
C#等のリフレクションはかなり強力で、ほとんどのメタ情報を読み出すこと、更に修正すること、当該方のインスタンスを生成することなど、大抵のことが可能です。(ただし、遅い、可読性が低い、せっかくの静的型付けがまるっと無駄になるので、リフレクションを使う必要がない時は使うべきでありません。)

(ちなみに、RTTIはメタ情報という事で合っているのか合っていないのかご指摘いただきたいです。)

RTTIはメタ情報の一部を参照できる仕組みですので、合っていると思います。

投稿2018/09/13 04:27

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rocket

2018/09/13 15:41 編集

まず、他の回答者さんも言われている通り、C++はリフレクションをサポートしていないということですね。 なので、RTTIのようなメタ情報に当たる部分があってそれを読み出せるだけの機能ではないようですね。 確かにそうですね、それだったら「メタ情報を読み出す」程度の表現でわざわざリフレクションという名前がつけられることもなさそうで...。 「メタ情報を使って何をやるか、何かができるようになってる」という事がリフレクションをサポートしてるかどうかの違いなら、リフレクションとして用意された機能を調べて行けばわかりそうな感じがしてきました。 そういうことでしょうか。
Chironian

2018/09/14 02:43

そういうことと思います。 リフレクションもプログラミング言語機能の1つですから、実際に使ってみるのが理解する早道と思いますよ。
rocket

2018/09/14 03:16 編集

ありがとうございます。輪郭が見えたというか、調べる方向性を絞れたと思います。
guest

0

リフレクションとは何ですか?

プログラムを実行する過程において、そのプログラム自身(≒元のソースコード)の構造を参照できる機能です。

特にコンパイル型プログラミング言語の場合、コンパイル時とプログラム実行時を区別して、静的リフレクション(static reflection)、動的リフレクション(dynamic reflection)と呼ばれます。

同様にC#ですと、メタ情報があって、例えばテキストデータからクラスのインスタンスを生成するという事が出来るらしいですが、この際にメタ情報を読んでくる、
このメタ情報を参照する事がリフレクションという事でしょうか?

その理解で問題ないと思います。C#言語は、リフレクションをサポートしています。挙げられている "テキスト情報からのクラスインスタンス作成" は、動的リフレクションによって実現されます。

C++にはRTTIがあって、プログラムの実行中にこのRTTIから取得した情報を使って何かの処理をするという。
(ちなみに、RTTIはメタ情報という事で合っているのか合っていないのかご指摘いただきたいです。)

C++言語のRTTI(RunTime Type Identification)は型の「名前」を読み取れるだけです(※)。非常に限定された動的リフレクションとも解釈できますが、一般にはC++はリフレクションをサポートしない言語と言われます。

※: 厳密にはRTTIで読み取れる型名も単なるヒント情報にすぎず、実用上は「型情報の比較」ができるだけです。

投稿2018/09/13 03:02

編集2018/09/13 03:10
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rocket

2018/09/13 15:41

リフレクションにもコンパイル時と実行時に機能するものに分けられるという。 これは重い処理ということなのでコンパイル時に計算しておきたいですね。 C#に関しては合ってても、C++はやっぱり違うんですね。メタ情報を読みこめるだけではリフレクションとは言えないという所で。
guest

0

投稿2018/09/12 19:22

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rocket

2018/09/13 15:42

(`・ω・´)あざますっ!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問