【编者按】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编程、科学与写作。

作者 | 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 翻译,转载请注明来源出处。

更多精彩推荐
☞Google回应全球宕机:磁盘满了;摩拜App昨晚正式停止服务;Docker Desktop 3.0.0发布|极客头条☞开源将走向何方?☞喜欢 TypeScript 的人,一点都不比 Python 少☞为什么苹果 M1 芯片如此之快?☞湘苗培优|从入门到精通☞百密一疏,防不胜防,细数那些大型数据库建设过程中绕不开的坑
☞被微软称为 “世界的电脑” ,Azure 到底有多牛?☞JavaScript:对象都是这样生成的!☞程序员才懂的“凡尔赛语录”
点分享点点赞点在看

C语言能够被替换吗?相关推荐

  1. 易语言解析网页内容替换换行符问题

    易语言解析网页内容替换换行符,直接用字符数来替换 分割文本 (局_结果, 字符 (10), )

  2. c语言作业 字符串替换,C语言字符串替换。解决方法

    当前位置:我的异常网» C语言 » C语言字符串替换.解决方法 C语言字符串替换.解决方法 www.myexceptions.net  网友分享于:2015-04-14  浏览:0次 C语言字符串替换 ...

  3. 易语言教程数据库替换

    替换 ()本命令替换当前数据库中的记录数据,当前记录指针保持不变.成功返回真,失败返回假.本命令为初级命令.命令参数表中最后一个参数可以被重复添加. 参数<1>的名称为"替换范围 ...

  4. 易语言 文本_替换_正则

    正文 在文本_替换_正则 - 易语言助手中给出了文本_替换_正则的实现,这里我完善一下,额外增加了是否多行模式的参数. .版本 2 .支持库 RegEx.子程序 文本_替换_正则_多行模式, 文本型, ...

  5. linux替换指定字符串函数,C语言实现字符串替换函数

    C语言中没有提供字符串替换函数,网上能找到的类似函数也只是能替换一个,不能替换全部,工作中却常常要用到这个功能,故实现一个函数.该函数所使用到的相关函数均是自己实现,没有调用库函数. 相关代码如下: ...

  6. c语言ctype中替换查找字符,c – std :: ctype是否总是按“C”语言环境对字符进行分类?...

    该标准需要默认构造的std :: ctype< char>通过§22.4.1.3.3匹配最小"C"语言环境[facet.ctype.char.statics] / 1 ...

  7. c语言中宏替换时的顺序

    http://hi.baidu.com/feichideche/item/f138221d97ada1fc746a84e2 宏替换顺序,这是以前在论坛里看到的一个问题,因此整理下来,供自己学习和参考: ...

  8. c语言宏定义替换字符串,C语言中,宏替换的替换规则

    匿名用户 1级 2011-10-25 回答 简单来说:宏定义又称为宏代换.宏替换,简称"宏".是C提供的三种预处理功能的其中一种. 复杂的请看下面,讲的很全.下面的带参宏定义,多行 ...

  9. 替换单词c语言程序,用c语言完成单词替换

    匿名用户 1级 2014-05-21 回答 按照自己的理解写了一段代码,请根据自己需要进行修改. *查找单词有空格或非字母时给出警告 *替换单词有空格或非字母时给出警告 *语句中标点可以同单词没有空格 ...

最新文章

  1. ajax重复被调用,重复jQuery ajax调用
  2. DbgPrint/KdPrint输出格式控制
  3. 使用手势,让键盘在点击空白处消失
  4. c语言课设报告河海大学,2020河海大学计算机学硕838经验贴
  5. DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...
  6. JPA基本注解的使用
  7. 实验报告:统计字符串中子字符串出现的次数
  8. web服务器去掉域名www的301重定向设置方法
  9. 遗传算法求解多元函数极值点-C++实现
  10. ArcGis 地理配准注意事项
  11. 软考网络工程师备考建议【经验教训】
  12. 李群、李代数只求理解不求数学推导
  13. 论文的参考文献的英文间隔太大的解决方法
  14. IOS 公司开发者账号申请详细教程-13810208661
  15. YOLOv5+BiSeNet——同时进行目标检测和语义分割
  16. 数据库系统实现 大学生宿舍管理系统
  17. ORBSLAM源码理论分析2—单目初始化
  18. 了解和分析iOS Crash Report
  19. ​如何用大数据软件确定宠物用品店铺选址​
  20. state thread协程库解析

热门文章

  1. Python:print用法大全
  2. @Column(s) not allowed on a @ManyToOne property: com.strive.entity.Module.parent
  3. vue element new vue const
  4. 36数字在排序数组中出现的次数
  5. MySQL配置文件简单解析
  6. python3--匿名函数
  7. 深度学习模型提升模型效果的常见方法
  8. [VSCode] Ubuntu 自动添加了 vscode 源
  9. Spyder远程连接矩池云
  10. 公钥 私钥_公钥 私钥 签名 验签 说的啥?