您的位置:首页 > 国内新闻

为什么 C 语言仍然占据统治地位?

时间:2019-07-24

[程序生活]编辑C] C语言已经成为软件开发的主要语言已有50年。以下是它在2019年与C ++,Java,C#,Go,Rust和Python竞争的方式。

RUlidRP367eFaG

作者| Serdar Yegulalp

翻译|王艳妮编辑|涂敏

制作| CSDN(ID:CSDNnews)

以下是翻译:

没有技术可以使用长达50年,除非它真的比大多数其他东西更好。对于计算机行业尤其如此。自1972年成立以来,C语言一直很好,今天它仍然是我们用来构建软件世界的建筑材料之一。

但有时候技术可以存在很长时间,只是因为人们没有时间发明新东西来取代它。在过去的几十年里,出现了许多其他语言。其中一些明确地设计用于挑战C的主导地位,并且一些语言试图通过它们的普及来慢慢分解C的主导地位。

很容易认为C需要被替换。编程语言研究和软件开发实践都建议如何比C更好地做事。但经过几十年的研究和开发,C语言的地位仍然是可靠的。在性能,裸机兼容性或多功能性方面,很少有其他语言能够击败它。但是,在2018年,C如何与那些明星编程语言竞争,细节仍然值得一看。

RC6F7x6B7dmJLm

C vs. 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更为明智。

RC6F8263HibLH0

C与Java

几十年来,Java一直是企业软件开发的主要参与者之一,,并且是广泛开发的主要参与者之一。许多最重要的企业软件项目都是用Java编写的。包括大多数Apache Software Foundation项目,Java仍然是开发企业级需求项目的可行语言。

Java的语法从C和C ++中借鉴了很多。但是,与C不同,Java默认情况下不编译本机代码。相反,Java运行时环境JVM,JIT(实时)编译Java代码以在目标环境中运行。适当时,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的自定义内存管理代码来优化内存中处理。

RC6F82ZBQQOfLo

C vs. C#和.Net

在推出近二十年后,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提供了各种直接访问内存的机制。堆,堆栈和非托管系统内存都可以通过.Net API和对象访问。开发人员可以使用.Net中的不安全模式来实现更高的性能。

但这些并非没有成本。托管对象和不安全对象不能随意交换,它们之间的编组会降低性能。因此,最大化.Net应用程序的性能需要将托管和非托管对象之间的更改保持在最低限度。

如果您无法承受托管和非托管内存之间的更改导致的性能损失,或者.Net运行时是目标环境(例如,内核空间)的错误选择,或者它可能根本不可用,那么C就是你。需要。与C#和.Net不同,C默认解锁以访问内存。

RC6F8Ky5agOoen

C vs. Go

Go的语法主要使用C花括号作为分隔符,语句以分号结尾,依此类推。精通C的开发人员通常可以毫无困难地使用Go,甚至Go的独特功能(如命名空间和包管理)对开发人员来说也不难。

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

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

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

Go确实包含绕过某些类型的Go处理安全性的不安全软件包,例如使用Pointer类型读取和写入任意内存。但不安全的是警告用它写的程序“可能不便携,并且不受Go 1兼容性指南的保护。”

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

RC6F8LC63fiGu3

C vs. Rust

在某些方面,Rust是对C和C ++创建的内存管理挑战的回应,是对两种语言中许多其他缺点的回应。 Rust被编译为本机机器代码,因此在性能方面,它被认为等同于C.但默认情况下,内存安全性是Rust的主要卖点。

Rust的语法和编译规则可帮助开发人员避免常见的内存管理错误。如果程序的内存管理问题不符合Rust语法,则不会编译。这种语言的新手,特别是那些过去使用过C语言的人,因为C语言为这些错误提供了足够的容错能力,他们与Rust联系的第一步是学习如何安抚编译器。但鲁斯特的支持者认为,这种短期的痛苦有一个长期的回报:更安全的代码不会减速。

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

然而,在Rust中被吹捧为优势可能对C开发人员来说并不是很有吸引力。 Rust的编译时安全功能无法禁用,因此即使最小的Rust程序也必须符合Rust的内存安全限制。默认情况下,C可能不太安全,但在必要时它更灵活,更宽容。

另一个可能的缺点是Rust语言的大小。即使考虑到标准库,C的功能也相对较少。 Rust功能集非常庞大且不断增长。与C ++一样,较大的Rust功能集意味着更强大的功能,但它也意味着更高的复杂性。 C是一种较小的语言,但它更容易在脑海中进行建模,因此对于那些对于Rust而言太小的项目而言,它可能更适合做大事。

RCZeKPFHsKMUt5

C与Python

今天,每当你谈论软件开发时,Python似乎总是出现在对话中。毕竟,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仍然是老板。

原文:

R69FpRH4d90a7d

日期归档
  • 友情链接:
  • 楚汉新闻门户网 版权所有© www.edu-china.net 技术支持:楚汉新闻门户网| 网站地图