|
作者 | Serdar Yegulalp
译者 | 布加迪
数十年来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运转时环境自动履行内存办理,但能够绕过这类处置。好比说,Apache Spark使用Java运转时环境的“不平安”部份来间接调配和办理内存,并防止JVM渣滓回收零碎的开消,从而部份优化了内存中处置。
Java奉行“一次编写,随处运转”的理念,也使Java顺序能够在对指标架构根本不需求调剂的状况下运转。比拟之下,虽然C曾经移植到许多架构上,但任何特定的C顺序可能仍需求定制,才能够在Windows与Linux上正常运转。
这类可移植性和弱小机能的结合,加之宏大的软件库和框架生态零碎,使Java成为构建企业运用顺序的首选言语和运转时环境。
Java比不上C的一个方面是,C从不旨在竞争:它凑近硬件运转,或者间接与硬件打交道。
C代码被编译成机器代码,机器代码由过程间接履行。Java被编译成字节码,字节码是两头代码,JVM解释器随后将它们转换成机器码。另外,虽然Java的自动内存办理大体上是优点,但C更合适必需最优化使用内存资源无限的顺序,由于它的初始占用空间很小。
C与Go
Go语法很大水平上归功于C,作为分隔符的花括号和以分号开头的语句只是两个例子。精晓C的开发人员通常能够间接上手Go,即便斟酌到新的Go功用(好比命名空间和保证理)。
确保代码可读是Go的指点设计指标之一:闪开发人员在短期内尽快上手Go名目,并相熟代码库。C代码库可能很难剖析,由于它往往变为某个名目和团队所独有的一大堆宏指令和#ifdefs。Go的语法及内置的代码格局化和名目办理工具旨在避免这类基本性问题。
Go还有诸如goroutines(协程)和channels(通道)之类的附加功用,这些言语级工具用于处置组件之间的并发和动静传递。C需求这种功用由手工管制,或者由内部库提供,但Go间接就提供,因此构建需求它们的软件要容易患多。
Go与C最大的底层区分在于内存办理。默许状况下,Go对象可完成自动办理和渣滓回收。关于大少数编程任务来讲,这十分便利。但这也象征着任何需求肯定性处置内存的顺序都将更难编写。
Go的确包罗unsafe包,用来避开Go的一些类型处置平安机制,好比读写使用Pointer类型的随便内存。但unsafe附有正告:用它编写的顺序“可能无奈移植,且不受Go 1兼容性指点原则的维护。”
Go十分合适构建命令行实用顺序和网络办事等顺序,由于它们很少需求这类细粒度的操作。然而低级装备驱动顺序、内核空间操作零碎组件以及其余需求严格管制内存规划和办理的工作用C来创立再好不外了。
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库都是比独自的C更好的选择。但在其余方面,C仍占统治位置。
C与Carbon
C和C++的另外一个比来的竞争者是Carbon,这是一种目前正在鼎力开发的新言语。
Carbon旨在成为C和C++的古代代替品,它有简略的语法、古代工具和代码组织技术,以及解决C和C++顺序员长时间面临的问题的计划。它还旨在提供与C++代码库的互操作性,因此能够增量迁徙现有代码。这所有都遭到欢送,由于与比来开发的言语比拟,C和C++在过来的工具和流程显得很原始很粗陋。
那末有何缺陷呢?目前,Carbon是一个实验名目,尚未筹备好用于出产环境。
乃至没有一个切实可行的编译器,只要在线代码阅读器。Carbon还需求一段时间才会成为C或C++的实用代替品,假如真能够代替的话。
原文链接:http://www.infoworld.com/article/3402023/why-the-c-progra妹妹ing-language-still-rules.html
来源:51CTO技术栈 |
|