C是一种广泛使用的语言,用于对从操作系统内核到加密库的任何内容进行编程。是时候更换了吗?尽管C编程语言早在1972年就发布了,但它仍然是当今使用最广泛的语言之一,并且以当今的标准来看具有许多局限性和缺陷。>编程语言流行度,2020byTIOBE这是C应该被取代的关键原因。太多的关键软件是用C/C++写的,意义重大。一个例子是像OpenSSL这样的库中的错误。众所周知,C不擅长捕捉缓冲区溢出之类的东西。C是一种允许您以多种方式拍摄自己的语言。对于使用动态语言的人来说,这可能听起来很奇怪。然而,这里的问题是类型安全。像Python和Julia这样的动态语言经常错误地使用类型。例如在if语句中使用整数。动态语言在编译时可能没有问题,但如果有强类型系统,在运行时就会出现很多问题。这对于安全性尤为重要。安全漏洞主要归因于导致未定义的行为而不是受控关闭。但是,如果C如此糟糕,为什么还没有被取代呢?原因有很多。在某种程度上,它已被取代。Java、C#、C++和许多其他语言已经接管了以前由C完成的任务。所以这实际上是关于剩下的软件类型,C仍然占据主导地位:操作系统内核。Linux,例如微控制器视频编解码器共享低级库,例如OpenSSLUnix命令行工具,例如ls、cat和git为什么C仍然主导这些领域?因为直到最近,替代方案还不是很好。在1990年代,许多语言(例如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:拼图中缺失的部分我相信,由于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简单地取代。
