`

时至今日,为何C语言在软件开发领域的地位仍无法撼动

阅读更多

 

 http://img3.mukewang.com/5dfdca330001580206410351.jpg

部分内容与国内生态有一定出入,以下为译文:

过去的 50 年,C 语言已经成为重要的软件开发语言。这里介绍了 2019 年它是如何与 C++、Java、C#、Go、Rust 和 Python 进行竞争的。

对于计算机编程语言来说,没有什么技术能流传使用 50 年,除非它比其他的都好用。C 语言于 1972 年面世,如今在软件世界仍保持着基本底层开发的主流语言的地位。

但有时一个技术能被长久的流传使用, 只是因为人们还没有找到一个更好的替代品罢了。在过去的几十年,涌现了大量的语言——有的专门为了挑战 C 语言的统治地位而设计,有的则因为其流行性而从侧面削弱了 C,感觉原文是这个意思。

真的很难证明 C 需要被替代。编程语言调查和软件开发实例都印证了可以用远比 C 好的方式来做事情。但 C 的地位仍岿然不动, 它的背后是几十年的调查和开发。几乎没有语言可以在性能上,在裸机上,或者在普遍性上打败它。即便如此,还是值得看一下 C 是如何在 2019 年与其他大名鼎鼎的语言进行较量的。

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 会更有优势。

http://img4.mukewang.com/5dfdca3c0001ef5605970301.jpg

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 语言而言,这个是行不通的。例如,Apache Spark 使用自定义的内存管理代码绕过 JVM 进行了一定程度的内存内处理优化。

http://img3.mukewang.com/5dfdca450001693c07200340.jpg

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 提供了各种直接访问内存的机制。堆、堆栈和非托管系统内存都可以通过.NET API 和对象进行访问。开发人员可以使用.NET 中的unsafe模式来实现更高的性能。

不过,没有免费的午餐。托管对象和unsafe对象之间不能随意交换,它们之间的封装传送需要性能做为代价。因此,减少两者之间的传递,可以最大化的提高.NET 程序的性能。

当负担不起托管内存相对于非托管内存的代价时,或者当.NET 运行时对于目标环境(如内核空间)是一个很糟糕的选择项或者根本不可用时,那么 C 语言或许就能解决你的问题了。与 C 和.NET 不同,C 默认情况下会开启直接内存访问。

http://img3.mukewang.com/5dfdca4e0001fda606900319.jpg

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伴有一个警告,即用它编写的程序“可能不可移植,并且不受 Go 1 兼容性准则保护”。

Go 非常适合构建命令行程序和网络服务等程序,因为它们很少需要这样的细粒度操作。但是低级的设备驱动、内核空间操作系统组件以及其他需要对内存布局和管理进行严格控制的任务最好是在 C 中创建。

http://img4.mukewang.com/5dfdca5600019d6a06310308.jpg

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 是一种较小的语言,但更容易建模,因此可能更适合于 Rust 看上去有点过火的项目中。

http://img2.mukewang.com/5dfdca620001e1f907160395.jpg

C vs. 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 仍然是霸主。

原文:Serdar Yegulalp

 

分享到:
评论

相关推荐

    C语言在哪些领域适合开发源码?C语言在操作系统和软件开发中的作用解析.docx

    C语言是一种功能强大且高效的编程语言,其简洁的语法、紧凑的代码结构和对底层硬件的直接控制能力使其在多个领域中发挥着重要作用。以下是C语言在不同领域的具体应用: 1. **操作系统开发**:C语言是编写操作系统...

    简单的C语言开发软件

    C语言是一种基础且强大的编程语言,广泛应用于系统编程、嵌入式开发、软件工程等多个领域。其语法简洁,效率高,允许程序员直接对硬件进行操作,因此在计算机科学中占有重要地位。 在【描述】中,提到“编译C语言很...

    c语言嵌入式系统开发

    C语言嵌入式系统开发是一门专注于使用C语言进行嵌入式系统编程和开发的技术领域。嵌入式系统是安装在特定装置中的专用计算机系统,它们通常被设计用于执行特定的任务,往往控制和管理机器或设备。嵌入式系统无处不在...

    c语言案例分析-软件开发流程

    在软件开发领域,C语言因其高效、灵活和广泛的应用,成为了许多系统级和嵌入式开发的首选语言。本案例分析将深入探讨基于C语言的软件开发流程,旨在帮助开发者理解并掌握这一过程的关键环节。 一、需求分析 在软件...

    1、C语言的应用领域有哪些.pdf

    C语言在计算机程序设计领域有着广泛的应用,它既可以用来编写系统软件,如操作系统、驱动程序,也可以用来开发应用程序,如办公软件、数据库管理系统等。它之所以被广泛使用,主要因为其具有以下特点: 1. 接近硬件...

    c语言学习软件

    由于其低级特性,C语言能够直接操作硬件,因此在操作系统、设备驱动和高性能计算等领域占据重要地位。 描述中提到的“例题”可能包含了C语言的基本语法和高级特性的各种示例代码,这些例子可以帮助用户理解和掌握...

    学习C语言的软件

    在计算机编程领域,C语言是一种基础且强大的编程语言,广泛应用于系统开发、嵌入式系统、游戏编程等多个领域。学习C语言需要一个合适的集成开发环境(IDE)或简单的文本编辑器,以及一个C编译器。 描述中的“一个小...

    Linux嵌入式linux软件开发、嵌入式linux驱动开发、c语言、单片机开发、IOT开发等面试要点记录PGJ.zip

    【Linux】嵌入式linux软件开发、嵌入式linux驱动开发、c语言、单片机开发、IOT开发等面试要点记录【PGJ】.zip 【Linux】嵌入式linux软件开发、嵌入式linux驱动开发、c语言、单片机开发、IOT开发等面试要点记录【PGJ...

    tc软件 c语言软件

    TC软件,全称为Turbo C,是DOS操作系统下的一个著名的C语言编译器,由Borland公司开发。在20世纪80年代至90年代初,它在计算机编程教育领域尤其流行,因其小巧高效,无需安装即可使用的特点而受到广大用户的喜爱。 ...

    C语言:嵌入式开发的核心

    C语言自从20世纪70年代诞生以来,一直是软件开发领域中的重要语言,尤其是在嵌入式系统的开发中占据着核心地位。本文将探讨C语言在嵌入式开发中的重要性,包括其特性、应用场景以及如何利用C语言进行高效的嵌入式...

    C语言嵌入式系统开发

    在IT领域,嵌入式系统开发是至关重要的一个分支,而C语言因其高效、灵活以及对硬件的直接访问能力,成为嵌入式开发中的首选编程语言。本篇将深入探讨"**C语言嵌入式系统开发**"的相关知识点,帮助读者理解和掌握这一...

    c语言项目开发PDF

    c语言项目开发PDF c语言项目开发PDF c语言项目开发PDF

    最好用的 C语言编程软件TC

    TC,全称Turbo C,是由Borland公司开发的一款C语言编译器,被誉为“最好用”的C语言编程软件之一。在80年代末到90年代初,TC在编程初学者中非常流行,其小巧的体积、快速的编译速度以及便捷的集成开发环境(IDE)...

    wintc编程软件,c语言软件开发人员必备软件

    描述中的“编程软件wintc编程软件,c语言软件开发人员必备软件”进一步强调了wintc在C语言开发中的核心地位,暗示它包含了可能的代码编辑、编译、调试和项目管理等功能,是C语言开发者日常工作中不可或缺的一部分。...

    基于C语言软件开发的效率、移植及调试研究.pdf

    综上所述,C语言在软件开发中的应用,包括其高效率、良好的移植性和强大的调试能力,这些特性使得它在计算机科学领域有着不可替代的地位。随着现代科技的不断进步,C语言及其软件开发相关的技术和方法也在不断演化,...

    嵌入式软件开发及C语言实现:MiniGUI剖析.zip.007

    嵌入式软件开发及C语言实现:MiniGUI剖析光盘资料,一共11个,必须全部下载才能解压哦~ 嵌入式软件开发及C语言实现:MiniGUI剖析.zip.007

    二级C语言上机软件

    标题中的“二级C语言上机软件”指的是专为学习和实践C语言编程的用户设计的计算机应用程序,这类软件通常包含了C语言编译器、集成开发环境(IDE)以及可能的调试工具,帮助用户编写、测试和运行C语言程序。在中国,...

    C语言在单片机开发中的重要性

    传统的单片机开发语言主要是汇编语言,但近年来,C语言因其强大的功能性和可移植性,在单片机开发中逐渐占据了主导地位。 #### 单片机开发语言概述 - **汇编语言**:这是一种低级语言,直接对应于处理器的指令集。...

    c语言软件 好用的软件制作

    C语言是一种强大的、高度灵活的编程语言,被广泛用于系统编程、嵌入式开发、软件制作等多个领域。它以其简洁的语法和高效的执行性能而受到程序员的青睐。本篇文章将深入探讨C语言在软件制作中的应用,以及如何利用...

Global site tag (gtag.js) - Google Analytics