众所周知,c 是一种广泛非常使用的语言,从操作系统内核到加密算法的编写,到处都在使用 c。如今,我们是否应该用另一种语言来替换 c 呢? 尽管c 语言发布于 1972 年,但至今仍是使用最广泛的语言之一,同时按照如今的标准来看,c 语言也存在许多限制和缺陷。
图:2020年 tiobe 编程语言排行榜 有人希望用另一种语言来替换 c 的关键原因也正在于此。用 c/c++ 编写的关键性软件实在太多了,但 c/c++ 中包含大量的“潜规则”。举个例子 openssl 库中的 bug 就源于此。众所周知,c 语言非常不善于处理类似于缓冲溢出的问题。c 语言中的“坑”实在太多了。c 语言没有类型安全,对于热衷于动态语言的人来说,这听起来可能有些奇怪。而 python 或 julia 等动态语言就可以捕捉到错误的类型用法,例如在 if 语句中使用整数的错误。虽然动态语言无法在编译时捕捉到这类问题,但如果它们具有强大的类型系统,那么就可以在运行时捕捉到很多问题。这对于安全性特别重要。在很大程度上,安全漏洞都会引发未定义的行为,而不会正常终止程序。 话说回来,如果 c 语言如此之糟糕,那么为什么还没有被替换掉呢?其中的原因很多。其实在某些地方,它已经被替换了。以前很多用 c 处理的任务如今都改用 java、c#、c++ 以及其他语言了。 因此,我们需要深挖一下究竟还有哪些软件仍然以 c 语言为主:
操作系统内核。例如 linux 等
微控制器
视频编解码器
底层共享库,例如 openssl 等
unix 命令行工具,例如 ls、cat 和 git 等
为什么这些领域仍然由 c 语言主导?因为直到最近,我们也没有更好的替代 c 语言的方案。 上个世纪 90 年代,许多语言(例如 java、c#、vb.net 和 f#)都将重点放在创建垃圾收集上。对于上述领域来说,这些语言都不是好的解决方案。 除此之外,还有其他 80 年代和 90 年代出现的语言,例如 perl、python、ruby 和 javascript 等,它们都不适合这些任务。 当然,我们还有一些其他静态类型的语言,例如 ada、modula-2 等。但是,一般情况下,这些语言都很难与开发人员的技术结合,也很难与已有的 c 语言库配合使用。 还有 d 等其他语言,但是其复杂性与 c++ 差不多,因此对 c 开发人员没有吸引力。而且,最初它也需要垃圾收集,所以可能并不适合上述提到的许多领域。如果你开发的应用程序需要保持很高的帧速率,那肯定不希望启动垃圾收集。
go 和 rust 有一定的可能性
我认为,第一个真正有可能替代 c 和 c++ 的现代编程语言是 go 和 rust。我们看到许多过去用 c 或 c++ 编写的工具如今都改成了用 go 或 rust 编写。比如大量的命令行工具都用这些语言编写出来了。有些人甚至在尝试用rust 编写游戏引擎。
llvm:填补空白
我认为有可能出现 c 语言替代品的一个主要原因是 llvm 的成熟。llvm 意味着生成高性能的代码、支持多平台的难题得到了解决。llvm 为更多人提供了尝试语言开发的机会。 go 和 rust 提供了一些启发,让我们重新思考 c / c++,在这些启发的带动下,再加上 llvm 助阵,很多人都跃跃欲试寻找 c 语言的替代品:
zig:一门开源的编程语言,专为稳定性、可维护性和最优性而设计。
odin:c 语言的替代品,与 go 非常相似。
v 语言:另一个类似于 c 的语言,受到了 go 和 rust 的大量启发。
什么样的语言可以替代 c?
如果一门编程语言想要替代 c,首先必须适合 c 语言占主导地位的领域。并非所有类型的语言都能够满足这一点。我认为能够替代 c 的语言有以下这些共同点:
能够重用现有的 c 库。ada、modula-2 等语言在很大程度上就在这一点上栽了跟头,因为你无法在大型 c 生态系统中有效使用这两种编程语言。
建立在已有的知识和惯例之上。go 语言很容易上手,因为尽管语法有所变化,但 api 和编程的方式与 c 非常相似。
没有垃圾回收,或者采用手动内存管理。在 c语言占主导的领域内,你需要严格控制内存的使用。在这里领域内,垃圾收集派不上用场,这就是 go 无法完全代替 c 的原因。
控制可执行文件的大小。像 c 一样,zig 可以将可执行文件压缩到很小。你无法在嵌入式等领域使用 go 语言,因为这些语言生成的可执行文件都太大。
系统层面的友好。你需要能够操纵位和字节。你需要良好的二进制运算符和指针。在过去的几十年中,许多语言都没有合适的指针。java 为指针带来了各种骂名,好在 go 挽回了一些。
逐步替换 c 代码。能够良好地兼容 c 的可执行文件。
我们深入讨论一下最后一点。如果需要一次性重写整个程序,那么压根没有人会考虑替换掉现有的用 c 语言编写的基础设施。以我的经验来看,从 objective-c 过渡到 swift 之所以如此简单,是因为我可以一次重写一个方法,重新编译,并测试程序。 使用 zig 之类的语言,也可以轻松地做到这一点。
总结
我们应该替换掉 c 的原因有很多,而截止到目前仍未换掉的主要原因在于,其他编程语言的重点都放在了别处,而且我们缺少工具。这不是一个大型组织必须决定做的事情。你需要让大家都来尝试一下。如今在 llvm 的支持下,在 go 的启发下,我们完全可以替换掉 c。 那么,我个人是否认为 c 将来会被替换掉呢?我并没有那么期待。这是一个漫长的过程,我们还没有明确的赢家。大型组织不会采用 zig、odin、v 或其他编程语言,他们都在等待明确的替代方案出现。 说到底,替换掉 c 究竟表示什么意思?时至今日很多金融机构仍在使用 cobol,但我们可以说 cobol 已被取代了,因为今时今日没有新项目会选择 cobol。人们都在尽可能远离 cobol。 同样,大量经过测试的 c 代码也不会被重写。这些代码会一直遗留下去。 但是,终有一天,c 语言会被其他语言所替代,即使是在自己占主导地位的领域中。
用于最高电压等级的硅IGBT和碳化硅MOSFET
比亚迪在新能源汽车领域还有希望吗?
中国联通:通过共建共享建成全球最大的5G SA网络
为什么列存储能够大幅度提高数据的查询性能
国内首款基于硅光OPA的200线纯固态成像级激光雷达
C语言能够被替换吗
智能魔镜的全新应用,秒变智能家庭中控
小米似乎还有一款骁龙855旗舰在研
国产射频前端模组市场潜力大 产业或将迎来整合期
比亚迪60亿年产值铁电池项目将在深圳量产
紫光集团13亿的私募债终究还是违约了
LCD监视器开关电源功率开关调整器FS6M07652RTC特
华为开发“无触摸即可乘坐的电梯” 用于应对冠状病毒
长城汽车集团正式发布旗下新能源汽车独立品牌——欧拉ORA
微软或将简化Windows 10更新过程
长鑫存储取得时钟信号生成技术专利
2011年硅磁传感器销售额预计增长24%
PLC的机械压力机控制系统设计
OSCAR第二次成果发布会在京召开 首个容器产业白皮书及四大开源标准齐发布
MySQL批量插入数据的四种方案(性能测试对比)