为什么永远不会有语言取代CC?
数以百计的CC替代品将会出现,但CC将永远与我们同在!
每个CPU都带有一种称为ISA(指令集架构)汇编的电路语言。ISA程序集是一种硬件语言,由基本数据操作、数学计算和结构化编程(即jmp)的操作组成。但是,为每个计算需求编写汇编代码无疑是耗时的,因此过去的程序员发明了对人类友好的语言和编译器。
计算机科学家先驱DennisRitchie为Unix操作系统的研发需求实现了C语言。在这段时期,整个计算机技术领域都在进行基础的最初建设,所以几乎所有的程序员都使用C语言来构建早期的计算程序,比如编译器、操作系统、数据库软件和网络程序。后来,C扩展了C语言,保留了C语言的性能特点,一门具有更多开发人员特性的新的编程语言诞生了。
在20世纪20年代,程序员实现了CC的备选品,如Go、D、Rust和Carbon,它们具有CC从未提供的各种特性。但这些语言仍然只是CC的备选品,而不是替代品,原因如下:
C和C是基础语言
如果我们追根溯源当今活跃在我们生命中的每一款计算机程序,总会发现它们诞生自C或C。想想你现在在做什么,你可能在谷歌Chrome上读到这篇文章,Chrome开源浏览器(Blink渲染引擎、V8和浏览器应用程序)是用C写的。假如你在GNULinux上运行Chrome,Linux内核是用C写的。MySQL,最流行的关系数据库管理系统,是用CC写的。所有流行的操作系统都为内核函数提供了核心C或CAPI。
即使存在稳定的CC替代方案,许多程序员仍然喜欢用C或C进行系统编程。在大多数情况下,程序员选择C是因为它是与操作系统级API通信的最佳语言。例如,谷歌用C编写了Flutter引擎:
Flutter引擎使用CC应用GTK库函数,截图由作者提供
数十年来,计算领域的大多数核心组件都使用CC作为实现语言,CC语言也长期维持着语言语法的标准。打造CC的替代品就像在所有的建筑工程完工之后改变房子的地基。
C和C完全控制我们所写的内容
在编写源代码时,CC可以自由地处理程序资源。例如,CC允许你直接分配释放用于存储数据元素的物理内存。CC提供了一种使用本机操作系统级线程的方法,而不是像Go那样管理单独的并发运行时。CC没有提供自动内存管理(垃圾回收)特性,因此程序员应该谨慎有效地防止内存泄漏。看看Meta的Folly库源代码是如何实现手动内存管理策略的:
Meta的Folly库使用了手动内存管理功能
自动内存管理和内存处理的限制无疑是使语言变得现代、高效和更抽象的好方法,但是这些特性会在语言运行时产生性能开销,并降低程序员的自由度。
C和C不限制内存访问,提供手动的内存管理操作,让程序员按照自己的意愿控制程序,从而把自由给了程序员。当你用CC编写程序时,你的源代码将有效地执行你指示的操作,就是这样。
C和C确实又快又高效
一个特定程序的效率取决于两个主要因素:程序员使用的算法的时间复杂度和二进制程序的效率。毫无疑问,我们可以控制算法的复杂性,因为我们可以通过更新源代码来改变它们。另一方面,二进制文件是编译器生成的,因此我们无法轻易从这方面提高效率。
但是,我们可以选择一个能够生成快速有效的二进制文件的编译器。GNU编译器生成特定于平台的二进制文件,而不嵌入专用的运行时环境。C编程执行模型使用crt0汇编指令段中定义的最小启动代码。看看下面的例子,Linux上的crt0部分:
在C语言中main函数之前执行的启动代码
C无疑是一门复杂的语言,但它不像Python和Golang那样提供更高的抽象。此外,它还为你提供了一种使用首选标准语言版本(即C14)进行编译的方法。因此,自现代C特性使C开发复杂化以来,你可以只使用C中最小的特性。C已经有30多年的历史了,并且从早期计算时代开始就对其性能进行了优化。
C和C是学术友好型语言
程序员编程通常始于职业生涯的不同阶段。一些程序员在他们上学的时候就使用第一台计算机设备学习编程。然而,大多数程序员都是在大学期间提高他们的编程技能的。幸运的是,几乎所有的大学都是为了让学生有机会学习计算机程序如何与硬件组件一起工作而开始教授了C语言编程。我写了以下文章来进一步解释计算机程序是如何与硬件连接的:
编写优化代码前需要知道的5件事
这些事实有助于您以优化的性能给硬件和程序员留下深刻印象
后来,大多数大学教授C的数据结构和算法基础知识,而不使用C的复杂部分。大学生通常在学习了与算法相关的课程后,就会进入竞争激烈的编程领域。大多数有竞争力的程序员都喜欢C,因为它速度快,内置的最优数据结构可用性高,语法少。
Rust无疑是一种很好的语言,具有内存安全、高性能和内置特性,但是Rust语法对于第一次编写代码的开发人员并不友好。对于工业用途来说,如果你的团队希望获得类似C语言的最小的高效代码和类似python的开发环境,Go是一种很好的语言。但是,对于学术用途来说,Go的抽象太过简单,并且不能与传统的伪代码保持一致,所以学术讲师永远不会用Go来替代CC。
下面的文章解释了为什么每个程序员都应该用C语言开始编程:
为什么每个开发人员都应该使用C语言开始编程
你可以从任何一种语言开始编程但是从C开始有更多的好处!
现代替代方案仍然需要C,它们专注于不同的目标
如前所述,所有POSIX操作系统和非POSIX操作系统(即Windows)都提供了一个C库来处理内核操作,因此从CC调用内核特性很容易,因为我们不需要编写特定于语言的绑定或第三方包装器。一些操作系统甚至预先包含GNUCC编译器和调试器来促进CC的开发。如果我们使用Rust和Go,需要特定于语言的第三方绑定来与操作系统API通信。现代替代语言仍然提供了调用C代码的方法。例如,Go提供Cgo特性来调用C代码。
几乎所有的CC替代方案都力求用与C截然不同的语言语法来提供缺少的C特性。
如果程序员在寻找CC的替代方案,他们通常会期望一个平稳且耗时较少的迁移过程。
此外,他们也不期望学习一门新语言来为他们不喜欢的CC特性找到解决方案。
程序员们针对低层次编程用例设计和改进了C语言,没有一种现代语言是完全针对C语言的目标而创建的。C使C语言更具有未来感,并自低级编程阶段进行了提升。Rust、Go、D和Carbon都是CC的备选品而不是替代品,这些备选品都有自己的未来目标。
下面的文章解释了为什么每个程序员在他们的职业生涯中都需要学习C语言:
为什么每个程序员都应该在他们的职业生涯中学习C
掌握C并不是一件容易的事,但是一旦你做到了,你将获得无价收益
结语
以前的程序员在CC进化时期书写了我们的计算机历史。他们用C和C构建操作系统内核、编程语言、数据库系统、移动操作系统和网络软件。多亏了CC,现在几乎所有的现代Web服务都能工作。例如,最流行的Web服务器软件,如ApacheHTTP和Nginx,就是使用CC作为实现语言。以前的程序员几乎用CC编写了所有流行的内部网络浏览器和网络软件组件。Web开发人员喜欢选择Java和Node。js用于Web服务,但Java和Node。js都是因CC而来的。
一些程序员认为像Rust、Go、D和Carbon这样的流行语言可以替代CC。同时,一些程序员考虑使用这些语言作为CC的备选品,认为它们在未来可能取代CC。这些现代语言是为特定的目的和需求而设计的而不是取代CC。
微软创建了TypeScript,但我们仍然使用JavaScript。Jetbrains创造了Kotlin,但我们仍然使用Java。数以百计的CC备选品出现了,但程序员仍将使用CC,因为重写面向CC的计算机历史是不现实的。这并不意味着C和C是最好的语言在某些方面(例如复杂性、内存安全性等),备选语言可能比CC更好,但它们无法进入CC的领域,因为以前的程序员用C和C编写了整个现代计算机历史。
感谢你的阅读。
原文链接:
https:levelup。gitconnected。comwhymodernalternativelanguagesneverreplacecccbf0afc5f1dc
译者介绍:冬雨,小小技术宅一枚,现从事研发过程改进及质量改进方面的工作,关注研发、测试、软件工程、敏捷、DevOps、云计算、人工智能等领域,非常乐意将国外新鲜的IT资讯和深度技术文章翻译分享给大家,已翻译出版《深入敏捷测试》、《持续交付实战》。