為什麼微軟的編程語言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節:

6.1.5 null 文本轉換

從 null 文本到任何可以為 null 的類型存在隱式轉換。這種轉換產生可以為 null 的給定類型的 null 值(第 4.1.10 節)。

事實上關於nullable類型在編譯器裡面還有一大堆的特殊處理模式。

我想你的意思是為什麼C#要定義這麼多規範,而不是把這些邏輯交給用戶自己來實現,因為C#是一種工程性的語言,其設計出來就是讓程序員直接用來寫大型軟體的,而不是創造模式出來再用的。所以C#有大量的規範要求編譯器的行為。


C#沒有 void operator=(null_t);

但是C#里有實現隱藏變換 implicit,沒有null類型,但是不判斷null類型,直接判斷是不是null,這也是可以做到的。

=======================================================

能靜態分析就靜態分析,這不叫黑科技,而是叫編譯器的優化。

你聲明一個 a = 1*2,難道每次調用 a 都做一次乘法嗎?


我的理解是

1. Nullable& 必須是一個struct, 如果是class, 大量的Nullable分配在堆上,對GC的壓力太大了。

2. 作為一個struct, 它本身要能被設為null, 只能通過編譯器作特殊處理了。


1. Nullabe& has a type constraint: T has to be a struct.

2. ? modifier is a syntatic sugar on commonly used structs -- int, long and etc. It even doesn"t support string. To use MyType?, you have to use Nullable&

3. For more details about nullable value type, I suggest you to read the book & , Chapter 4, saying nothing with nullable type.

Boxing and unboxing:

Lifted operators and Equality

Summary:


推薦閱讀:

微軟蘇州Bing可以接觸要哪些技術?編程語言是不是以C#為主,可以自己選擇嗎?
HTML5 是一門編程語言嗎?
在IDLE上寫Python, low嗎?
怎樣在bison里構造一組語法產生式,使得C語言的結構體聲明變數時不用加上struct關鍵字?

TAG:微軟Microsoft | 編程語言 | NET | C# | VisualF# |