当前位置: 首页 > news >正文

身为 Go 程序员,我为啥更喜欢用 Zig?

Zig 是一种比较新的编程语言,于 2016 年首次推出。Zig 社区将其描述为“一种用于维护稳固的、可优化和可重用软件的通用编程语言”。

看似一句简单的描述,却隐藏着远大的抱负。Zig被看作是可与C语言一较高下的编程语言。此外,Zig 也是一个编译器工具链,可以作为现有 C 编译器的替代品。

作为一个使用 Go 的程序员,我发现 Zig 及其工具链提出的主张很有意思。我在研究 Zig 时,发现这两种语言(Zig 和 Go)有一些共同之处。接下来,我将详细介绍作为 Go 程序员,我觉得 Zig 有趣的功能。

1、简单

这两种语言都采用了简单的设计理念,执行过程很顺畅,大大提高了工作效率。Zig 不支持宏、预处理器或运算符重载。

Go 是一种托管内存语言,并且运行时有特别的方法来处理内存的分配 / 释放。但 Zig 始终恪守“无隐藏控制流”的口号,没有自动内存管理,而是提供 API,让程序员通过其标准库手动管理内存。

2、强类型

作为一种为系统编程而设计的语言,Zig围绕其类型系统提供了大量以安全性和C ABI兼容性为中心的特性。虽然我无法充分介绍所有内容,但可以提出一些你可能会感兴趣的亮点:

  • 有符号/无符号整数(预设大小从 8 位到 128 位)
  • 任意大小的有符号/无符号整数(即i77 位 int)
  • 浮点(从 16 位精度到 128 位精度)
  • 切片和数组(即 []u8{ ‘h’, ‘i’, ‘!’}或[4]i32{ 1, 2, 3, 4 })
  • UTF-8 编码的字符串文字,存储为以 null 结尾的字节数组
  • 具有 C ABI 兼容性的功能丰富的结构类型
  • 具有隐式/显式序数值的枚举和对方法的支持
  • 用于存储多种类型选择的值的联合
  • 支持使用向量的并行运算
  • 传统指针和带有切片表达式的多项指针

3、处理错误

Zig 中的错误处理效果非常好。它是 try-catch-exception 语义和 Go 错误值之间的交叉。那么它是如何运行的?

首先,所有 Zig 错误都是必须分配和处理的值(否则将导致编译时错误)。Zig 错误使用error这个关键字声明为一组值:

图片

使用二进制运算符 !,可以将Zig错误值与正常类型的值组合起来,形成可由函数返回的 Union 类型。

例如,下面的函数可以返回类型为 error 或 u32 的值,返回类型为 !u32(或显示为DigitError!u32):

图片

此外,Zig 用一个非常有意思的结构来处理错误。与其他语言中的异常处理类似,Zig 使用 catch 关键字将错误处理代码块附加到函数调用中,如果返回错误值,则该函数调用将被执行,如下所示:

图片

Zig 还支持使用关键字 try 在调用堆栈中传播错误的机制。例如,addAll 的功能是如果返回或继续执行其他操作,下面的函数将返回错误。

图片

最后,Zig 可以使用 if-else-switch 来更精确地过滤和处理错误结果:

图片

4、Zig测试

在 Zig 中,源代码测试是一流的组成部分,在该语言中拥有自己的test关键字。测试的声明方式与顶级函数类似,使用 test 关键字,后跟描述和代码块:

图片

与go test一样,工具链附带了zig test命令,用于在源代码中执行测试:

图片

5、Zig运行

与 go run 类似,Zig 提供了一个更便捷的 zig run 命令,结合了编译和运行 Zig 源代码的步骤:

图片

6、延迟

与Go类似,Zig使用 defer 来简化资源管理,以便在当前执行的范围块结束时执行清理操作,例如释放资源。

图片

7、Comptime

comptime是该语言中另一个有趣的概念,在大多数其他语言中都没有。Zig 没有单独的元语言或宏系统。但Zig 提供了一种巧妙的解决方案,使用comptime(或编译时)的概念将其源代码的可编程性扩展到编译阶段。

通过comptime,Zig 可以在编译时实现多种功能:

  • 在编译时解析的变量和表达式
  • 基于编译时值运行的函数
  • comptime 编译期间选择性执行的代码块
  • 编译时执行的元编程

8、通用性

当然,Zig 编译时可编程性带来结果是泛型类型和数据结构的实现。在 Zig 中,comptime 提供对可作为常规数据值存储和传递的类型值的访问。

这使得创建采用类型参数的函数成为可能,如下所示:

图片

由于 comptime 类型值被视为任何类型,因此 Zig 允许使用它们构建通用数据结构。例如,MakeList 使用 comptime 类型信息返回在编译时构建的结构:

图片

9、Zig可作为C(交叉)编译器

Zig 工具链具有全功能 C 编译器,这意味着你可以使用 Zig 来替代当前的 C 编译器工具链。给出以下 hello.c 源代码文件:

图片

Zig 可以使用以下命令将源代码编译为可执行二进制文件:

图片

10、Zig 和 C 交叉编译

Zig 可以轻松交叉编译代码(无论是 C 还是 Zig),并且汇集了所有必要的工具和库,以确保你可以针对其支持的任何架构。

例如,Zig 可以将之前的 C 源代码交叉编译为针对 linux 的静态二进制文件(使用 musl):

11、Zig 和 CGo 交叉编译

事实证明,Zig 的C交叉编译支持对于交叉编译支持Go的Go源代码非常有用。例如,在 add.c 中添加以下 C 函数:

图片

我们用Go来调用它:

图片

假设在 MacOS 构建代码,我们可以通过命令 zig cc 来使用 Zig 的 C 编译器,将 C 代码交叉编译为链接到 Go 对象文件的目标文件,从而为在 x86 架构上运行的 Linux 构建静态二进制文件:

图片

要实现此功能,你只需在工作站上安装 Zig 工具链,无需其他辅助工具。

虽然这看起来没什么大不了的,但请记住,交叉编译支持 CGo 的静态二进制文件会更复杂(在不使用 Zig 的情况下)。通常需要几个步骤来准备构建环境,其中包含交叉编译目标平台所需的软件包(请参阅此处)。

结论

Zig 够简单、够强大、够安全又兼备 C 兼容性,备受开发人员青睐 。无论你是在为新项目寻找语言,还是只是想扩展编程能力,Zig 都是值得探索的很棒的选择。

相关文章:

身为 Go 程序员,我为啥更喜欢用 Zig?

Zig 是一种比较新的编程语言,于 2016 年首次推出。Zig 社区将其描述为“一种用于维护稳固的、可优化和可重用软件的通用编程语言”。 看似一句简单的描述,却隐藏着远大的抱负。Zig被看作是可与C语言一较高下的编程语言。此外,Zig 也是一个编…...

Amazon CodeWhisperer 使用体验

文章作者:STRIVE Amazon CodeWhisperer 是最新的代码生成工具,支持多种编程语言,如 java,js,Python 等,能减少开发人员手敲代码时间,提升工作效率。PS:本人是一名 CodeWhisperer 业余爱好者 亚马逊云科技开发者社区为开…...

公众号留言功能怎么申请?

为什么公众号没有留言功能?2018年2月12日,TX新规出台:根据相关规定和平台规则要求,我们暂时调整留言功能开放规则,后续新注册帐号无留言功能。这就意味着2018年2月12日号之后注册的公众号不论个人主体还是组织主体&…...

探索三种生成模型:基于DDPMs、NCSNs和SDEs方法的Diffusion

探索三种生成模型:基于DDPMs、NCSNs和SDEs方法的Diffusion 去噪扩散概率模型(DDPMs)正向过程反向过程 噪声条件得分网络(NCSNs)正向过程初始化训练 NCSNs生成样本 反向过程 随机微分方程(SDEs)原…...

Linux随记(七)

一、欧拉bclinux 21.10安装zabbix-5.0.37.tar.gz (zbx-客户端) #系统环境: BigCloud Enterprise Linux For Euler 21.10 LTS #软件信息: zabbix-5.0.37.tar.gz , pcre-devel-8.44-2.oe1.x86_64.rpm , inst…...

RESTful API,以及如何使用它构建 web 应用程序。

RESTful API是一种基于REST(Representational State Transfer)架构风格的API(Application Programming Interface),它采用HTTP协议中的GET、POST、PUT、DELETE等方法,对资源进行操作。RESTful API的核心思想…...

【华为OD题库-075】拼接URL-Java

题目 题目描述: 给定一个url前缀和url后缀,通过,分割。需要将其连接为一个完整的url。 如果前缀结尾和后缀开头都没有/,需要自动补上/连接符 如果前缀结尾和后缀开头都为/,需要自动去重 约束:不用考虑前后缀URL不合法情况 输入描述: url前缀(一个长度小于…...

【Unity动画】为一个动画片段添加事件Events

动画不管播放到那一帧,我们都可以在这里“埋伏”一个事件(调用一个函数并且给函数传递一个参数,参数在外部设置,甚至传递一个物体)! 嗨,亲爱的Unity小伙伴们!你是否曾想过为你的动画…...

CoDeF视频处理——视频风格转化部署使用与源码解析

一、算法简介与功能 CoDef是作为一种新型的视频表示形式,它包括一个规范内容场,聚合整个视频中的静态内容,以及一个时间变形场,记录了从规范图像(即从规范内容场渲染而成)到每个单独帧的变换过程。针对目标…...

ubuntu server 20.04 备份和恢复 系统 LTS

ubuntu server 20.04 备份和恢复 系统 LTS tar命令系统备份与恢复(还原or新装) 备份系统 cd / su root tar cvpzf backup.tgz --exclude/tmp --exclude/run --exclude/dev --exclude/snap --exclude/proc --exclude/lostfound --exclude/backup.tgz …...

NFC对物联网开发的影响及用途

当谈到NFC对物联网的影响时,不得不提它的几个重要的优势,可能在未来几年影响着物联网的发展方向。 全球智能手机的普及是其中一个重要因素:市面上已有数十亿部支持NFC的智能手机,专家们相信这个数字还会大幅增长。智能手机用户已…...

企业级SQL开发:如何审核发布到生产环境的SQL性能

自从上世纪 70 年代数据库开始普及以来,DBA 们就不停地遭遇各种各样的数据库管理难题,其中最为显著的,可能就是日常的开发任务中,研发人员们对于核心库进行变更带来的一系列风险。由于针对数据库的数据变更是一项非常常见的任务&a…...

linux 手动安装移植 haveged,解决随机数初始化慢的问题

文章目录 1、问题描述2、安装 haveged3、问题解决4、将安装好的文件跟库移植到开发板下 Haveged是一个软件工具,用于生成高质量的熵(Entropy)源,以供计算机系统使用。熵在计算机科学中指的是一种随机性或不可预测性的度量&#xf…...

如何使用llm 制作多模态

首先将任何非字符的序列信息使用特殊n个token 编码。 具体编码方法以图像为例子说明: 将固定尺寸图像如256256 的图像分割为1616 的子图像块。 将已知的所有图像数据都分割后进行str将其看做是一个长的字符,而后去重后方式一个词表。 使用特殊1024 个tok…...

k8s(二):Pod

Pod pod 是K8s中最小的可部署单元,用于容纳一个或多个容器。Pod为容器提供了一个共享的环境,包括网络命名空间、存储卷和IP地址。 pod的阶段(phase) Pending: Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包…...

Python 字典详解(dict)

文章目录 1 概述1.1 性质 2 常用方法2.1 以列表返回所有键:keys()2.2 以列表返回所有值:values()2.3 以列表返回所有键值对:items()2.4 返回键对应的值:get()2.5 添加键值对:setdefault()2.6 修改键值对:di…...

IPoIB在国产并行系统上的实现与优化

目录 1 国产异构众核系统 2 相关工作 3 IPoIB在国产并行系统上的实现 3.1 IPoIB协议原理...

东南大学与OpenHarmony携手共建开源生态,技术俱乐部揭牌成立并迎来TSC专家进校园

11月25日,OpenAtom OpenHarmony(以下简称“OpenHarmony”)项目群技术指导委员会(以下简称“TSC”)与东南大学携手,于东南大学九龙湖校区金智楼一楼报告厅举办了“东南大学OpenHarmony技术俱乐部成立仪式暨OpenHarmony TSC专家进校园”活动。此次盛会标志着OpenHarmony开源社区和…...

NPU、CPU、GPU算力及算力计算方式

NVIDIA在9月20日发布的NVIDIA DRIVE Thor 新一代集中式车载计算平台,可在单个安全、可靠的系统上运行高级驾驶员辅助应用和车载信息娱乐应用。提供 2000 万亿次浮点运算性能(2000 万亿次8位浮点运算)。NVIDIA当代产品是Orin,算力是…...

华清远见嵌入式学习——C++——作业6

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;class Animal { public:virtual void perform() 0;};class Lion:public Animal { private:string foods;string feature; public:Lion(){}Lion(string foods,string feature):foods(foo…...

Python MCP服务部署成本飙升?5个被90%团队忽略的隐性开销及实时监控方案

第一章&#xff1a;Python MCP服务部署成本飙升的真相与警示Python MCP&#xff08;Model Control Plane&#xff09;服务在微服务架构中承担模型注册、版本调度、A/B测试路由等关键职责。近期大量团队反馈其云上部署成本在两周内激增300%以上&#xff0c;远超业务增长曲线。深…...

7个革新性的REFramework应用技巧:游戏开发者的效率提升指南

7个革新性的REFramework应用技巧&#xff1a;游戏开发者的效率提升指南 【免费下载链接】REFramework REFramework 是 RE 引擎游戏的 mod 框架、脚本平台和工具集&#xff0c;能安装各类 mod&#xff0c;修复游戏崩溃、卡顿等问题&#xff0c;还有开发者工具&#xff0c;让游戏…...

终极指南:3步在3DS上原生运行GBA游戏,告别模拟器延迟!

终极指南&#xff1a;3步在3DS上原生运行GBA游戏&#xff0c;告别模拟器延迟&#xff01; 【免费下载链接】open_agb_firm open_agb_firm is a bare metal app for running GBA homebrew/games using the 3DS builtin GBA hardware. 项目地址: https://gitcode.com/gh_mirror…...

如何快速掌握视频特效:StreamFX面向创作者的完整指南

如何快速掌握视频特效&#xff1a;StreamFX面向创作者的完整指南 【免费下载链接】obs-StreamFX StreamFX is a plugin for OBS Studio which adds many new effects, filters, sources, transitions and encoders! Be it 3D Transform, Blur, complex Masking, or even custom…...

STM32G474低功耗模式怎么选?一张图看懂睡眠、停止、待机模式区别与实战选型

STM32G474低功耗模式实战选型指南&#xff1a;从睡眠到待机的全场景决策框架 当你面对一块需要连续工作数月的电池供电设备时&#xff0c;每个微安培的电流都变得至关重要。STM32G474系列作为意法半导体针对高性能低功耗场景推出的微控制器&#xff0c;提供了从轻度睡眠到深度休…...

Redis知识点完整补充文档

再学习该文档的时候先学习Redis内容 https://blog.csdn.net/MC_sir/article/details/159394860?spm1001.2014.3001.5502https://blog.csdn.net/MC_sir/article/details/159394860?spm1001.2014.3001.5502 一、基础定义与存储结构&#xff08;补充&#xff09; 1. 五大数据结…...

300FPS的实时目标跟踪是怎么炼成的?手把手拆解KCF算法里的数学魔法

300FPS实时目标跟踪背后的数学魔法&#xff1a;KCF算法深度解密 在计算机视觉领域&#xff0c;实时目标跟踪一直是个令人着迷又充满挑战的问题。想象一下&#xff0c;当你在观看一场足球比赛时&#xff0c;摄像机需要实时锁定某个球员&#xff1b;或者当自动驾驶汽车行驶时&am…...

Qwen Pixel Art应用场景:独立音乐人专辑封面像素化视觉系统定制部署

Qwen Pixel Art应用场景&#xff1a;独立音乐人专辑封面像素化视觉系统定制部署 1. 项目背景与价值 独立音乐人常常面临专辑封面设计的挑战&#xff1a;专业设计成本高、风格匹配难、制作周期长。Qwen Pixel Art解决方案基于Qwen-Image-2512大模型与Pixel Art LoRA微调技术&a…...

从HDLbits的Verification题目看起:新手写Verilog代码最容易踩的3个坑(附避坑指南)

从HDLbits的Verification题目看起&#xff1a;新手写Verilog代码最容易踩的3个坑&#xff08;附避坑指南&#xff09; 当你第一次在仿真器里看到波形图像脱缰野马一样乱窜时&#xff0c;那种头皮发麻的感觉我至今记忆犹新。Verilog看似简单的语法背后&#xff0c;藏着无数让初学…...

FLUX.1-dev像素模型效果展示:从草图提示词到高保真像素图全过程

FLUX.1-dev像素模型效果展示&#xff1a;从草图提示词到高保真像素图全过程 1. 像素幻梦创意工坊介绍 像素幻梦 (Pixel Dream Workshop) 是一款基于 FLUX.1-dev扩散模型构建的下一代像素艺术生成工具。它采用明亮的16-bit像素工坊视觉设计&#xff0c;为创作者提供沉浸式的AI…...