我们需要C的替代品吗?

开发 后端
尽管C编程语言早在1972年就已发布,但它仍是当今使用最广泛的语言之一,并且按照当今的标准存在许多限制和缺陷。

C是一种广泛使用的语言,用于对从OS内核到加密库的任何程序进行编程。现在该更换了吗?

尽管C编程语言早在1972年就已发布,但它仍是当今使用最广泛的语言之一,并且按照当今的标准存在许多限制和缺陷。

 

我们需要C的替代品吗?
> Programming language popularity, 2020 by TIOBE

这就是为什么应该替换C的关键原因。太多关键软件都是用C / C ++编写的,其含义广泛。一个示例是OpenSSL之类的库中的错误。众所周知,C在捕获诸如缓冲区溢出之类的问题时表现很差。C是一种允许您以多种方式射击自己的语言。

热衷于动态语言的人听起来可能很奇怪。但是,这里的问题是类型安全。诸如Python和Julia之类的动态语言通常会错误地使用类型。例如在if语句中使用整数。动态语言在编译时可能不会遇到问题,但是如果它们具有强大的类型系统,那么在运行时会遇到很多问题。这对于安全性尤其重要。安全漏洞在很大程度上归因于导致不确定的行为,而不是受控的关闭。

但是如果C太糟糕了,为什么还没有被替换呢?有很多原因。在某种程度上,它已经被替换了。Java,C#,C ++和许多其他语言已经接管了以前用C完成的任务。

因此,这实际上是关于剩下的那种软件,其中C仍然占主导地位:

  • 操作系统内核。Linux,例如
  • 微控制器
  • 视频编解码器
  • 共享的低级库,例如OpenSSL
  • Unix命令行工具,例如ls,cat和git

为什么C仍然主导着这些领域?因为直到最近的替代方案还不是很好。上世纪90年代,许多语言(例如Java,C#,VB.NET和F#)似乎主要致力于创建垃圾收集托管语言。对于上面列出的示例,不是一个很好的解决方案。

然后在80年代和90年代出现了其他语言,例如Perl,Python,Ruby,JavaScript,它们都不适合这些任务。

当然,一直存在其他静态类型的语言,例如Ada,Modula-2等。但是,这些语言通常并不能满足人们现有的技能要求,也可以轻松地与现有的C库一起使用。

曾经有诸如D之类的语言,但是它具有C ++级别的复杂性,可能对C开发人员没有吸引力。它最初还要求进行垃圾收集,这很可能使其不适用于所提到的许多领域。您不想在尝试保持帧速率时启动垃圾收集器。

Go and Rust 的可能性

我认为对C和C ++的现代化表现出浓厚兴趣的第一个真实迹象是Go和Rust的日益普及。我们看到过去通常使用C或C ++编写的许多典型工具现在都用Go或Rust编写。大量的命令行工具,已经用这两种语言编写。我在这里介绍了其中一些工具。您会看到人们试图用Rust编写游戏引擎。

LLVM:缺少的难题

我相信由于LLVM的成熟,提供替代C语言的可能性很大。LLVM意味着生成高性能代码并针对许多平台的真正复杂的工作已解决。它使更多人可以进行语言开发。

Go和Rust都为如何重新思考C / C ++以及如何利用LLVM和LLVM带来了一些灵感,出现了一些可能的C替代品的家庭手工业:

  • Zig,我已经详细介绍了。
  • Odin,看起来像Go的C替代品。
  • 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将被替换吗?我没有屏住呼吸。这是一个漫长的过程,我们还没有明确的赢家。大型组织不会打算采用Zig,Odin,V或其他任何方式,直到出现明确的替代方案。

替换甚至意味着什么?Cobol仍在进行许多金融交易。但是我认为我们可以说已经取代了Cobol,因为今天没有人会故意为任何新项目选择Cobol。人们将尽可能地尝试远离它。

同样,许多经过良好测试的C代码也不会被重写。它只会流连忘返。但是我们将来可能会达到这样的地步,因为在C传统上占主导地位的领域中,其他语言只是被C所取代。

责任编辑:未丽燕 来源: 今日头条
相关推荐

2022-08-15 09:49:28

K8s云原生

2022-02-08 11:45:03

PiniaVuex前端

2011-04-12 09:13:51

OpenIndianaSolaris替代品

2022-08-02 10:45:29

AppFlowyNotion开源

2013-11-19 14:36:38

UbuntuDebianPCLinuxOS

2012-07-20 09:37:00

Oracle LinuCentOS

2020-02-17 21:35:21

JoplinEvernote开源

2016-09-13 15:50:24

TurtlEvernote开源

2013-01-28 09:25:54

2022-11-28 11:35:33

Kubernetes开源工具

2020-11-17 06:04:59

ZigC语言

2023-07-11 18:36:20

CloudReady开源

2021-10-19 09:00:00

KubeMQKubernetes工具

2020-07-07 09:10:29

VS CodeLinux开源

2023-11-30 08:55:15

LinuxLibreOffic

2018-06-12 16:33:23

GitHub替代品项目

2021-10-14 15:42:53

消息队列KubeMQKafka

2020-06-09 14:29:24

VS Code代码编辑器IDE

2022-12-26 07:40:00

Heroku替代品dynos

2012-10-30 09:30:49

IaaS基础架构即服务IaaS案例
点赞
收藏

51CTO技术栈公众号