如何理解計算機編程領域的反射?

如題,維基百科鏈接反射 (計算機科學)


關於反射(以及更高階形態的元編程),要強烈推薦的一篇論文是Gilad Bracha與David Ungar合作的:

Mirrors: Design Principles for Meta-level Facilities of Object-Oriented Programming Languages(打不開的話說明梯子要更新了~)

引用論文開頭的一段定義:

Reflective language architectures may be characterized in terms of their support for:

1. Introspection. The ability of a program to examine its own

structure.

2. Self-modification. The ability of a program to change its own

structure.

3. Execution of dynamically generated code. The ability to

execute program fragments that are not statically known. This

is a special case of 2.

4. Intercession. The ability to modify the semantics of the underlying programming language from within the language itself (the term intercession is sometimes used in a broader sense in parts of the literature, but we adopt the narrower definition of intercession given here, based on [18]).


簡單的說,就是提供某種機制,在運行時可以獲得一些對象和類型的結構信息。


簡單的說,就是運行時動態執行源代碼

比如一個用Java寫的程序,裡邊有一個文本框。你在裡邊輸入一段java程序文本,然後這段文本不但可以被執行,而且還可以改變你的程序的狀態。

當然這個文本不一定是文本框輸入,也可能是其他的方式,比如讀取設置,甚至於直接從其他庫文件里讀。

用途,主要基本都是用於做依賴注入(dependency injection)。

舉個例子——遊戲里,你寫了一個MOD,然後你不用改變主程序的源代碼,直接就可以使用這個MOD的功能。(當然MOD一般不是用反射寫的)

但大概是這個意思。


我的理解是在運行期間想辦法暴露一部分符號表給你用,具體想搞什麼就看語言本身提供的機制和你自己的黑魔法了。

搞一個lisp解釋器出來差不多就能理解那種把符號表在運行期暴露的感覺了,總覺得操作起來不太安全,但是......好爽。


反射為語言添加了「自解」的能力。


一個兒子想知道他爹的屬性和方法?


就是對代碼本身進行分析,沒想像的那麼複雜,大多數情況下意義不大,除非做框架等。

比如,對一個類,查詢他的所有方法,還可以調用。


Redirect To: 為什麼語言里要提供「反射」功能? - 編程


我覺得,如果理解成符號表就錯了,因為反射最終操作的也是代碼指令,你看到可以知道函數名成員變數名就以為是符號表,肯定不是這樣,在objective-c里的反射機制,每個類里有一個類原型的變數,該變數有兩個個類似的map的結構保存名字和調用地址的映射(你實例化類對象,這個地址肯定不一樣,這應該是對象相關的),這是編譯器往它裡邊生成的。。

不知道其它語言如何,但我認為不會是暴露符號表,進程里有這串東西可不得了。。


推薦閱讀:

學C++是怎樣一種體驗?

TAG:編程語言 | 編程 |