`
444878909
  • 浏览: 641266 次
文章分类
社区版块
存档分类
最新评论

为什么仍还用C编码?

 
阅读更多
作者Andrew Binstock

概述:作者论述了C语言仍然屹立不倒,长久不衰的原因:过去C语言在性能和可移植上面有巨大优势,但随着时间的流逝其他语言(C++等)在性能和可移植上与C的差距越来越小.但为什么C还很火.作者认为是因为C语言的简洁性,使它在系统级别上仍然无可替代.但是对于应用程序开发还是选择其他语言较好,因为开发效率更重要.


正文:



偏好C而非C++的传统的理由正在慢慢的消逝.还有什么好的理由仍然使用C吗?


一个Dr Dobb's的长期读者最近问我一个问题:为什么人们还要用C去编码.这个主题最近出现在发布在我们网站上的一些评论中,更早些时候也出现在与一些特别是来自Microsoft的业界人物的对话中.在C++的早期时候,有很多理由根据需求来选择C还是C++;但是因为C++已经进化了,许多传统的有区别的C的特性已经变得不那么有优势了.因为这些优点当比较二种语言时总是首先出现,我们来审视一下:
1. 性能. C++过去总是比起C慢很多.但是在许多主流平台上,在今天这区别已经很小了.例如,Alioth上的计算机标准检查程序显示在32位Linux上C++运行一系列测试比C要慢27%.其他调查显示这种区别略高或略低.但是在大多数情况下,C++是除以外最快的语言.它通常要比JVM和.NET上的语言快多了.所以尽管C在标准测试上仍然有优势,在大多数应用都能接受Java的性能情况下(比如,任何企业级应用或者面向客户端的软件), 这种区别并不严重.
2.普遍性.在C仍然作为首选语言的嵌入式世界里,偏爱C是因为每一个硬件厂商都提供C语言编译器.过去C++在嵌入式世界里并不强势.然后今天大多数提供编程工具的组件厂商都会提供一个C++编译器.(PIC 微控制器总是一个例外).这是一个在退化的优势.
3. 可移植性.C++曾经很难移植(C89标准出现以前的C也一样难移植).然而今天的编译器已经足够地实现了C++语言核心保证软件可以在需要的情况下做很小的调整就能重新编译,前提是代码能够像Brian Kernighan曾经说的在语言的中间写.库的可移植性是一个更多麻烦的因素,但是C语言库也存在同样的问题.对C和C++二个语言,各种编译器对标准的支持程度差距非常大,所以使用没有完全支持的特性(C99,C11和C++11)风险是一样的.那就是说,C89可能是世界上最具移槙性的代码了.(也是基于这个原因,当移槙性是绝对顾虑时总是选择C语言.例如,Lua团队基于性能和这个原因而选择C).


凭心而论,对于性能,普遍性和可移植性C比C++有优势,但是这些优势正在渐渐的消逝.从这看,C++社区做的很好,通过它的使用者解决了曾经是采用的严重障碍.问题是:这些缩减的优势补偿了C++的好处了吗?包括面向对象,异常处理,更好的类型管理,模板,更加丰富的标准库等.没有了这些益处,C的每个项目都感觉像在用剪刀在修剪草坪.


那些特性确实可以帮你实现代码,但是它们是有复杂性代价的,这点上C跟C++还是有巨大的不同.C是少数几个小巧且足够简洁到可以整个怀抱下的编程语言之一.完全知道语言的来胧去脉以及对标准库了解到不用查看API手册就能用的很好是完全可能的.我相信这在其他语言中是不大可能的,起码确信在C++中不行.


这种小巧是语言的一个魅力.你可以快速的学习它也可以快速的达到卓有成效.别外一个少有提及的特性:最高的清晰度提升了这种简洁性.我的意思 是除了句法外的语义上的清晰度.从语义上讲,在C中仅有一些有限的方法做事.因此,当你阅读任何其他人的代码时,能确切的知道他们在做什么.对比在C++中,有太多不同的方法能达到同样的效果,这是程序所喜爱的灵活性.因为这个层面上的C的清晰性,对于实现复杂的架构来说C是卓越的语言.基于这个原因,JRockit JVM(现在是Oracle的首要JVM)的原作者选择了C.几年前的一次对话中,他们阐述了选择了C而非C++的观点,他们可以让开者更快速的上手.并且当深入代码之中时,他们可以比在C++更容易理解他们看到的代码.


单就这个原因,在系统级别代码中C仍然是非常棒的选择:速度快,可移植,易读易理解.然而对于重点多在开发效率的应用程序,显然C++会继续统治着本地语言并且很可能会扩张它的足迹.

原文:Why Code in C Anymore?


原文下的评论也很有意思比如第一条JSawyer说到:他理解不了为什么TIOBE把C列为第二受欢迎的语言.是不是因为Google搜索时把++和#字符去掉了所以统计显示人们搜索的是"C Programming"?
分享到:
评论

相关推荐

    信息论与编码复习总结.rar

    信息论与编码复习总结.rar信息论与编码复习总结.rar信息论与编码复习总结.rar信息论与编码复习总结.rar信息论与编码复习总结.rar信息论与编码复习总结.rar信息论与编码复习总结.rar信息论与编码复习总结.rar信息论与...

    基于apFFT的罗兰-C信号相位编码识别 (2011年)

    结果表明,apFFT方法既能像 FFT一样分析出 干扰频率成分,又能识别出各频率成分的初相位,尤其信干比在-20 dB情况下仍可准确地识别出罗兰-C载波信号初相位,为增强型罗兰接收机的设计提供了一种新的相位编码识别方法.

    上海电机学院C语言实训答案

    实训是在学生已经具备了使用C语言编写简单的应用程序的能力,为使学生对C语言有更全面的理解,进一步提高运用C语言编程解决实际问题的能力,通过提出算法、指定输入输出来设计一个解决方案。并为参加计算机等级考试...

    强载波干扰条件下的罗兰-C相位编码识别研究 (2012年)

    针对强载波干扰能够淹没罗兰-C信号,甚至严重影响罗兰-C接收...结果表明,apFFT谱分析方法既能识别出罗兰-C载波信号的初相位,又能分析出干扰频率及其强度,尤其信干比(SIR)在-40dB情况下仍可准确地识别出相位编码。

    c语言编写单片机技巧

    答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其...

    文件合并程序(C语言)

    今日,穷本人目前之C所学作此【文件合并器】(VC下调试成功),主要功能:将一个目录下的ANSI编码和UNICODE编码格式的文件以及其中内容拷贝到一个文件里。功能基本稳定,代码部分仍待优化。忘各位不吝赐教~~

    Csec:基于Cert网站上C安全编码页面的一系列POC

    由于我对C语言的了解还很差,所以我想一种更好的方法是随着时间的推移遍历所有这些规则,进行下载和编译。在线示例-并了解C受其影响的问题。 第一步将是简单地阅读问题,下载并编译代码。 一旦了解了问题,下一步...

    编码多源数据集(预处理后的多源数据集)

    文件为多源数据集的编码形式,即预处理之后的数据 用于我的另一资源:基于多种机器学习算法的分类预测研究 该资源为机器学习结课论文,本文在对Lending Club数据集进行初步数据分析的基础上,通过选取4组不同的特征...

    高压技术 检仍

    高压技术手册,供查删除 yhfu1018 开通了自己的个人主页 9秒前 屏蔽 shanhuijava 发表了帖子:SWT... C语言 函数名: abs 功 能: 求整数的绝对值 头文件:math.h 用 法: 屏蔽 JINQIU998 开通了自己的个人主页 14秒前

    kvazaar:开源HEVC编码器

    Linux / Mac 视窗目录 视觉工作室码头工人可视化(仅Windows) 纸为Kvazaar贡献代码文件对于版本控制,我们尝试遵循以下约定: 测验单元测试代码风格 使用Kvazaar 例子: kvazaar --input BQMall_832x480_60.yuv --...

    Competitive_Coding:所有比赛(ACM-ICPC,Google CodeJam,Facebook Hackercup),练习和与竞争编码有关的所有内容

    它从我停止使用TurboC ++时开始,由于无法理解二进制搜索而难以理解为什么需要链表并且哭泣。 这可能是我整个工程过程中最活跃的存储库。为什么要保留这个? 出于同样的原因,人们写日记/博客。 就像维护相册一样。...

    01.ftprintf:重新编码libc的printf函数:sign_of_the_horns_light_skin_tone:

    2021年3月24日项目1周年纪念日的新说明 :partying_face: :pleading_face: : 现在使用'gcc main.c libftprintf.a debugs.a && ./a.out进行编译| 猫-e' Todo:修复隐式声明2020年2月24日开始| 仍在努力。 !尚未验证...

    安川伺服驱动器的常用故障代码

     A.C4 编码器C相断路 编码器C相没接  A.F1 电源缺相 主电源一相没接  A.F3 电源失电 电源被切断  CPF00 手持传输错误1 通电5秒后,手持与连接仍不对  CPF01 手持传输错误2 传输发生5次以上错误  A.99...

    C语言shuoming.chm

    Turbo C另外还提供了一个函数, 可以同时设置文本的字符和背景颜色, 这 个函数的调用格式为: void textattr(int attr); 其中: attr的值表示颜色形式编码的信息, 每一位代表的含义如下: 位 7 6 5 4 3 2 1 0 ...

    mp4-h264:[已暂停的项目]使用WASM的浏览器的MP4 + H264编码

    然而:这里的文档和示例将保留,因为它们为加速WASM和媒体处理提供了有价值的信息(与H264不相关) Chrome仍在试用 ,该已支持对H264进行编码而不产生特许权使用费(因为它由Chrome的许可证处理)。该项目的一部分是...

    s7-300工程实战总结.pdf

    49. 整个系统掉电后,为什么CPU在电源恢复后仍保持在停止状态? 13 50. 在点到点通信中,协议 3964(R)和RK 512 之间的区别是什么? 13 51. 当一个DP从站出故障,如何在输入的过程映像被清成“0”以前保存它们? 13 ...

    基于编码激励和相干系数的内镜超声成像算法

    为进一步提高超声成像质量,提出一种基于编码激励和相干系数的合成孔径超声成像(CFCS)算法。首先采用Golay互补序列对作为激励信号,通过增加发射脉冲的编码长度提高图像的信噪比,同时利用序列对良好的自相关特性消除...

    程序文件编号规则.doc

    若指导书中仍含有再下一级的指导书,则在上述编号尾部再加两位流水号,例如"产 品标识管理办法"是指导书"标识和可追溯性控制"下属的指导书,则其编号为:产品标识 管理办法_QI C0302-01-01。 5.4 质量体系质量记录...

    AMBE-1000手册(中文)

    这些压缩编码算法的压缩率、语音质量各有所长,其中美国DVSI(Digital Voice System Inc)公司提出的先进多带激励AMBE(Advanced Multi-Band Excitation)压缩编码算法是其中的杰出代表。AMBE是基于MBE技术的低...

    PatrickPVR-Encoder:使用Turbo.264 HD软件或Handbrake对PatrickPVR记录的mpeg2传输流进行编码

    一个MacOS X程序,该程序监视文件夹中的.m2t文件,然后使用AppleScript来控制Elgato Turbo.264 HD编码器应用程序。 其中包括一对与Handbrake CLI进行类似操作的外壳程序脚本(并且当Turbo.264 HD应用程序/ USB设备不...

Global site tag (gtag.js) - Google Analytics