语言的缺陷

3、深入探讨C语言的陷阱与缺陷 本文深入探讨了C语言中常见的陷阱与缺陷,包括赋值与比较的混淆、表达式的副作用、指针与数组的边界问题等常见编程错误,并结合历史上的重大错误案例分析了未定义行为的风险。文章还提供了实用的启发式方法、代码审查流程以及使用编译器警告和静态分析工具的技巧,帮助程序员规避这些陷阱,提高代码质量和健壮性。 阅读详情

前几天在《好的服务器系统》一文后讨论的时候,edguo兄建议我开一个关于DELPHI问题的话题来讨论一下,正好最近关于C的死活问题在圈子里讨论得很热闹,我也八了一篇《不值一驳》掺和了一把。现在正好抽空把两个话题整一块,就语言的问题来说一说吧。

其实早在两年前,我就曾经就语言的问题发过几篇文章《强大的DELPHI RTTI--兼谈需要了解多种开发语言》、《语言的特性如何取舍》、《有必要把什么都加到语言里吗?--谈谈 G# 和 Cω》(BTW:在后面的评论中发现,居然edguo和haitao居然是老相识啊^O^)。其实到目前为止,我的观点依然没有什么改变,我仍然认为:

没有什么语言是万能的,也不应该试图要求某种语言是万能的——这就像我曾经说过的:能包治百病的药~~~~~~~~都是假药

就Delphi 语言而言,我认为在它的定位上基本是没有什么太大的缺陷的。从Pascal到Object Pascal再到Delphi,我们不得不承认Anders是个天才,他将原生开发语言所能做到的事情几乎已经做到极致,需要再增加功能的话,改换到VM 基本上已经是必须的了。所以Anders另起炉灶打造了一个C#——代价正是放弃原生,改用VM,但这已经是另外一回事了。即使是到了现在,在原生开发领 域,Delphi仍然是最强的语言之一,特别是在动态性方面是最强的(C++虽然也有Meta,但是那个只是编译期,局限性还是很大的)。

然而事实上,Delphi还是没落了,不过这只是因为Delphi这个开发工具,而不是Delphi这种语言。

Delphi 的失败就在于它试图成为一种万能的开发工具,而它曾经的主要市场现在已经是VM语言的天下——它们的确更加适合。而Delphi的错误就在于花了太多的力 量在这个并不是很合适的领域里与它们竞争,反而失去了自己所最擅长的领域——原生应用开发。我曾经也以为用Delphi可以做出好的Web应用——事实上 也的确可以,但实在没有必要,因为有更多更好的选择。所以我现在认为,Delphi最重要的还是如何保证自己的核心功能,这也是为什么我对Turbo Delphi还报有希望的原因。

C的情况刚好相反,它只专注于自己的核心功能,从不试图去做更多的事情。

在这一阵的争论中,我只看到云风的《C 语言已死?》和孟岩的《Java替代C语言的可能性》比较有见地。

今天的C,正如云风所说,是历史的选择。然而历史为什么会选择C呢?不正是因为这几十年来没有什么其它的语言能够在C的领域里竞争出头嘛。云风认为:C 在静态语言中没有太大的竞争者其实也是 C 的悲哀

这 一点我不太同意。我不相信在C诞生后的这三十多年里没有人尝试过去创造一些更好的选择,只是它们都失败了。包括Pascal的失败也就在于它太啰嗦了,这 对于早期的硬件来说,实现编译器的代价要高于C——C的include就是当年的硬件限制留下的遗迹。还有云风举例的Ada语言,作为美国军方的指定语 言,当然是不差的,但所需的代价比C要高可能也是它没有能够成为像C这样的通用语言的原因之一。在同时代的同类语言中,C不是最好的,但至少曾经是最合适 的,再加上机会(如令狐所认为的那样,因为UNIX是用C写的,而UNIX成为了流行的OS),所以才有了今天的C。

(关于C的话题,令狐与云风通过MAIL作过一番讨论,后来令狐把那两封MAIL转发给我了,下面将会引用到这些邮件中讨论到的内容)

其实C的胜出还有一点很重要:因为用到C最多的情况就是做接近硬件的底层开发,不论是开发OS、驱动还是编写VM。而正如令狐在MAIL中提出来观点: C的语言最接近这三十年来真实的硬件模型。我同意令狐的这个看法,我认为C从诞生伊始,目标就不是要成为一种万能语言,而只是要做一个中级语言。(对C--不了解,我不知道它会不会是更好的选择,但我相信时间会对此进行考验的)

正因为C是一个中级语言,其目标是要接近底层,就意味着有些“缺陷”其实不能被认为是缺陷。云风在MAIL中指出,C用堆栈来记录局部变量的内存模 型存在不可遍历的问题,使得GC无法实现。不过我认为,以C的定位来说,内存变量遍历并不是必须的功能,为了这个功能而损失掉它与硬件的简单对应,反而损 害了自己的核心价值。虽然GC是个好东东,但对于C来说,这也不是必须的。当然也许C++可以考虑——正如C++/CLI所做的那样。

尾调用的情况也差不多,在C里可以很简单地用嵌入汇编实现的功能,没有必要加到C语言里去,这会破坏C语言本身的结构。

当 然,硬件体系是在不断变化的,但直到最近,多核被引入到桌面硬件平台之后,才算是有了一些接近本质的变化。在这个方面上,也许C的确需要一些改变(比如可 能诞生一种“并发C”语言,关于这一点,我将另文讨论),但是我仍然认为这种改变依然必须保持C与硬件的简单对应关系(比如不应该用一些隐含的手段去实现 并发),并且比起更高级的语言来说,要能够为程序员提供更多的优化可能性——即使付出的代价是可能因此丧失易用性。

其实Herb Sutter在《免费午餐已经结束——软件历史性地向并发靠拢》一文中已经说得很明白了,多核时代意味着四点问题,其中第三点就是效率优化。因为单个CPU内核的性能发展已经到顶了,所以对于应用中不可并发的部分,效率优化就显得尤为重要,在这样的情况下,C的优势是别的语言难以比拟的。

归根到底,C就是现在实际上的portable assembly language的最佳选择。

所 以我认为孟岩的说法是不恰当的,Java是不可能替代C的。现在的情况只是有一部分以前用C写的应用,因为那时除了C没有更好的选择,也许现在或以后用 Java实现会更好。但这绝不意味着它可能完全替代C,因为谁也不知道一个在Java里创建的对象在物理上是在什么鬼地方。

还有一点很关键的就是如大师所说过的:语言磨砺了我们思维的方式,也决定了我们思考的范围。Java的开发者所习惯的风格与C的开发者所习惯的风格是完全不同的,很多用C开发的应用并不适合用Java的思考方式。正如不懂中文的人是不可能讲好相声的。

但同样的,在多核的并发时代,我们需要一些能够让我们习惯并发思维的语言。(对于这一点的展开我将另文讨论)

最后说说VM语言。

我 一直不喜欢VM语言,不论是JAVA还是C#。当然最重要的原因是我所在的开发领域里,它们并不是最好的选择——做简单的桌面应用,我更喜欢用Turbo C++ Explorer;做更简单的非GUI应用,那当然是首选Python;还有Web应用,那也是Python(TurboGears or Django);至于所谓的“高级”应用,我有ABAP……

但是VM语言的长处是显而易见的,在某些领域里还是大有可为。

我只是看不惯某些VM语言的菜鸟总是把自己所从事的开发领域看作是“主流”,总以为自己用的语言是“万能”的,要P颠P颠地跑到别人的地盘上撒点野,那就活该他们要在我这里碰得灰头土脸。

事实上,每一种语言都有它自己的设计目标,每一种流行语言的设计者都比我们这些用户不知道要高明多少倍。

其实原生语言、VM语言、动态语言……各有各的用处,最关键的是要懂得在什么情况下用什么语言。要知道现在还有很多古董级的Fortran、Cobol语言的应用没有被取代。




VC程序与Delphi程序之比较 delphi中默认的函数调用约定为register,即前三个参数可以放入相应的寄存器中,其他的也是推入到堆栈中,这样效率更高,参数传入顺序也是从右到左的,例程自己负责对参数的清栈(但帮助手册上说是从左到右的,我通过汇编查看发现是从右到左的) 而对于vc中默认的函数调用约定为__cdecl,它所有参数是从右到左推入到堆栈中的,调用者负责对参数的清栈。ebp+0Ch这个地址是关键,它代表就是调用函数传入进来b参数的值,为什么要+0c呢,其实很简单,上层函数的堆栈地址肯定比内层函数的地址要高。 阅读详情

相关推荐

c语言 delphi,delphi和c语言的比较 极其粗浅 菜鸟共勉

(1) 指针 c语言定义指针 *赋值 *=或者=&delphi type =^赋值:=@(2) if语句delphiif条件 then 执行语句或者:if条件 then else c语言if(判断语句);else;(3)复合语句delphidelphi的一个复合语句要用begin和end,开始一个复合语句要用begin,结束要用end;c语言不用声明,直...

weixin_31308407的博客 693

Delphi为什么都不用了?公司CTO不向老板推荐使用Delphi的13 个真实原因

多年来,我听到了很多人们不使用 Delphi 的原因或借口。我在这里收集了13 个最好的理由。 1. 想要编写更多代码——Delphi 需要更少的代码来完成相同的任务。如果你想写更多的代码,不要使用Delphi。如果编写更多代码会给您带来更多成就感,或者您根据编写的代码行数获得报酬,则尤其有用。 2. 更大的开发团队——谁不喜欢有很多同事?如果您使用其他工具和框架,那么您将需要更多的开发人员、更多的开发人员工具、更多的框架和更多的团队来支持所有平台。打造更好的办公室派对。不幸的是,当您使

Delphi开发局QQ群:32422310 1万+

DELPHI与C#语法比较

1、我做了三年的.NET,也是三个月前因为项目需要转的delphi 整个过渡差不多要一周到两周。 正常情况两周后就能熟悉delphidelphi可以调整开发环境的,你把他的属性和解决方案窗口调成和你用VS一样的用起来就习惯多了。 语法的话pascal和C#都是能拉控件的,做起来都是一个模式,非常类似。 即便是自己写组件,个人感觉delphi写起来更简单些。 如果是做数据库软件的话,delphi用起来就相当方便,和数据库连接代码几乎不用写的。 如果是用delphi做工控或网络编程也差不多。 delphi.

fangyuan621的专栏 3057

C语言陷阱和缺陷

原著:Andrew Koenig - AT&T Bell Laboratories Murray Hill, New Jersey 07094翻译:lover_P修订:CQBOY来自:http://blog.csdn.net/loverp/archive/2004/08/16/75725.aspx[修订说明]    改正了文中的大部分错别字和格式错误,并对一些句子依照中文的习惯进行了改写。[译序]

milan25429688的专栏 2万+

C语言陷阱与缺陷

C语言陷阱和缺陷[1]       [译序] 那些自认为已经“学完”C语言的人,请你们仔细读阅读这篇文章吧。路还长,很多东西要学。我也是…… [概述] C语言像一把雕刻刀,锋利,并且在技师手中非常有用。和任何锋利的工具一样,C会伤到那些不能掌握它的人。本文介绍C语言伤害粗心的人的方法,以及如何避免伤害。 [内容] 0 简介1 词法缺陷

352

C语言的几种缺陷及其规避方法

异常处理机制:C语言中没有自带的异常处理机制,但是可以通过设置错误码来表示异常情况,极其简单,也可以在C语言中使用一些异常处理库如setjmp.h、siglongjmp.h等来实现类似的机制。总之,虽然C语言是一种高效的编程语言,在工业界和学术界都得到了广泛的应用,但其存在的这些缺点也限制了其进一步的发展,使得在现代编程环境下,需要我们更加注意这些缺点,并采取相应的预防措施。容易出现内存管理问题:C语言中,程序员需要手动管理内存,包括内存的分配和释放,容易出现内存泄漏、越界等问题。

嵌入式之斋 1860

C语言陷阱和缺陷[1]

C语言陷阱和缺陷[1]原著:Andrew Koenig - AT&T Bell Laboratories Murray Hill, New Jersey 07094原文:收藏翻译:lover_P出处:本站[译序]    那些自认为已经“学完”C语言的人,请你们仔细读阅读这篇文章吧。路还长,很多东西要学。我也是……[概述]    C语言像一把雕刻刀,锋利,并且在技师手中非

myali88的专栏 1183

C语言缺陷与陷阱(笔记)

 C语言缺陷与陷阱(笔记)C语言像一把雕刻刀,锋利,并且在技师手中非常有用。和任何锋利的工具一样,C会伤到那些不能掌握它的人。本文介绍C语言伤害粗心的人的方法,以及如何避免伤害。第一部分研究了当程序被划分为记号时会发生的问题。第二部分继续研究了当程序的记号被编译器组合为声明、表达式和语句时会出现的问题。第三部分研究了由多个部分组成、分别编译并绑定到一起的C程序。第四部分处理了概念上的误

云,风扬起的地方 2776

C语言缺陷与陷阱

 C语言缺陷与陷阱[修订说明]    改正了文中的大部分错别字和格式错误,并对一些句子依照中文的习惯进行了改写。[译序]           那些自认为已经“学完”C语言的人,请你们仔细读阅读这篇文章吧。路还长,很多东西要学。我也是……[概述]    C语言像一把雕刻刀,锋利,并且在技师手中非常有用。和任何锋利的工具一样,C会伤到那些不能掌握它的人。本文介绍C语言伤害粗心的

张尹CSDN专栏 763

C语言三剑客之《C陷阱与缺陷》一书精华提炼

1、C陷阱与缺陷概述C语言像一把雕刻刀,锋利,并且在技师手中非常有用。和任何锋利的工具一样,C会伤到那些不能掌握它的人。本文介绍C语言伤害粗心的人的方法,以及如何避免伤害。第一部分研究了...

karaxiaoyu的专栏 634

C语言字符串缺陷

关于C语言字符串缺陷C++解决方案都在这。

2301_81280642的博客 1120

C 语言陷进与缺陷

原著:Andrew Koenig - AT&T Bell Laboratories Murray Hill, New Jersey 07094 翻译:lover_P 修订:CQBOY 来自:http://blog.csdn.net/loverp/archive/2004/0

攻城狮 692

C语言:陷阱和缺陷

原著:Andrew Koenig - AT&T Bell Laboratories Murray Hill, New Jersey 07094翻译:lover_P0 简介    C语言及其典型实现被设计为能被专家们容易地使用。这门语言简洁并附有表达力。但有一些限制可以保护那些浮躁的人。一个浮躁的人可以从这些条款中获得一些帮助。    在本文中,我们将会看一看这些未可知的益处。这是由于它的未可知,我

FreeXploiT 1550
上一篇: 选择的自由
下一篇: 不值一驳
itkbase
博客等级 码龄19年 112粉丝 4647原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值