說說關於反射的那些事

2021-02-26
OOP

上班摸個魚, 說說關於反射的那些事。

對於Java 和.NET 的廣大民工(不包括我)來說,學習框架似乎就是在市場提供生產力的本命。
而現代框架中,都不能避免出現Attribute/Annotation 式的標注。

這種標注都會在「框架」層面以反射形式分析,以在實際以在確定的運行次序上觸法各個時間點上和條件上的勾子。

這種在VM/解釋器層面上解構語法然後組成IR 的方法,有沒有很像。。。Eval 和Goto?
我們大多不喜歡Eval ,因為它會出現性能問題,也令閱讀程式碼時加入一層腦內的堆積(heap)。

人類在閱讀時加入heap 是一項「有挑戰性」的工作。
A=2222;B=1111;C=A+B;Print("I have $"+C);
像這種簡單的狀態對大部分人來說是輕鬆的。因為在閱讀時,讀者都有一種在猜測寫作目的的自動回收器。
以上面這個例子來說,讀到Print 時就會把「A=2222;B=1111;C=A+B;」回收了。留下「I have $3333」這樣的句子。

雖然作用不盡相似,但Eval和Goto 都是令回收(很抱歉要用和GC 同一個動詞)不能執行的工具。
Attribute 也是,和eval 相似,我們要記下所有作者寫下的勾子定義。

Eval 是這種:
我收到一封信,可以被小貓撕碎了。
第1片寫著 A=
第2片寫著 1111
第3片寫著 C=A+B; Print("I have $"+C);
第4片寫著 2222; B=
按1,4,2,3 的次序排好再閱讀:

Attribute 是:
當我回到家時, 在袋裡找找有沒有名為home 的信封,
當我睡覺前,在袋裡找找有沒有名為sleep 的信封.
....
有的話就按指示做

「在袋裡找找」就是一個令理解時間複雜度提高的行為了。
而加速的方法就只有去學習自己或他人的行為方式:
例如:「信封只可能在袋的暗格A 和暗格C 之中。因為B格是放Breakfast 的。」
可是,要獲得這個信息就必需經過所謂的「學習」的過程了。而這種學習是亳無遷移價值的。
至少,學習者的底力提升甚微。

attribute 從自出生開始就是meta-data。meta-data 本是是一個不參與邏輯的信息,可是偏偏有人利用reflection 拿出來利用了。
reflection這個字也是很美妙:他是一個鏡像(順面在此建議別把CD / HDD 的copy 稱為鏡像, 直接叫成deep-copy 更好):只見其表,無限清晰,甚至能讓你比起日常更仔細地看清表像的細節,而無視內觀(相對於外觀)。

這種分攤緊密邏輯理解負荷,到閱讀記憶負荷的轉變,明顯地是佔用大量的中短期記憶。
而把本命的大部分建立在中短期記憶上,你們沒有覺得很「陰謀」嗎?
(不用開解我,我是從其他可以觀察到的從業員身上出發,我過得挺好的)