完全水文系列之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#设计师们在这条道路上止步。

 

后记:

所谓讨论有助于学习,前提是各方有足够的基础知识和背景,而且必须要大家都是抱着求解问题的想法去讨论。

如果一个人发表的完全浅尝辄止,似是而非的言论,还为“赢”而论,句句不让,那这讨论,不论也罢。

本文虽然是娱乐为主,不过里面卖弄的论据倒是无虚,

这篇水文权且为镜,只想让大家看清楚,不论多么荒谬的结论都可以被说的好似有理有据。

posted @ 2010-07-05 02:47 winter-cn 阅读(...) 评论(...) 编辑 收藏