1. 程式人生 > >完全水文系列之0xFA:函式背後的臃腫設計哲學

完全水文系列之0xFA:函式背後的臃腫設計哲學

今天來談談C#語言中函式的設計問題——這是除了效能問題之外,C#語言設計哲學中另外一個嚴重的問題——不必要的臃腫。C#函式總共存在以下4類問題:

1. C#函式沒有抽象性函式並非程式的基本元素,並不反映程式的關鍵抽象。資料段儲存程式執行狀態,程式碼儲存執行指令?函式算什麼,壓棧幾個元素然後改變EAX暫存器的值麼? 

2. C#函式沒有通用性絕大多數程式沒有函式的設計需求,不會實現函式。

3. C#函式的實現效能比較低下 a.函式呼叫的背後是壓棧,然後由EAX返回值,棧的操作效率遠遠低於暫存器

 b.C#函式預設實現會儲存呼叫現場,反覆儲存和恢復現場將造成大量效能損耗(參見DOS

中斷設計)

4. C#函式沒有必要性——這一條是C#函式最大的問題,也是本文的重點

函式只是跳轉的一個變體。其完全可以用棧操作來實現。

將所謂常用的程式邏輯變成語言構造的一部分,是C#設計思想裡面又一個的嚴重錯誤(第一個嚴重錯誤是為了所謂的功能,而不管不問效能成本,在前文《根本不存在的文章》中對此有詳述)。


C#
中類似的例子還有:使用if else來代替條件跳轉,使用運算子來代替CPU指令——我就在這裡一併批評了,不再另外撰文了。

如果可以在C#語言中內建跳轉,內建表示式, 那麼要不要支援字串操作?

另外,在把這些常見的程式設計方法在語言中內建,會使得該程式設計方法失去實現上的靈活性、或者損傷效能(比如

C#函式就限定了必須用壓棧方式來儲存呼叫引數,這種限制使得程式失去了其實現上的靈活性)

使用程式庫來支援各種邏輯是程式語言的正道,將邏輯整合為語言的一部分來耍cool,最後的結果是這個語言越來越臃腫,越來越龐大。希望C#設計師們在這條道路上止步。

後記:

所謂討論有助於學習,前提是各方有足夠的基礎知識和背景,而且必須要大家都是抱著求解問題的想法去討論。

如果一個人發表的完全淺嘗輒止,似是而非的言論,還為“贏”而論,句句不讓,那這討論,不論也罷。

本文雖然是娛樂為主,不過裡面賣弄的論據倒是無虛,

這篇水文權且為鏡,只想讓大家看清楚,不論多麼荒謬的結論都可以被說的好似有理有據。