当前位置: 首页 > 科技观察

雷打不动的C语言!_0

时间:2023-03-22 11:12:47 科技观察

作者|译者SerdarYegulalp|布加迪投影|YunZhao几十年来,C语言一直是编程界的佼佼者。它可以在Linux、Windows、Mac和许多其他操作系统的内核中找到。C语言几乎可以编写任何程序,在编程语言中的地位是备受推崇的。它甚至可能是有史以来最具影响力的语言。它的语法启发了许多其他语言,包括Cpp、Csharp、Java、JavaScript、Go、Perl等等。自1972年以来,C编程语言一直是构建软件的主力语言之一。但是随着过去50年出现的几十种新语言,这些后代语言的表现如何呢?他们中的一些人在挑战C的统治地位,而另一些人则在蚕食它。撼山易,撼C语言难!很少有语言可以在性能、裸机兼容性和普遍性方面击败C。不过C与一些主流语言的比较仍然值得一看。本文介绍了它与C++、Java、C#、Go、Python和最新语言Carbon的详细对比。C和C++C通常与C++进行比较;顾名思义,C++是作为C的扩展而产生的,C++和C的区别是很大的,甚至可以说是区别太大了。虽然C++在语法和方法上仍然与C非常相似,但它提供了许多C本身没有直接提供的有用功能:名称空间、模板、异常和自动内存管理,仅举几例。一般来说,需要顶级性能的项目,例如数据库和机器学习系统,通常是用C++编写的,利用这些特性来最大化系统的性能。此外,C++比C迈出了更大的一步。即将发布的C++23带来了更多的特性,包括模块、协程和模块化标准库,以实现更快的编译和更多的代码。相比之下,C标准的下一个计划版本C2x并没有增加太多功能,而是专注于保持向后兼容性。问题是C++中的所有优点也可能是缺点。软件功能使用的C++越多,它引入的复杂性就越大,结果就越难处理。如果开发人员只关注其中的一小部分,则可以避免C++的许多陷阱。甚至一些公司也想完全避免这种复杂性。例如,Linux内核开发团队避免使用C++。尽管团队将Rust视为未来添加内核功能的语言,但Linux的大部分内容仍将使用C语言编写。C和Java几十年来Java依然是企业软件开发的主力军,也是整个开发行业的主力军。Java语法大量借鉴了C和C++。不过,与C不同的是,Java默认情况下不会编译为本机代码。相反,Java的JIT(即时)编译器编译Java代码以在目标环境中运行。JIT引擎根据程序行为在运行时优化例程,实现了提前编译C无法实现的各种优化。在适当的情况下,JIT编译的Java代码可以接近甚至超过C的性能。此外,尽管Java运行时环境会自动执行内存管理,但可以绕过该处理。例如,ApacheSpark通过使用Java运行时环境的“不安全”部分来直接分配和管理内存并避免JVM垃圾收集系统的开销,从而部分优化了内存处理。Java奉行“一次编写,随处运行”的理念,这也使得Java程序无需对目标体系结构做任何调整就可以运行。相比之下,尽管C已被移植到许多体系结构中,但任何特定的C程序可能仍需要定制才能在Windows和Linux上正常运行。这种便携性和强大性能的结合,再加上软件库和框架的大型生态系统,使Java成为构建企业应用程序的首选语言和运行时环境。Java不如C的一个方面是C从来就不是为了竞争而设计的:它靠近硬件运行,或者直接与硬件打交道。C代码被编译成机器码,由进程直接执行。Java被编译成字节码,这是JVM解释器随后转换成机器码的中间代码。此外,虽然Java的自动内存管理通常是一个优势,但C更适合于必须最佳利用有限内存资源的程序,因为它的初始占用空间小。3.C和GoGo语法在很大程度上归功于C,作为分隔符的大括号和以分号结尾的语句只是两个例子。精通C的开发人员通常可以直接上手Go,甚至可以使用命名空间和包管理等新的Go功能。确保代码的可读性是Go的指导性设计目标之一:让开发者在短时间内尽快上手Go项目并熟悉代码库。C代码库可能很难分析,因为它往往会变成一堆特定于某个项目和团队的宏和#ifdef。Go的语法和内置的代码格式化和项目管理工具旨在防止这个根本问题。Go具有其他功能,例如goroutines和通道,用于处理组件之间的并发和消息传递的语言级工具。C需要手动控制或由外部库提供此类功能,但Go直接提供它们,因此构建需要它们的软件要容易得多。Go和C之间最大的潜在区别是内存管理。默认情况下,Go对象是自动管理和垃圾收集的。对于大多数编程工作,这非常方便。但这也意味着任何需要确定性地处理内存的程序都将更难编写。Go确实包含unsafe包,它用于规避Go的一些类型处理安全机制,例如使用Pointer类型读写任意内存。但unsafe有一个警告:用它编写的程序“可能不可移植,并且不受Go1兼容性指南的保护。”Go非常适合构建命令行实用程序和网络服务等程序,因为它们很少需要这种细粒度的操作。但低级设备驱动程序、内核空间操作系统组件和其他需要严格控制内存布局和管理的任务在C中无法更好地创建。4.C和Python如今,只要谈到软件开发,Python似乎总是绕不开。毕竟,Python是“第二好的语言”,当然也是最通用的语言之一,拥有数以千计的第三方库。Python更强调开发速度而不是执行速度,这是它与C最大的区别。一个程序用另一种语言如C可能需要一个小时才能组装,而用Python几分钟就可以组装完成。另一方面,该程序可能需要几秒钟才能在C中执行,但可能需要一分钟才能在Python中运行。一个好的经验法则是Python程序的运行速度通常比C程序慢一个数量级。但对于现代硬件上的许多任务,Python足够快,这是它被采用的关键。另一个主要区别是内存管理。Python程序的内存完全由Python运行时环境管理,因此开发人员不必担心分配和释放内存的细节。但开发人员的轻松是以“运行时性能”为代价的。编写C程序需要严格注意内存管理,但生成的程序对于纯粹的机器速度来说是非常标准的。说完区别,两者在底层有很深的联系:参考Python运行环境是用C写的,这使得Python程序可以包装用C和C++写的库。相当一部分Python生态的第三方库(比如机器学习的第三方库)都是以C代码为核心。在很多情况下,这不是C或Python的问题,而是应用程序的哪些部分应该用C编写,哪些部分应该用Python编写。如果开发速度比执行速度更重要,并且如果程序的大部分高性能部分可以隔离成独立的组件(而不是分散在整个代码中),那么纯Python库或Python和C库的组合是一个很好的选择A比单独选择C??更好。但在其他方面,C仍然是至高无上的。C和CarbonC和C++最近的另一个竞争对手是Carbon,这是一种目前正在大力开发的新语言。Carbon旨在成为C和C++的现代替代品,具有简单的语法、现代工具和代码组织技术,以及C和C++程序员长期面临的问题的解决方案。它还旨在提供与C++代码库的互操作性,因此可以逐步迁移现有代码。这都是受欢迎的,因为与最近开发的语言相比,C和C++在过去拥有原始的工具和过程。那么有什么缺点呢?目前,Carbon是一个试点项目,尚未准备好用于生产。甚至没有可行的编译器,只有在线代码浏览器。Carbon成为C或C++的实际替代品(如果有的话)还需要一段时间。原文链接:https://www.infoworld.com/article/3402023/why-the-c-programming-language-still-rules.html