摘要: C 语言在这过来的五十年间,曾经逐步倒退成为极其重要的软件开发语言。本文将深度分析它是如何与 C ++、Java、C#、Go、Rust 和 Python 进行竞争,并放弃肯定劣势的。
对于计算机编程语言来说,没有什么技术能沿用半个世纪年,除非它比其余的都好用。C 语言于上世纪七十年代初年面世,现在在软件世界仍放弃着底层根底开发的支流语言的位置。
有时,一个技术能被短暂地流传应用,是因为人们还没有找到一个更好的替代品。在过来的几十年,涌现了大量的语言——甚至呈现专门为了挑战 C 语言的统治位置而设计的新语言。
C 真的很难被代替。编程语言考察和软件开发实例都印证了能够用远比应用 C 语言更好的形式来做开发。但 C 的位置仍岿然不动,因为它的背地是几十年的积淀和提高。简直没有语言能够在性能、逻辑、或者普遍性上战胜它。
C vs. C++
很天然地,人们会拿 C 与 C ++ 做比照,顾名思义,C++ 是从 C 倒退而来的。两者之间的不同就在于易扩展性,或者易用性。
语法和形式上,C++ 与 C 语言比拟靠近,但 C ++ 提供了很多原生 C 没有的有用个性:命名空间、模板、异样、内存治理。我的项目如果对于性能比拟敏感,例如数据库和机器学习,通常应用 C ++ 编写会对提供零碎进步性能更有帮忙。
除此之外,C++ 比 C 更容易扩大。C++20 甚至带来更多的新个性,包含模块、协程、同步库以及其余概念,这些都让模板更易使用。对规范 C 的最新订正简直没有新增个性,而是更重视放弃向后兼容性。
事实上,所有 C ++ 的长处也是它的毛病。C++ 的个性应用得越多就越简单,后果就越加难以管制。所以,把本人限度于 C ++ 子集的开发者,能防止很多重大的问题。也有些机构想防止 C ++ 复杂性,保持应用 C。比方 Linux 内核的开发团队就会避开 C ++。
对于后期开发者和保护代码人员来说,抉择 C 是一个防止 C ++ 适度应用纠纷的形式。不过,C++ 也有一系列丰盛的高级性能,该用还是要用。但如果简洁明了更适宜当初或者将来我的项目的整体倒退的话,C 会更有劣势。
C vs. Java
在 JAVA 诞生了几十年之后,其依然是个别企业级软件开发的次要语言。大多数优良的企业软件开发我的项目都是用 Java 编写,包含绝大多数 Apache 基金会我的项目。当开发企业级我的项目时,Java 是一个可行性比拟高的语言。
Java 的语法大量地借鉴了 C 和 C ++。不过与 C 不同的是,Java 不会默认编译成机器语言。相同地,Java 运行时环境 JVM 会将 Java 代码即时编译到指标环境中运行。在良好的条件下,即时编译的 Java 能够达到甚至超 C 的性能。
Java 奉行的“一次编写,随处运行”的思维,Java 程序仅需小的调整,就能运行在不同的环境。相比之下,只管 C 曾经移植到许多体系结构中,然而任何给定的 C 程序可能依然须要定制能力在 Windows 和 Linux 上失常运行。
其可移植性和弱小性能的联合,以及软件库和框架的宏大生态系统,使 Java 成为企业级我的项目语言的一员。
然而,Java 落后 C 的中央在于,Java 素来没有竞争的畛域,都是靠近底层运行,或间接操作硬件。C 代码被转换成机器码,由过程间接执行。Java 被编译成字节码,由 JVM 解释器转换为机器代码的中间代码。 此外,只管 Java 的主动内存治理在大多数状况下是一种坏事,然而 C 更适宜于对无限内存资源有优化要求的程序。
在某些状况下,Java 的性能能够靠近 C。JVM 的 JIT 引擎能在运行时依据程序的行为优化程序,能够进行许多品种的优化,对于事后编辑的 C 语言而言,这个是行不通的。例如,ApacheSpark 应用自定义的内存治理代码绕过 JVM 进行了肯定水平的内存内解决优化。
C vs. C# 与 .Net
在推出近 20 年之后,C 和.NET 框架依然是企业软件世界的次要组成部分。有人说,C# 和.NET 是微软对 Java 的一种回应(托管代码编译系统和通用的运行时),因而 C 和 Java 之间的许多比拟也实用于 C 和 C#/.NET。
与 Java(以及 Python 的某些局部)一样,.NET 提供了跨多种平台的可移植性和集成软件的广大生态系统。思考到.NET 世界中的一些面向企业的开发,这些都是很大的劣势。当应用 C 或任何其余.NET 语言开发程序时,能够利用针对.NET 运行时编写的各种工具和库。
.NET 另一个和 Java 相似的长处是 JIT 优化。C 和.NET 程序能够像 C 那样提前编译,.NET 运行时可即时编译,并能应用运行时的信息进行优化。JIT 编译容许对正在运行的.NET 程序进行各种优化,这在 C 中是无奈进行的。
和 C 一样,C 和.NET 提供了各种间接拜访内存的机制。堆、堆栈和非托管零碎内存都能够通过.NETapi 和对象进行拜访。开发人员能够应用.NET 中的 unsafe 模式来实现更高的性能。
不过,值得注意的是,托管对象和 unsafe 对象之间不能随便替换,它们之间的封装传送须要以升高性能作为代价。因而,缩小两者之间的传递,能够最大化的进步.NET 程序的性能。
当累赘不起托管内存绝对于非托管内存的代价时,或者当.NET 运行时对于指标环境(如内核空间)是一个很蹩脚的选择项或者基本不可用时,那么 C 语言或者就能解决问题了。与 C 和.NET 不同,C 默认状况下会开启间接内存拜访。
C vs. Go
Go 语法和 C 很像,大括号作为分隔符、以分号结尾语句。精通 C 的开发人员通常无需太多艰难就能够间接转入 Go,甚至把 Go 的新个性如名称空间和包治理思考在内也是如此。
代码的易读性是 Go 的领导设计指标之一,开发人员可能轻松地跟上任何 Go 我的项目的速度,并在短时间内精通代码库。C 代码库很难摸索,因为它们很容易变成一个由宏和特定于我的项目或团队的嵌套。Go 的语法,以及其内置的代码格局和项目管理工具,都是为了防止这些机制问题。
Go 还提供额定的性能,像 Goroutines 和 Channels,用于解决并发性的语言级工具以及组件之间的消息传递。在 C 语言外面只能本人实现或者用三方库,然而 Go 以开箱即用的形式提供了这些个性,让咱们在开发须要相似性能的软件的时候,变得极其不便。
在内存治理方面,Go 与 C 有较大区别。默认状况下,Go 对象被主动治理和回收。对于大多数编程工作来说,这十分不便。但这也意味着任何须要对内存进行非凡解决的程序,会比拟难办。
Go 确实蕴含了一个 unsafe 的包,用于躲避 Go 的一些类型解决的安全性问题,例如应用 Pointer 类型读取和写入任意内存。但 unsafe 伴有一个正告,即用它编写的程序“可能不可移植,并且不受 Go1 兼容性准则爱护”。
Go 非常适合构建命令行程序和网络服务等程序,因为它们很少须要这样的细粒度操作。然而低级的设施驱动、内核空间操作系统组件以及其余须要对内存布局和治理进行严格控制的工作最好是在 C 中创立。
C vs Rust
在某些方面,Rust 是解决 C 和 C ++ 造成的内存治理难题的新计划,也是解决这些语言许多其余毛病的新计划。Rust 编译为本机代码,因而在性能上与 C 相当。不过,默认状况下,内存平安是 Rust 的次要卖点。
Rust 的语法和编译规定能帮忙开发者防止常见的内存治理谬误。如果一个程序存在跨过 Rust 语法的内存治理问题,那么它就不会编译。应用该语言的老手,尤其是从像 C 这样为此类谬误提供了大量空间的语言转过来的老手,他们学习 Rust 的第一阶段是如何安抚编译器。然而 Rust 支持者认为,这种短期的苦楚将失去一个长期的回报:不会就义速度的更平安的代码。
Rust 也能够用它的工具改善 C。默认状况下,我的项目和组件治理是 Rust 提供的工具链的一部分,与 Go 雷同。有一种默认的、举荐的形式来治理包、组织我的项目文件夹,以及解决许多其余事件,这最多是长期措施,每个我的项目和团队解决它们的形式都是不同的。
尽管如此,对于 C 开发人员来说,被吹捧为 Rust 劣势的货色可能看起来不是那样的。Rust 的编译时平安个性不能被禁用,所以即便是再小的 Rust 程序也必须合乎 Rust 的内存平安限度。默认状况下,C 可能不太平安,但在必要时,它更灵便,更宽容。
另一个可能的毛病是 Rust 语言的体积。即便思考到规范库,C 的新个性也绝对较少。Rust 个性集正在蔓生并持续增长。与 C ++ 相比,较大的 Rust 个性集意味着更弱小的能力,但也更简单。C 是一种较小的语言,但更容易建模,因而可能更适宜于看上去有点臃肿的我的项目中。
C vs Python
当初,每当议论软件开发时,Python 仿佛总是会被人们提起。毕竟这是“第二个适宜所有事件的语言”,毫无疑问,它是最通用的语言之一,有数千个第三方库。
Python 强调的是开发速度而不是执行速度,这是它与 C 的最大区别。用 C 语言组装一个程序可能须要一个小时,而用 Python 只需几分钟。另一方面,该程序在 C 语言中执行可能只须要几秒钟,而在 Python 中运行则须要一分钟。然而对于古代硬件来说,Python 足够快,这是它获得成功的要害。
另一个次要区别在于内存治理。Python 程序齐全是由 Python 运行时进行内存治理,因而开发人员不用放心调配和开释内存的艰难。但这里有必要讲明,开发者的轻松是以就义运行时性能为代价的,编写 C 程序须要审慎地留神内存治理。
其实,Python 和 C 之间有一个很深的分割:参考 Python 运行时是用 C 写的。这容许 Python 程序打包 C 和 C ++ 编写的库。Python 生态系统中一些重要的第三方库,如机器学习,其外围是 C 代码。
如果开发速度比执行速度更重要,程序执行局部能够隔离成独立的组件,而不是扩散在整个代码中,那么纯 Python 或 Python 和 C 库的混合比独自应用 C 更好。否则的话,C 依然是霸主。
感激 XJRsoft 提供撰文反对,原文来自 Serdar Yegulalp
详情参阅:https://www.xjrsoft.com
点击关注,第一工夫理解华为云陈腐技术~