C 语言为什么不会过时?
小白学视觉
共 11278字,需浏览 23分钟
·
2020-08-25 10:51
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
整理:表哥有话讲 作者:赵岩 / Serdar 等
就在 5 月,时隔 5 年,C 语言再次领先 Java,荣登 TIOBE 编程语言排行榜第一!
排名前十的分别是:
C,Java,Python,C++,C#,Visual Basic.NET,JavaScript,PHP,SQL 和 R。
有没有发现亮点?没错, 第一易主了,C 语言反超了 Java 。要知道,C 语言上次第一还是在 5 年前,是什么原因让其 “东山再起” 了呢?
时隔五年,C 语言重回榜首。
据 TIOBE CEO Paul Jansen 的猜测,“这听起来可能很不可思议,但是某些编程语言确实可以从这种情况中受益。"
嵌入式语言(C 和 C++ 等)越来越流行,因为它们被用于医疗设备软件中。
C 语言自诩的 “相信程序员” 都是漂亮的说辞,它的唯一目的就是快,要么飞速的运行,要么飞速的崩溃。C 语言只关心程序飞的高不高,不关心程序猿飞的累不累。就是这样!
现在回答两个最普遍的问题:硬件这么便宜了,有必要让软件更快吗?有这种疑问的人大部分都是网吧的固定客户,他们理解的计算机只在电脑城,他们理解的计算只是游戏和播放硬盘中的小电影。不要玩个游戏开个挂就乐得不行不行的,别忘了还有全实景仿真,还有 3D 渲染,还有自动驾驶。
02、为什么 C 仍占据统治地位?
Java 的语法从 C 和 C ++ 中借鉴了很多东西。但是,与 C 不同的是,Java 默认情况下不会编译为本机代码。相反,Java 运行时环境,JVM,JIT(实时)编译 Java 代码以在目标环境中运行。在适当的情况下,JIT 编译后的 Java 代码可以接近甚至超过 C 的性能。
Java 背后的 “一次编写,随处运行” 的理念也允许 Java 程序在目标架构上进行相对较少的调整即可运行。相比之下,虽然 C 已被移植到许多架构中,但任何给定的 C 程序仍可能需要重新量身定做才能在,打个比方,Windows 与 Linux,两种不同的 os 之间正常运行。
这种可移植性和强大性能的结合,以及庞大的软件库和框架组成的生态,使 Java 成为构建企业应用程序的首选语言。
Java 输给 C 的地方是一个 Java 从未打算竞争的领域:靠近底层结构运行,或直接与硬件打交道。C 代码被编译成机器代码,由进程直接执行。Java 被编译成字节码,这是一种随后会被 JVM 解释器转换为机器代码的中间代码。此外,尽管 Java 的自动内存管理在大多数情况下都是个优点,但 C 更适合于必须充分利用有限内存资源的情况。
也就是说,在某些方面,Java 在速度方面可以接近于 C。JVM 的 JIT 引擎在运行时根据程序行为优化例程,允许进行许多类型的优化,而这些优化是在未提前编译的 C 中无法实现的。虽然 Java 运行时自动执行内存管理,但一些较新的应用程序可以解决这个问题。例如,Apache Spark 部分地通过使用绕过 JVM 的自定义内存管理代码来优化内存中处理。
与 Java(以及某种程度上来说 Python 也是如此)一样,.Net 提供跨各种平台的可移植性和庞大的集成软件生态系统。考虑到.Net 世界中有多少面向企业的开发,这些都是不小的优势。当您使用 C#或任何其他.Net 语言开发程序时,您可以使用为.Net 运行时编写的大量工具和库。
.NET 另一个类似 Java 的优势是 JIT 优化。C#和.Net 程序可以按照 C 语言提前编译,但它们主要由.Net 运行时进行即时编译,并使用运行时信息进行优化。JIT 编译允许对无法在 C 中执行的运行着的.Net 程序进行各种就地优化。
与 C 一样,C#和.Net 提供各种直接访问内存的机制。堆,栈和非托管系统内存都可以通过.Net API 和对象访问。开发人员可以使用.Net 中的 unsafe 模式来实现更高的性能。
但这些都不是没有代价的。托管对象和 unsafe 对象不能被任意交换,并且它们之间的编组会降低性能。因此,要最大化.Net 应用程序的性能需要将托管和非托管对象之间的变动保持在最低限度。
如果您无法承担托管与非托管内存之间变动造成的性能损失,或者.Net 运行时对于目标环境(例如,内核空间)来说是一个糟糕的选择,或者可能根本不可用,那么 C 就是你所需要的。与 C#和.Net 不同,C 被默认可以解锁对内存的访问权。
代码可读性是 Go 的指导设计目标之一:让开发人员可以轻松掌握任何 Go 项目,并在短时间内熟练掌握代码库。C 代码库可能很难理解,因为它们很容易聚集大量专属于某个项目或某个团队的宏和和 #ifdef。Go 的语法及其内置的代码格式以及项目管理工具旨在避免这种结构性问题。
Go 还提供了诸如 goroutine 和 channel 之类的附加功能,用于处理并发性和组件之间的消息传递的语言级别的工具。C 需要开发者手动完成或由外部库提供,但 Go 提供了开箱即用的这些功能,使得构建需要这些功能的软件变得更加容易。
Go 与 C 最深层次的不同之处在于内存管理方面。默认情况下,Go 的对象会被自动管理并自动进行回收。对于大多数编程工作来说,这非常方便。但这也意味着任何需要确定性处理内存的程序都会更难编写。
Go 确实包含了用于绕过 Go 的某些类型处理安全性的 unsafe 包,例如使用 Pointer 类型读取和写入任意内存。但 unsafe 会附带一个 warning 说用它编写的程序 “可能是不可移植的,并且不受 Go 1 兼容性指南的保护。”
Go 非常适合构建命令行实用程序和网络服务等,因为这些很少用到太过细致的操作。但是,如果是低级设备驱动程序,内核空间操作系统组件以及其他需要严格控制内存布局和管理的任务,那么就最好用 C 来创建。
Rust 的语法和编译规则可帮助开发人员避免常见的内存管理错误。如果程序有一个不符合 Rust 语法的内存管理问题,它就不会被编译。刚接触这种语言的新手,特别是以前用 C 语言的开发者,由于 C 语言为这类 bug 提供了充足的容错空间,所以他们接触 Rust 的第一步是学习如何安抚编译器。但 Rust 的支持者认为,这种短期的痛苦有一个长期的回报:更安全的,不会减缓速度的代码。
Rust 还通过其工具改进了 C 语言。默认情况下,项目和组件管理是 Rust 提供的工具链的一部分,与 Go 相同。有一种默认的,推荐的方法来管理包,组织项目文件夹,以及处理 C 需要单独处理的其他许多事情,每个项目和团队以不同的方式处理它们。
然而,在 Rust 中被吹捧为优势的东西对于 C 开发者来说可能并没有太大吸引力。Rust 的编译时安全功能无法禁用,因此即使是最小的 Rust 程序也必须符合 Rust 的内存安全限制。默认情况下,C 可能不太安全,但在必要时它更灵活,更宽容。
Python 强调的,以及它与 C 最不同的地方,是有利于开发速度而不是执行速度。一个可能需要一个小时才能用另一种语言写出来的程序 —— 比如 C—— 可能用 Python 几分钟内就能写好。另一方面,该程序在 C 中执行可能需要几秒钟,但需要一分钟才能在 Python 中运行完。(一个很好的经验法则:Python 程序通常比它们对应的 C 语言程序运行速度慢一个数量级。)但是对于现代硬件上的许多工作,Python 已经足够快了,这是它如今广泛应用的一个重要原因。
另一个主要区别是内存管理。Python 程序完全由 Python 运行时进行内存管理,因此开发人员不必担心分配和释放内存的细节。但同样,开发人员的轻松也是以运行时性能为代价的。编写 C 程序需要严格关注内存管理,但生成的程序通常是纯机器速度的黄金标准。
但是,在二者的血脉中,Python 和 C 共享一个深层的关系:Python 运行时参考是用 C 语言编写的。这允许 Python 程序包装用 C 和 C ++ 编写的库。第三方库的 Python 生态系统的很多重要模块,例如机器学习方面的库,其核心是 C 代码。
如果开发速度比执行速度更重要,并且如果程序的大多数高性能部分可以被隔离到独立组件中(而不是遍布整个代码),那么纯 Python 或 Python 和 C 库的混合使得会是比单独使用 C 更好的选择。否则的话,C 仍然是老大。
2. 操作系统内核代码还是 C 语言为主打,就语言的灵活性以及执行的效率来看 C 语言还是最合适的语言,而且在系统层次的代码,C 语言还是首选语言。而且现在很多流行语言的底层绝大部分的 C 语言构建完成。从这个层面讲 C 语言是永远不会过时的,顶多算是应用范围变窄,但其作用依然强大。
3. C 语言的职位比例相对应用级语言是低了点,但是整个软件行业在发展,绝对的 C 语言编程职位并没有减少。而且对于有志于成为架构师层次的程序员来说,C 语言还是必修课,构建软件框架还是需要对底层有所了解。
退一步来讲,即使觉得 C 语言方面的职位比例低一些,不好找工作,可以先从 C 语言入手,把自己的知识体系建立起来,编程语言属于工具范畴,熟悉一种工具的使用,很容易触类旁通,切换到别的语言也相对轻松些,而且给整个职业生涯起了个好头,打好了基础为更上一层楼做足准备。
C 语言之所以流行这么年,生命力这么旺盛和本身鲜明的高效,方便灵活挂钩。即使在上层语言使用概率变低,并不妨碍在系统级别继续发挥作用。任何一种语言都有其存在的社会价值所在。C 语言还是值得作为入门语言深刻的学习。
知乎红人 vczh 说:「我在上大学的时分简直就只学习 C/C++,后来实习的时分去了微软,成果到了那里才知道,那个组是不必 C/C++ 的,怎么办?凭借着 C++ 带给我的富裕的功底,我准时完结了老板给我的 "两个星期内学会 C# 和 WCF 基础知识" 的作业,顺畅开端作业。」
当然,这只是 vczh 的个人经历,不具有普遍性,但不可否认的是 C/C++ 仍具有不可代替性。某家创业公司 CTO 在接受采访时表示:「即使有许多人唱衰 C/C++,但在今世,仍有许多许多项目的目标渠道暂时只供给 C/C++ 编译器的支撑,仅从这一点而言,C/C++ 是不可能完全消逝的。」
04、除了 C,需要掌握多种语言吗?
想要掌握多种编程语言的 9 个理由
能用多种方式来解决同样的问题,掌握不同的编程语言意味着拥有更多的选择。毕竟,当你只有锤子时,一切看起来都像是钉子。 更有竞争力,拥有更多的就业机会。学习第二门编程语言,有时能加倍工作机会的数量。然而,这取决于你学习的语言种类。但无论怎么说,你将会有更多的合适机会,从而增加求职能力。 表明你具备学习新语言的能力。潜在的雇主会认为你并非是死板或者惯守成规的人。 学习是很有趣的。学习新的事物会让你的头脑保持兴奋。这将有助于你在新领域的成长和提高。 紧跟当前的技术发展趋势。了解哪个行业在独领风骚,就可以永远站在潮流的尖端,你的技能便不会过时。 这将提醒你为什么应该热爱你的 “主” 语言,或者如何将事情做得更好。有时候,只有尝试过新语言,才会知道主语言是何等的优秀。你会更加欣赏自己最爱的语言。与此同时,新语言可能会有一些惊人的特性,让你深觉相见恨晚。 有助于成为一个更加优秀的程序猿。学习新的语言,有助于提高在所有语言之间通用的技能,例如:设计和架构算法,或处理不同的数据结构。 针对工作选择最佳的工具。尺有所短寸有所长 - 有的语言更善于处理某些特定方面的事情。掌握了多种语言,你可以在工作中选用最佳的工具 表明你的学习能力强。没有任何事情比掌握第二语言更能证明你的学习能力。
不想掌握多种编程语言的 9 个理由
掌握一种语言更容易。通常,集中精力和全心投入才能精通某一事物。如果不断地在多种语言之间进行切换,那么真正精通一门语言的概率就会降低。掌握一种语言也有助于你集中精力。 大多数人只需要一份工作,大部分公司只使用一种语言。在你被录用后,掌握多种语言不一定会有所帮助。有时候,只要掌握项目所用的语言就够了。 总有一些东西值得学习;有时候,这意味着要更深入地学习一种语言。 大多数情况下,专家能提更高的薪资要求,因为人们更愿意为专家支付更多的薪水。John Sonmez 在其视频《 I’m Not Sure I Want To Be A Specialist》中谈到为什么多面手并不总是最好的。 即便仅掌握一种语言,仍然可以被认为是一个伟大的开发者。是否是伟大的开发者与你掌握多少种语言无关。关键在于你创造的是什么。因为只涉及一种语言,所以你可以花更多的时间进行创造。 你只需要学习有限的软件开发工具。大多数语言只有为数不多的一些工具。切换语言往往意味着要切换工具。只掌握一种语言,你就可以更快地掌握相关的工具。这将有助于提高工作效率。 更易于定位自己的市场。因为只掌握一种语言,基本上你只会朝这个方向安顿下来(即使不是出于自己的选择)。 你可以凭借任何一种语言解决大多数软件问题。不管有多少人告诉你,大多数语言可以用于解决任何问题。如果解决问题是你的主要目标(本应当是),掌握更多的语言并不一定有助于实现这个目标。 深入理解一件事比表面了解十件事更好。
这并非是一个非黑即白的问题。和其他问题一样,最好的解决办法是取中间值:总有一片灰色地带。如果你是一个初学者,那么学习一种语言,并将其应用到前十多个项目中会比较容易。但此之后,建议你成为一个「T 形」软件开发者。
什么是「T 形」软件开发者?
所谓「T 形」软件开发者在某一个特定的区域拥有很深的造诣,而且是一种语言的专家,T 字母中的垂直线代表了这一点;此外,他们会继续广泛学习另一种技能,T 字母中的水平线代表了这一点。
那么,这与软件开发,特别是编程语言的学习,有什么关系呢?我的建议是精通一种编程语言,这将成为你以后的生计,并用于解决大部分问题。你应该尽你所能掌握这门语言。在此基础上,可以学习最适合工作的第二种语言或技能。
在成为 T 形开发者的历程中,你将灵活地掌握多种语言,同时具备某个领域专家的优点。
应该掌握哪种编程语言?
一个常见的问题是,应当学习哪种语言。或者说,假如你是初学者,应当首先学习哪种语言。通常,我会选择有一定历史的语言作为主要语言。这种语言应当用于多个行业,并且有广泛的使用群体和大量的开发工具。符合这些标准的语言包括但不限于:C、C++、Java、JavaScript、C#、Python、Go 等等。
TIOBE 软件基于这些标准持续跟踪软件语言的流行性,并编入索引中。你可以点击 TIOBE Index 查看完整的编程语言列表。索引会每月更新,前 20 名中的大多数语言都是不错的选择。未来 10 年,这些语言还会流行吗?我不确定。不过至少在未来几年内还是很可能保持流行的,我想,这对任何准备着手的项目都是够用的。
说实话,关于是否需要掌握更多的语言,其实并没有绝对正确或错误的答案,不谈需求选语言都是耍流氓,最后的决定还是取决于你的需求。
https://www.infoworld.com/article/3402023/why-the-c-programming-language-still-rules.html
http://zhaoyan.website/blog/index.php/2017/07/15/future/
https://dzone.com/articles/do-you-need-to-know-more-than-one-language
评论