7

C语言能够被替换吗?

 3 years ago
source link: https://www.techug.com/post/can-c-be-replaced.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C语言能够被替换吗?

2

【编者按】C 语言真的很老了,而且事实证明他在很多地方都已经不再是最佳选择。为了使工作更加轻松,无数的开发者都想着寻找一种新的语言取代 C 的位置。那么,什么样的语言才能取代 C ?

英文:Do We Need a Replacement for C?

原文链接:https://erik-engheim.medium.com/do-we-need-a-replacement-for-c-3256a8b44814

作者:Erik Engheim,现居挪威,热衷于UX、Julia编程、科学与写作。

img16080322541770514920.jpeg

作者 | Erik Engheim  已获作者翻译授权

译者 | 弯月  责编 | 张文

头图 | CSDN 下载自东方 IC

出品 | CSDN(ID:CSDNnews)

以下为译文:

众所周知,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 的语言有以下这些共同点:

  1. 能够重用现有的 C 库。Ada、Modula-2 等语言在很大程度上就在这一点上栽了跟头,因为你无法在大型 C 生态系统中有效使用这两种编程语言。
  2. 建立在已有的知识和惯例之上。Go 语言很容易上手,因为尽管语法有所变化,但 API 和编程的方式与 C 非常相似。
  3. 没有垃圾回收,或者采用手动内存管理。在 C语言占主导的领域内,你需要严格控制内存的使用。在这里领域内,垃圾收集派不上用场,这就是 Go 无法完全代替 C 的原因。
  4. 控制可执行文件的大小。像 C  一样,Zig 可以将可执行文件压缩到很小。你无法在嵌入式等领域使用 Go 语言,因为这些语言生成的可执行文件都太大。
  5. 系统层面的友好。你需要能够操纵位和字节。你需要良好的二进制运算符和指针。在过去的几十年中,许多语言都没有合适的指针。Java 为指针带来了各种骂名,好在 Go 挽回了一些。
  6. 逐步替换 C 代码。能够良好地兼容 C 的可执行文件。

我们深入讨论一下最后一点。如果需要一次性重写整个程序,那么压根没有人会考虑替换掉现有的用 C 语言编写的基础设施。以我的经验来看,从 Objective-C 过渡到 Swift 之所以如此简单,是因为我可以一次重写一个方法,重新编译,并测试程序。

使用 Zig 之类的语言,也可以轻松地做到这一点。

总结

我们应该替换掉 C 的原因有很多,而截止到目前仍未换掉的主要原因在于,其他编程语言的重点都放在了别处,而且我们缺少工具。这不是一个大型组织必须决定做的事情。你需要让大家都来尝试一下。如今在 LLVM 的支持下,在 Go 的启发下,我们完全可以替换掉 C。

那么,我个人是否认为 C 将来会被替换掉呢?我并没有那么期待。这是一个漫长的过程,我们还没有明确的赢家。大型组织不会采用 Zig、Odin、V 或其他编程语言,他们都在等待明确的替代方案出现。

说到底,替换掉 C 究竟表示什么意思?时至今日很多金融机构仍在使用 Cobol,但我们可以说 Cobol 已被取代了,因为今时今日没有新项目会选择 Cobol。人们都在尽可能远离 Cobol。

同样,大量经过测试的 C 代码也不会被重写。这些代码会一直遗留下去。

但是,终有一天,C 语言会被其他语言所替代,即使是在自己占主导地位的领域中。

原文:https://erik-engheim.medium.com/do-we-need-a-replacement-for-c-3256a8b44814

本文为 CSDN 翻译,转载请注明来源出处。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK