0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言能够被替换吗

jf_B3xDfZry 来源:C语言学习联盟 2023-02-10 16:19 次阅读

众所周知,C 是一种广泛非常使用的语言,从操作系统内核到加密算法的编写,到处都在使用 C。如今,我们是否应该用另一种语言来替换 C 呢? 尽管C 语言发布于 1972 年,但至今仍是使用最广泛的语言之一,同时按照如今的标准来看,C 语言也存在许多限制和缺陷。

8cf12db6-a8c9-11ed-bfe3-dac502259ad0.png

图:2020年 TIOBE 编程语言排行榜 有人希望用另一种语言来替换 C 的关键原因也正在于此。用 C/C++ 编写的关键性软件实在太多了,但 C/C++ 中包含大量的“潜规则”。举个例子 OpenSSL 库中的 bug 就源于此。众所周知,C 语言非常不善于处理类似于缓冲溢出的问题。C 语言中的“坑”实在太多了。C 语言没有类型安全,对于热衷于动态语言的人来说,这听起来可能有些奇怪。而 Python 或 Julia 等动态语言就可以捕捉到错误的类型用法,例如在 if 语句中使用整数的错误。虽然动态语言无法在编译时捕捉到这类问题,但如果它们具有强大的类型系统,那么就可以在运行时捕捉到很多问题。这对于安全性特别重要。在很大程度上,安全漏洞都会引发未定义的行为,而不会正常终止程序。 话说回来,如果 C 语言如此之糟糕,那么为什么还没有被替换掉呢?其中的原因很多。其实在某些地方,它已经被替换了。以前很多用 C 处理的任务如今都改用 JavaC#、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 语言会被其他语言所替代,即使是在自己占主导地位的领域中。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7598

    浏览量

    136199
  • Rust
    +关注

    关注

    1

    文章

    228

    浏览量

    6572

原文标题:C语言能够被替换吗?

文章出处:【微信号:C语言学习联盟,微信公众号:C语言学习联盟】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言与Java语言的对比

    C语言和Java语言都是当前编程领域中的重要成员,它们各自具有独特的优势和特点,适用于不同的应用场景。以下将从语法特性、内存管理、跨平台性、性能、应用领域等多个方面对C
    的头像 发表于 10-29 17:31 202次阅读

    ADC3101里边自带的miniDSP能够支持自定义的C语言开发吗?

    想咨询一下, ADC3101里边自带的miniDSP能够支持自定义的C语言开发吗?比如把自己算法灌进去,实现某些算法,比如能做FFT吗。还是说这个DSP只能支持简单的滤波算法。
    发表于 10-14 07:03

    按照这样学习C语言,成为卷王不是梦!

    在计算机编程领域,C语言被誉为一种强大而灵活的编程语言,掌握好C语言不仅可以让你轻松驾驭各种编程任务,还
    的头像 发表于 07-06 08:04 289次阅读
    按照这样学习<b class='flag-5'>C</b><b class='flag-5'>语言</b>,成为卷王不是梦!

    PLC编程语言C语言的区别

    在工业自动化和计算机编程领域中,PLC(可编程逻辑控制器)编程语言C语言各自扮演着重要的角色。尽管两者都是编程语言,但它们在多个方面存在显著的区别。本文将从多个维度深入探讨PLC编程
    的头像 发表于 06-14 17:11 2531次阅读

    请问ADC的数据寄存器DR里的数据会在哪一个阶段替换掉?

    比如,在下一个转换的开始,还是在下一个转换的结束时等替换掉,希望有人能够解答
    发表于 04-07 08:09

    C语言#define的应用

    C/C++ 编程语言中,当程序编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译并执行该程序。预处理器也称为宏预处理器。
    发表于 03-06 11:29 344次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>#define的应用

    c语言,c++,java,python区别

    C语言C++、Java和Python是四种常见的编程语言,各有优点和特点。 C语言
    的头像 发表于 02-05 14:11 2238次阅读

    vb语言c++语言的区别

    VB语言C++语言是两种不同的编程语言,虽然它们都属于高级编程语言,但在设计和用途上有很多区别。下面将详细比较VB
    的头像 发表于 02-01 10:20 2062次阅读

    C语言能够实现单片机功能,为什么还要使用汇编呢?

    C语言能够实现单片机功能,为什么还要使用汇编呢? C语言是一种高级编程语言,它具有跨平台、可移植
    的头像 发表于 01-15 14:59 978次阅读

    C语言-#和##的具体用法

    C语言中,在宏里面使用’#’和’##’有它非常神奇的作用。在宏定义的替换的过程中,#号可以作为一个预处理运算符,把宏参数转换为字符串。##运算符则可以把两个宏参数组合在一起。下面就来说说具体的用法。
    的头像 发表于 12-19 12:54 4946次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>-#和##的具体用法

    嵌入式工程师C语言避坑小技巧

    为了做一个好的设计,本身在软硬件的配合上就需要克服无数的困难和障碍,任何一名 MCU 爱好者都不希望遇到一些因为语言和工具而产生的困扰,我们在 MCU 这种资源受限的平台上进行 C语言的开发虽然
    的头像 发表于 12-13 11:32 479次阅读

    C语言有哪些预处理操作?

    C语言的预处理是在编译之前对源代码进行处理的阶段,它主要由预处理器完成。预处理器是一个独立的程序,它负责对源代码进行一些文本替换和处理,生成经过预处理的代码。以下是C
    的头像 发表于 12-08 15:40 585次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>有哪些预处理操作?

    C语言C++中那些不同的地方

    C语言虽说经常和C++在一起大家提起,但可千万不要以为它们是一个东西。现在我们常用的C语言
    的头像 发表于 12-07 14:29 908次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>和<b class='flag-5'>C</b>++中那些不同的地方

    C语言运行环境是什么

    计算等多个领域。为了能够正确、有效地运行C语言程序,必须具备相应的运行环境。 C语言运行环境包括软件运行环境和硬件运行环境两个方面。下面将从
    的头像 发表于 11-27 16:13 3351次阅读

    如何选择创建c语言c++

    选择创建 C 语言C++ 都需要综合考虑多个因素。在决定使用哪种语言之前,我们需要对这两种语言的特点、优缺点、适用场景、学习成本等进行全
    的头像 发表于 11-27 15:58 570次阅读