完全水文系列之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 @   winter-cn  阅读(3873)  评论(24编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示