2018年C语言五十年的一种主力语言是怎样的?

五十年来,C 一直是软件开发的主力语言。以下是它在 2019 年与 C++、Java、C#、Go、Rust 和 Python 的对比。

以下为译文:

任何技术都无法使用 50 年,除非它确实比大多数其他东西更有效——尤其是对于计算机行业的技术而言。自 1972 年问世以来,C 语言一直生机勃勃,至今仍是我们用来构建软件世界的基本构建材料之一。

但有时一项技术之所以能持续很长时间,只是因为人们没有时间发明新的东西来取代它。在过去的几十年里,出现了许多其他语言——一些明确旨在挑战 C 的主导地位,而另一些则试图凭借其受欢迎程度慢慢消除 C 的主导地位。

争论 C 需要被替换的想法很简单。编程语言研究和软件开发实践都表明如何比 C 做得更好。但经过数十年的研究和开发,C 语言的地位仍然稳固。在性能、裸机兼容性或多功能性方面,很少有其他语言可以击败它。不过,2018年C将如何与那些明星编程语言竞争的细节还是值得一看的。

C 与 C++

当然,C 最常与 C++ 进行比较,正如其名称本身所暗示的那样,C++ 是作为 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 是更明智的选择。

C 与 Java

几十年后,Java 仍然是企业软件开发的主力之一 – 以及更广泛的开发。许多最重要的企业软件项目(包括绝大多数 Apache Software Foundation 项目)都是用 Java 编写的,而 Java 仍然是开发企业级需求项目的可行语言。

Java 的语法大量借鉴了 C 和 C++。但是,与 C 不同的是,Java 默认情况下不会编译为本机代码。相反,Java 运行时环境、JVM、JIT(即时)编译 Java 代码以在目标环境中运行。在适当的情况下c语言编程手机计算器,JIT 编译的 Java 代码可以接近甚至超过 C 的性能。

Java 背后的“一次编写,随处运行”的理念还允许 Java 程序在对目标架构进行相对较少的调整的情况下运行。相比之下,虽然 C 已被移植到许多架构中,但任何给定的 C 程序可能仍需要重新定制才能在 Windows 和 Linux 这两个不同的操作系统之间正常运行。

这种可移植性和强大性能的结合,以及庞大的软件库和框架生态系统,使 Java 成为构建企业应用程序的首选语言。

Java 输给 C 的地方是 Java 从未打算竞争的领域:接近底层结构运行,或直接处理硬件。 C代码被编译成机器码,由进程直接执行。 Java 被编译为字节码,这是一种中间代码,然后由 JVM 解释器转换为机器代码。此外,虽然 Java 的自动内存管理在大多数情况下是一个优势,但 C 更适合必须充分利用有限内存资源的情况。

也就是说,Java 在某些方面可以在速度上接近 C。 JVM 的 JIT 引擎在运行时根据程序行为优化例程,允许在未提前编译的 C 中进行许多类型的优化。虽然 Java 运行时自动执行内存管理,但一些较新的应用程序可以处理这一点。例如,Apache Spark 通过使用绕过 JVM 的自定义内存管理代码来部分优化内存中的处理。

C 与 C# 和 .Net

在 C# 和 .Net 框架推出近 20 年后,它们仍然是企业软件世界的重要组成部分。有人说 C# 和 .Net 是微软对 Java 的回应——一个托管代码编译器系统和通用运行时库——C 和 Java 之间的许多对比也适用于 C 和 C# 或 .Net。

与 Java(在一定程度上还包括 Python)一样,.Net 提供跨各种平台的可移植性和大型集成软件生态系统。考虑到 .Net 世界中有多少面向企业的开发,这些都是不小的优势。当您使用 C# 或任何其他 .Net 语言开发程序时,您可以访问为 .Net 运行时编写的大量工具和库。

.NET 的另一个类似 Java 的优势是 JIT 优化。 C# 和 .Net 程序可以像在 C 中一样提前编译,但它们大多由 .Net 运行时即时编译并使用运行时信息进行优化。 JIT 编译允许对运行无法在 C 中执行的 .Net 程序进行各种就地优化。

与 C、C# 和 .Net 一样,为直接内存访问提供了各种机制。堆、堆栈和非托管系统内存都可以通过 .Net API 和对象访问。开发者可以使用 .Net 中的不安全模式来获得更高的性能。

图片[1]-2018年C语言五十年的一种主力语言是怎样的?-老王博客

但这一切都不是免费的。托管对象和不安全对象不能任意交换,它们之间的编组会降低性能。因此,要最大限度地提高 .Net 应用程序的性能,需要将托管对象和非托管对象之间的更改保持在最低限度。

如果您无法承受在托管内存和非托管内存之间移动的性能损失,或者 .Net 运行时对于目标环境(例如内核空间)来说是一个糟糕的选择,或者可能根本不可用,那么 C是你所需要的全部。与 C# 和 .Net 不同,C 默认情况下会解锁对内存的访问。

C 与 Go

Go 的语法大量借鉴了 C – 花括号用作分隔符,语句以分号结束等。精通 C 的开发人员通常可以毫无困难地直接使用 Go,甚至考虑到 Go 的独特功能,例如命名空间和包管理,对开发者来说并不难。

代码可读性是 Go 的指导性设计目标之一:让开发人员轻松掌握任何 Go 项目并在短时间内精通代码库。 C 代码库可能难以理解,因为它们倾向于聚合大量特定于项目或团队的宏和 #ifdef。 Go 的语法及其内置的代码格式化和项目管理工具旨在避免这种结构性问题。

Go 还提供了其他功能,例如 goroutine 和通道、用于处理组件之间的并发和消息传递的语言级工具。 C 需要由开发人员手动完成或由外部库提供,但 Go 开箱即用地提供了这些功能,从而更容易构建需要它们的软件。

Go 和 C 最深的区别在于内存管理。默认情况下,Go 对象是自动管理和自动回收的。这对于大多数编程工作来说非常方便。但这也意味着任何需要确定性地处理内存的程序都将更难编写。

Go 确实包含用于绕过 Go 的某些类型处理安全性的不安全包,例如使用 Pointer 类型读取和写入任意内存。但是 unsafe 带有一个警告,说用它编写的程序“可能是不可移植的,并且不受 Go 1 兼容性指南的保护。”

Go 非常适合构建命令行实用程序、Web 服务等,因为这些工具很少使用太多细节。但是,如果是低级设备驱动程序、内核空间操作系统组件和其他需要严格控制内存布局和管理的任务,那么最好用 C 语言创建它们。

C 与 Rust

在某些方面,Rust 是对 C 和 C++ 造成的内存管理难题的回应,也是对这两种语言的许多其他缺点的回应。 Rust 编译为本机机器码,因此在性能方面被认为与 C 相当。但默认情况下,内存安全是 Rust 的主要卖点。

Rust 的语法和编译规则可帮助开发人员避免常见的内存管理错误。如果程序存在不符合 Rust 语法的内存管理问题,它将无法编译。该语言的新手,尤其是那些曾经使用 C 的人,将学习如何安抚编译器,这是他们接触 Rust 的第一步,因为 C 为此类错误提供了充足的容错空间。但 Rust 支持者认为,这种短期的痛苦有长期的回报:更安全的代码不会减慢速度。

Rust 还通过其工具改进了 C 语言。项目和组件管理是 Rust 默认提供的工具链的一部分,与 Go 相同。有一种默认的推荐方式来管理包、组织项目文件夹以及 C 需要单独处理的许多其他事情,每个项目和团队处理它们的方式不同。

然而,在 Rust 中被吹捧为优势的东西可能对 C 开发人员没有太大的吸引力。 Rust 的编译时安全特性不能被禁用,因此即使是最小的 Rust 程序也必须符合 Rust 的内存安全约束。默认情况下,C 可能不太安全,但在必要时它更灵活、更宽容。

另一个可能的缺点是 Rust 语言的大小。即使考虑到标准库,C 语言的特性也相对较少。 Rust 功能集庞大且不断增长。与 C++ 一样,更大的 Rust 功能集意味着更强大的功能,但也意味着更高的复杂性。 C 是一种较小的语言,但更容易在您的脑海中建模,因此可能更适合那些对 Rust 来说太小以至于不值得努力的项目。

C 与 Python

如今,谈到软件开发,Python 似乎总是在讨论中。毕竟c语言编程手机计算器,Python 是“所有项目中第二好的语言”,毫无疑问是拥有数千个第三方库的最通用的语言之一。

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 还是老大。

原文:

本文转自公众号“CSDN”,ID:CSDNnews)

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论