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

2022-02-03 08:34:16 字數 1403 閱讀 3461

今天來談談

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#設計師們在這條道路上止步。

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

如果乙個人發表的完全淺嘗輒止,似是而非的言論,還為「贏」而論,句句不讓,

那這討論,不論也罷。

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

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

CSS回顧系列0之雜談

css不需要編譯,屬於瀏覽器解釋型語言,可以直接由瀏覽器執行。之前看的w3school教程入門css,這段時間我看了看doye的手冊,遇到不太理解的地方的話就去查閱一些資料並在codeopen上面做一些實踐,下面我來講講我認為一些比較重要的收穫。position 可以取值static absolut...

併發系列之 sleep 0

作業系統前置知識 在講兩者的區別前,先回顧一下作業系統的知識。作業系統中,cpu競爭有很多種策略 在時間片演算法中,所有的程序排成乙個佇列。作業系統按照他們的順序,給每個程序分配一段時間,即該程序允許執行的時間。如果在時間片結束時程序還在執行,則cpu將被剝奪並分配給另乙個程序。如果程序在時間片結束...

OpenGL ES系列之0 建立Xcode專案

為iphone建立乙個opengl es的xcode專案是很容易的事,特別是在蘋果公司的sdk發布時引入了模板的概念後。我們所需要做的只是在適當的地方快速而簡單的加入 這就是我們今天的主題。好,我們假定你肯能以前已經在哪看過這個模板或執行過用這個模板建立的專案。我們說要做的就是移除那個旋轉的彩色正方...