没有永远的王者…Zig替代C,将成定局!

news2024/7/4 6:27:45

新语言的出现,真的能威胁到老牌语言吗?或许,真的没有永远的王者。就像最近春风得意的Mojo,LLVM之父Chris Lattner称其不会威胁到 Python,但会让C++等语言感到恐惧。

新语言层出不穷之时,旧语言的中年危机就会愈发凸显。但像C++、C好似一直稳坐钓鱼台,“一直被唱衰,但从未被打倒”。

但总会有新的挑战者,比如Zig、Go跃跃欲试,试图取代这个编程老祖。而且许多新语言的使用者也会幡然相信:C,或许真的需要进化了!

本篇文章具体解释了目前在所有C的替代品中,Zig为什么是最好的,以及Zig本身已经有了可行的替代C的计划,诸君不妨一探究竟。

目录

1、C那么牛,为什么会有许多替代品?

2、为什么Zig只能替代C,而不是C++

3、Zig 如何成为最好的 C 替代品?

4、Zig语言和工具链的突出特点

5、具有长期计划的替代方案

6、结语

7、拓展延伸

1、C那么牛,为什么会有许多替代品?

诚然,C傲视群雄的资本还是有目共睹的,毕竟这门编程老祖之所以如此霸气,是因为它是每个现代软件系统组件的创造者。开发人员用C语言制作web服务器、数据库、操作系统、框架、编程语言、云组件和许多软件组件。尽管许多编程语言都说它们可以“取代”C语言,但这是不可能的,因为整个计算机历史都是用C语言创造的。

但资格老的语言总是不太能跟上“现代开发”的脚步。C++语言通过实现面向对象的概念、生产语言特性和通过保持C语言的性能优先设计的标准库API,为现代开发人员改进了C语言语法。也有一些C替代方案可以解决每个C开发人员面临的问题。Zig、D、Go和Odin是流行的C语言替代品。

Zig展示了一个充满希望的未来,有一个内置的包管理器、一个构建系统、类似C但更好的语言语法、一个功能齐全的标准库和一个不断增长的社区。像Uber这样的大企业也开始使用Zig工具链进行交叉编译。此外,一些软件公司开始使用基于Zig的代码存储库开展业务。我将用这个故事解释Zig如何成为C语言的最佳选择。

2、为什么Zig只能替代C,而不是C++

系统编程通常指的是开发更接近计算机硬件或操作系统层的东西。系统编程通常实现可以运行其他软件系统的软件模块。编写操作系统、应用程序框架和嵌入式系统是系统编程的好例子。系统程序员主要有两种语言类型选择:

  • C 及其替代方案:使用小型的高性能语言,如传统的 C、Go、Zig 或 Nim。
  • C++及其替代方案:使用有点复杂、高性能的语言,如传统的C++、Rust、Carbon 或 Cppfront。

Zig属于第一种语言。它是一种小型的、类似C语言的高性能语言,没有专用的运行时(没有内置的垃圾收集器)。Zig试图通过解决C开发人员面临的问题来成为“更好的C语言”,而Rust试图成为“更好的C++”语言。

3、Zig 如何成为最好的 C 替代品?

C语言现在有一个标准规范,也有了几个实现。例如,你可以在GNU/Linux系统上使用GNU C编译器,在macOS上使用Apple Clang,在Windows上使用MSVC。C也有多个标准库实现,如libc、Microsoft C运行库、BSD libc、musl、Bionic等。

一个编译器实现和一个基本的标准库是不足以高效地构建软件系统的——C程序员需要使用构建系统、包管理器、测试运行器等。对于这些工具,他们要么必须使用现有的第三方工具,要么编写自己的工具(如BuildZri构建系统)。

Zig提供了一个内置的构建系统、包管理器和测试运行器。Zig通过为C开发人员经常面临的问题提供解决方案来与C竞争。例如,Zig的官方编译器支持交叉编译,并且内置的测试运行器可以执行放在源代码本身内部的测试用例。Zig的语言设计倾向于通过维护类似C的硬件友好设计来提供更高效的开发人员友好特性。Zig是硬件友好的,但它是最小的、安全的、语法上类似Rust的和现代的。因此,开发人员可以比C更高效地使用它。

看看下面这些简单的Zig代码片段,来理解Zig未来的、硬件友好的语言概念:

const std = @import("std");

pub fn main() void {
    var nums = [_]u8{1, 2, 4, 5, 120};
    var x: usize = 3;
    var nums_seg = nums[1..x];

    std.debug.print("{any}\n", .{nums_seg});        // { 2, 4 }
    std.debug.print("{}\n", .{@TypeOf(nums_seg)});  // []u8 (slice)
}

Zig不像C语言那样使用预处理器或宏系统来处理导入——它使用类似nodejs的模块导入语法和内置的@import函数。这里,我们使用u8基本类型创建了一个无符号字节大小的整数数组。然后,我们使用Zig切片概念从数组创建一个切片。正如你所看到的,Zig提供了一个类似于C的硬件友好的原子类型系统,但是它使用更好的标准化、自解释的命名来改进它们,而不像c中那样使用char、short、long等。

C通常要求程序员自己保护他们的程序,但是Zig实现了严格的内存安全特性。尝试将256添加到上面的字节数组。如果你用C语言做这个实验,程序会静默地存储一个不正确的值。在Zig中,你会得到一个编译错误,因为255是无符号字节类型可以表示的最大值:        

Zig 编译器显示的整数溢出检查,作者的屏幕截图

Zig 编译器显示的整数溢出检查,作者的屏幕截图

Zig的内置测试运行器和单元测试API允许你在源文件中编写测试:

const std = @import("std");

fn add(a: i8, b: i8) i8 {
    return a + b;
}

test "add returns the summation" {
    try std.testing.expectEqual(add(10, 5), 15);
}

我从未在其他流行语言中见过像Zig这样高效的C-互操作。大多数语言使用FFI(外部函数接口)来实现C-互操作,但是Zig允许你调用C,甚至不需要在Zig范围内定义C函数。当你导入C头文件时,它会自动创建结构类型:

const std = @import("std");
const c = @cImport({
    @cInclude("stdio.h");
});

pub fn main() void {
    var a: u8 = 10;
    var char_count = c.printf("a = %d\n", a); // a = 10

    std.debug.print("{}\n", .{@TypeOf(char_count)}); // c_int
    std.debug.print("{}\n", .{char_count}); // 7
}

如上面的代码片段所示,Zig允许你像调用本地Zig函数一样调用C函数,但是使用自定义前缀(经常使用C)。

Zig没有提供一个内置的字符串类型,但是它允许你通过一个类似C语言的、低级的、基于字符数组的字符串处理概念和有用的快捷方式来处理字符串:

std.debug.print("{s}\n", .{"Zig" ++ "Lang"});   // ZigLang (concatenation)
std.debug.print("{s}\n", .{"Zig" ** 5});   // ZigZigZigZigZig (repetition)
std.debug.print("{}\n", .{@TypeOf("string")});   // *const [6:0]u8 (a pointer to an unsigned byte array)

Zig语言更接近硬件层,但它实现了各种快捷方式和现代语言概念(即,切片、内置函数、循环简写等),为系统编程提供了一种高效的语言。其功能齐全的模块化标准库帮助Zig超越了系统编程。它为你提供了你在通用编程语言中寻求的控制结构、数据结构和基本算法,这也非常适合系统编程。

Zig工具链的特性,如交叉编译和构建系统API,激励程序员在现代系统编程中选择Zig而不是C!对于现有的C代码库,Zig工具链提供了一个可替换的C/ C++编译器和C互操作,因此程序员可以将传统的C代码库增量地迁移到现代的Zig。

4、Zig语言和工具链的突出特点

我们讨论了一些突出的Zig语言/工具链事实,并了解了它如何以成为“更好的C”语言为目标。许多Zig特性促使我们选择它作为系统编程的C替代方案。

看看以下突出显示的功能总结:

  • Zig提供的不仅仅是一种简单的语言——它是一个功能齐全的工具链,用于开发、测试、构建和发布系统编程项目
  • 它的开发人员友好的CLI可以立即支撑可执行和共享库项目。
  • Zig允许您调用C,但它不依赖于C——libc是Zig二进制文件的可选组件。
  • Zig没有专用的运行时,因为它没有自动垃圾收集器——所以它可以生成快速、轻量级的二进制文件。
  • 尽管Zig通常是一种中级语言,但它提供了现代的通用特性,如异步编程语法、泛型和类型强制转换(自动和手动)。
  • Zig工具链可以通过交叉编译来编译C/ C++,因此您可以在使用Zig语言之前使用它的C/ C++编译器来构建现有的C代码库。
  • 一个编写良好的、模块化的、功能齐全的标准库,包括跨平台的操作系统级api,如Python。
  • 它提供了生产力优先的语言特性,而不会损害硬件友好的系统编程环境,例如,for-in循环、多个切换用例(切换范围)、内联for、切换语句等。
  • 它附带了基于流行的C编程模式的基于枚举的错误处理方法,没有复杂的、容易出错的异常概念。
  • 它允许您通过分配器概念和defer关键字进行手动内存管理。

5、具有长期计划的替代方案

到目前为止,我们已经讨论了如何通过语言和工具链特性使Zig成为更好的C替代方案。性能如何?它的性能比C好吗?

所有没有专用运行时的语言,如C、C++、Rust和Zig,都会从用特定语言编写的每个源代码生成原始汇编,因此系统编程语言的性能取决于二进制文件中汇编代码的质量。系统编程语言的编译器要么使用LLVM优化,要么使用它们自己的成熟优化,因此很难说哪种语言更快——系统编程性能通常取决于程序员编写的算法。

然而,Zig官方文档声称,由于基于llvm的优化和增强的未定义行为,Zig比C运行得更快。此外,Zig还计划通过移除作为依赖项的LLVM来进一步改进Zig。Zig软件基金会(ZSF)积极维护该项目,并接受来自社区的新设计建议。

Zig充满希望的未来使它成为最好的C语言替代品,甚至促使C程序员将他们现有的代码库迁移到现代的Zig。

6、结语

在这个故事中,我们讨论了Zig如何通过提供小型的、开发人员友好的、硬件友好的、高效的、高性能的和安全的语言设计,成为“更好的C”语言。改进的语言设计和工具链帮助Zig在使用C的用例中表现良好,例如构建操作系统、库、云计算模块和框架。此外,其未来的语言功能甚至可以与流行的Go语言竞争!

尽管Zig或任何其他未来的系统编程语言永远不会“取代”C/C++,但随着现代化进程的加速,Zig已经成为有史以来最好的C语言替代品之一。

7、拓展延伸

没有永远的王者,技术总是在优化问题的途中不断被超越。低代码代替传统开发便是如此。

近10年间,甚至连传统企业都开始大面积数字化时,我们发现开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

针对这类问题,低代码技术将某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。极大的提高了程序员的生产效率。

JNPF快速开发平台就是一款典型的低代码自动化产品,采用业内领先的SpringBoot微服务架构、SpringCloud模式,完善了平台的扩增基础,满足了系统快速开发、灵活拓展、无缝集成和高性能应用等综合能力;采用前后端分离模式,前端和后端的开发人员可分工合作负责不同板块,省事又便捷。

前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,满足快速开发;框架集成了表单、报表、图表、大屏等各种常用的Demo方便直接使用;后端框架支持Vue2、Vue3。

附上网址:www.jnpfsoft.com/?csdn ,可体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/948939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TSN协议解读系列 | (1) 帧抢占:br老先生的旅途

帧抢占协议还是怀念以前那个车马很慢,书信很远,带宽顶天也就几十兆的年代。 ▎旧时代的辉煌 1983年秋,IEEE 802.3大学正式成立,这所大学遵循的是严格的标准化管理,数据包们的衣食住行都需要符合学校的规定&#xff0…

SpringBoot + layui 框架实现一周免登陆功能

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

便携式明渠流量计工作原理

便携式明渠流量计工作原理是什么? 简单来说便携式明渠流量计是一种用于测量明渠水流量的仪器。它的工作原理基于流速-水位关系,通过测量水流速度和水位差来计算明渠的流量。 具体原理如下: 1.测量水流速度:通常使用悬挂在水中的水…

Kubernetes快速进阶与实战:构建可靠的容器化应用平台

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 1. 什么是Kubernetes&am…

企业面临的IP风险,如何应对?

IP风险画像为企业或组织在知识产权领域面临的潜在风险和威胁的综合概览。通过对相关知识产权的保护和管理,企业可以预测和应对潜在的法律、商业和声誉风险。 IP数据云帮助企业更好地了解和应对知识产权方面的风险。并提供了关于当前全球知识产权环境的重要信息&…

Yolov8原理详细解析!一文看懂

引言 Yolo(You Only Look Once)是一种one-stage目标检测算法,即仅需要 “看” 一次就可以识别出图片中物体的class类别和边界框。Yolov8是Ultralytics公司最新推出的Yolo系列目标检测算法,可以用于图像分类、物体检测和实例分割等任务。 根据官方描述&…

linux添加sht3x温湿度传感器驱动记录

最近拿到一块imx6ull板子,上面有一颗温湿度传感器sht30,需要读取其数值。本人能力有限,自己写驱动还有一点困难,好在 linux内核里自带了很多器件的驱动,只需要找到相关的驱动文件根据要求修改一下设备树、添加进内核里编译就可以。…

【ES】Elasticsearch 常见的简单查询

查看es中有哪些索引 请求方式:GET 请求地址:http://localhost:9200 /_cat/indices?v 参数:无 结果: 查看索引全部数据 请求方式:GET 请求地址:http://localhost:9200/index-2023-08/_search 参数&a…

VUE之jspreadsheet电子excel表格实时动态高度设置

问题:excel电子表格在不同屏幕大小下横向滚动条会被遮挡 排查原因:由于excel高度固定导致 解决方法:设计页面较多,所以封装公共方法 步骤: 1.使用混入封装动态设置excel高度方法: const mixinJexcel …

MySQL行格式 又称 记录格式

行格式 ROW_formate compact 行格式dynamic 行格式 默认compress 行格式 行格式定义 创建表同时指定行格式 create table 表明 ( 列的信息) row_formate行格式名称 修改行格式 alter table 表明 ROW_FORMATE 行格式名称 查看mysql8.0 默认行格式 select innodb_default_row_…

HTTP状态码504(Gateway Timeout)报错原因分析和解决办法

文章目录 504报错原因分析一、用户角度1. 代理服务器问题2. 网络问题 二、网站管理员角度1. 服务器负载过重2. 网关配置问题3. 目标服务器响应慢4. IIS/nginx/apache服务关闭5. 维护或故障6. 数据库的慢处理也会导致504 用户角度可以采取哪些措施解决504错误1. 刷新页面2. 检查…

Viobot定位用于导航

注:此教程以轮式机器人作为一个样例,具体的应用还需要用户自己去做更深入的开发。当然,着并不是唯一的方法,有更好的方法也欢迎大家讲一下自己的思路,有什么说错的地方也欢迎大家批评指正。 路径规划部分我们选用轮式机…

什么是量化交易接口?(股票下单接口)特点(一)

股市领域里的量化交易接口是一种用于与金融市场进行交互的编程接口,它允许开发者通过计算机程序自动执行交易策略。量化交易接口通常提供以下功能: 1. 实时市场数据获取:量化交易接口通常可以提供实时的市场行情数据,包括股票、期…

el-upload 上传附件

案例: <template><div><el-drawertitle"附件信息"v-model"drawer"direction"rtl":before-close"handleClose"size"35%":close-on-click-modal"false":close-on-press-escape"false">…

2. 配置版本

2.1 安装 Python 版本 ① 首先打开 Anaconda 的 Prompt 终端&#xff0c;输入 jupyter kernelspec list&#xff0c;查看已经安装的 python 版本。如下图所示&#xff0c;只有 Anaconda 自带的 python3。 ② 输入 conda create --name py3.6.3 python3.6.3 命令&#xff0c;输…

rman备份数据文件和归档指定不同的filesperset

客户说带库上抓小文件会导致带库紧张。 大部分的备份软件都会用filesperset参数来做备份&#xff0c;这样恢复速度快&#xff0c;而且也有利于带库重复删除。 客户用的plus archivelog的形式&#xff0c;一条命令的做全备&#xff0c;现在就有filesperset不区分dbf和arc的情况…

Java之API详解之Objects类的详细解析

5 Objects类 5.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于Objects类的定义如下&#xff1a; Objects类所在包是在java.util包下&#xff0c;因此在使用的时候需要进行导包。并且Objects类是被final修饰的&#xff0c;因此该类不能被继…

跨境电商独立站如何实现全球开店,获得更多流量?

对于独立站卖家来说&#xff0c;针对一个国家搭建一个站点、运营&#xff0c;就已经要花上不少力气了。更别说想要在多个市场售卖了&#xff0c;每个国家不同的货币、语言、定价、付款方式等等就已经够让人头大。 研究显示&#xff0c;40%的人不会从其他语言的网站上购买产品。…

Windows系统配置jar包自启动

目录 一、下载 WinSW.NET4.exe二、创建windows的目录结构三、编写xml配置文件四、检查环境4.1 是否安装jdk4.2 是否存在.net framework4的服务 五、安装 一、下载 WinSW.NET4.exe https://github.com/winsw/winsw/releases 下载完毕改名为jar名&#xff0c;也就是 项目.exe64位…

QT使用QImage做图片切割

#include "mainwindow.h" #include "ui_mainwindow.h" #include <QFileDialog> #include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);// 选择本地图片文件QString …