為什麼微軟的編程語言C# F#的編譯器要那麼多黑科技?
我說的黑科技的意思是,為了實現某些功能,編譯器對某些類庫有了特殊的行為。而不是擴展語言的功能來實現類庫。比如C#的 Nullable&
,即使你可以看到Nullable& 的代碼,你永遠實現不了Nullable& 的功能
。
int? x = 1;
x = null;//編譯器對這句話做了特殊處理
//你自己寫的struct不能被設置成null
//如果是class,那就x真的變成null了
//因為C#沒有 void operator=(null_t);
還有就是F#的printf實現,根據format字元串推導出後續參數的類型竟然的編譯器做的。
關於以上兩點,我看了很長時間的Nullable和printf代碼,完全看不出來是編譯器做了特殊處理。好歹代碼里寫一下
[CompilerIntrinsic]
void internalImplement()
{
[native code]
}
那我還能理解,要實現這個功能是要編譯器的支持的,我是寫不出這樣的功能的。
-----------------------再來說一個F#的
let inline test (x: ^a when ^a:(static member DivideByInt: ^a * int -&> ^a)) = x
F#在編譯器裡面寫死了認為float和decimal有DivideByInt靜態成員函數,其實沒有。但是,關於這一點無論文檔還是Specification都沒有提及。
我說的黑科技的意思是,為了實現某些功能,編譯器對某些類庫有了特殊的行為。而不是擴展語言的功能來實現類庫。比如C#的 Nullable&
,即使你可以看到Nullable& 的代碼,你永遠實現不了Nullable& 的功能 。
我只能這麼說,全世界只有C++是嚴格遵守這個理念的(所以必須要把它做得這麼複雜,才能讓編譯器一點黑科技都不需要),其它語言為了不讓自己的語法變得太複雜,乾脆就hardcode點什麼東西到語法裡面讓編譯器去搞。其實也沒啥不好的。
nullable的編譯器處理模式,在C#規範裡面有明確的說明。
參見C#規範6.1.5節:
事實上關於nullable類型在編譯器裡面還有一大堆的特殊處理模式。我想你的意思是為什麼C#要定義這麼多規範,而不是把這些邏輯交給用戶自己來實現,因為C#是一種工程性的語言,其設計出來就是讓程序員直接用來寫大型軟體的,而不是創造模式出來再用的。所以C#有大量的規範要求編譯器的行為。6.1.5 null 文本轉換
從 null 文本到任何可以為 null 的類型存在隱式轉換。這種轉換產生可以為 null 的給定類型的 null 值(第 4.1.10 節)。
C#沒有 void operator=(null_t);
但是C#里有實現隱藏變換 implicit,沒有null類型,但是不判斷null類型,直接判斷是不是null,這也是可以做到的。
=======================================================能靜態分析就靜態分析,這不叫黑科技,而是叫編譯器的優化。你聲明一個 a = 1*2,難道每次調用 a 都做一次乘法嗎?
我的理解是1. Nullable&
1. Nullabe&
Boxing and unboxing:
Lifted operators and EqualitySummary:
推薦閱讀:
※微軟蘇州Bing可以接觸要哪些技術?編程語言是不是以C#為主,可以自己選擇嗎?
※HTML5 是一門編程語言嗎?
※在IDLE上寫Python, low嗎?
※怎樣在bison里構造一組語法產生式,使得C語言的結構體聲明變數時不用加上struct關鍵字?
TAG:微軟Microsoft | 編程語言 | NET | C# | VisualF# |