自年以来,C编程语言作为我们软件的基本构建块之一一直很活跃。但是,过去几十年中出现的数十种新语言呢?有些显然是为了挑战C的统治地位而设计的,而另一些则将其作为副产品。而在性能、裸机兼容性方面几乎没有语言能够击败C。
C与C++
C经常与C++比较,顾名思义,这种语言是作为C的扩展而创建的。C++和C之间的差异可以也因人不同。
虽然在语法和方法上仍然像C,但C++提供了许多真正有用的功能,这些功能在C中是不可用的:命名空间,模板,异常,自动内存管理等。需要顶级性能的项目(如数据库和机器学习系统)通常以C++编写。
此外,C++比C更积极地发展。即将发布的C++23带来了更多内容,包括模块、协程和模块化标准库,可实现更快的编译和更多的代码。相比之下,C标准的下一个计划版本C2x几乎没有增加,而是专注于保持向后兼容性。
问题是,C++中的所有优点也可以作为缺点。我们使用的功能C++越多,引入的复杂性就越高,这就导致学起来成本太高,并且容易出错。因此有些组织希望完全防范这种复杂性。例如,Linux内核开发团队避开C++,大多数Linux仍将用C语言编写。
C与Java
Jav是现在企业软件开发的主要语言,也是一般开发的主要内容。Java语法从C和C++中借用了很多。但是,与C不同,Java默认情况下不会编译为本机代码。相反,Java的JIT(实时)编译器编译Java代码以在目标环境中运行。JIT引擎根据程序行为在运行时优化例程,从而允许许多使用提前编译的C语言无法实现的优化类。在适当的情况下,JIT编译的Java代码可以接近甚至超过C的性能。
而且,Java运行时自动执行内存管理。例如,ApacheSpark通过使用Java运行时的“不安全”部分来直接分配和管理内存并避免JVM垃圾回收系统的开销,从而部分优化了内存中处理。
Java的“一次编写,随处运行”的理念也使Java程序可以在对目标架构进行相对较少的调整的情况下运行。相比之下,尽管C已经移植到许多架构中,但大多数C程序可能仍然需要自定义才能在Windows与Linux上正常运行。
这种可移植性和强大性能的结合,以及庞大的软件库和框架生态系统,使Java成为构建企业应用程序的首选语言和运行时。
C代码被编译成机器代码,由进程直接执行。Java被编译成字节码,字节码是JVM解释器随后转换为机器码的中间代码。此外,ava的自动内存管理在大多数情况下是一件好事,但C更适合必须充分利用有限内存资源的程序,因为它的初始占用空间很小。
C与go
Go语法很大程度上归功于C,精通C语言的开发人员通常可以毫不费力地掌握Go,即使考虑到新的Go功能(如命名空间和包管理)也是如此。
可读的代码是Go的指导设计目标之一:让开发人员能够轻松跟上任何Go项目的速度,并在短时间内精通代码库。C代码库可能很难摸索,因为它们很容易变成所谓的“屎山”,并且特定于项目和给定团队。Go的语法及其内置的代码格式化和项目管理工具旨在防止这些制度性问题。
Go还具有诸如goroutines和通道之类的附加功能,用于处理组件之间的并发和消息传递的语言级工具。C语言需要这些东西是手工滚动的,或者由外部库提供,但Go提供了开箱即用的好处,这使得构建需要它们的软件变得更加容易。
Go与C最大的区别在于内存管理。默认情况下,Go对象会自动进行管理和垃圾回收。对于大多数编程工作来说,这非常方便。但这也意味着任何需要确定性地处理内存的程序都将更难编写。
Go非常适合构建命令行实用程序和网络服务等程序,因为它们很少需要这种细粒度的操作。但是,低级设备驱动程序、内核空间操作系统组件以及其他需要严格控制内存布局和管理的任务最好在C语言中创建。
C与Carbon
C和C++的另一个可能竞争者是Carbon,这是一种目前正在大力开发的新语言。
Carbon的目标是成为C和C++的现代替代品,具有简单的语法,现代工具和代码组织技术,以及程序员长期面临的问题C和C++的解决方案。它还意味着提供与C++代码库的互操作,因此可以增量迁移现有代码。所有这些都是一项受欢迎的努力,因为与最近开发的语言相比,C和C++在历史上具有原始的工具和流程。
那么缺点是什么呢?目前,Carbon是一个实验项目,尚未远程准备用于生产用途。甚至没有一个工作的编译器,只是一个在线代码浏览器。碳成为C或C++的实用替代品(如果成功的话)还需要一段时间。
对C语言感兴趣的朋友,可以点击下方京东链接购买书籍学习。
零基础学C语言(全彩版)基础入门、实例进阶、实战练习,赠视频、源码、必刷题、电子魔卡京东月销量好评率99%无理由退换京东配送官方店¥62.5购买