C的老问题?用Zig 解决它

2024-10-16 21:34:49 | 作者: 匿名

C 是一种低级系统编程语言,几乎没有内存抽象,因此内存管理完全是开发人员的责任,并且对汇编的抽象最少(但表达能力足以支持一些常见概念,例如类型系统)。它也是一种非常可移植的编程语言,因此如果编写正确,即使它具有一些晦涩的架构,它也可以在您的烤面包机上运行。

C 的特性使其成为一种非常适合其预期用途的语言。然而,这并不意味着它的设计决策按照今天的标准是完美的。如今,Zig作为一种新的系统编程语言已经出现并受到了相当多的关注。

目录概览

Comptime 文本替换预处理内存管理和Zig 分配器使用Zig 的十亿美元错误使用Zig 切片的可选指针算术显式内存对齐数组作为值错误处理一切都是表达式C 有更复杂的语法来处理

1、Comptime文本替换预处理

使用预处理器来替换源代码中的文本并不是C 所独有的。它在C 创建之前就已存在,并且可以追溯到早期的示例,例如IBM 704 计算机的SAP 汇编器。下面是一个AMD64 汇编代码片段的示例,它定义了Pushr 宏,并根据其参数将其替换为Push 或:pushf。

amd64-宏.asm

footgun宏.c

为了使其正常工作,确保所有宏都正确(包括括号)至关重要:

另一方面,Zig 通过引入参数和函数,采用更直观的方法来完成此类任务。这使我们能够在编译时而不是运行时执行函数。下面是Zig: comptimesSQUARE 中的相同C 宏

comptime-示例.zig

Zig的comptime计算还可以覆盖C语言的一些小特性:例如在最小值为-2^15=-32768、最大值为(2^15)-1=32767的平台上,则不是可以用C 写出有符号类型的最小值作为文字常量。

正如我之前提到的,C 几乎没有内存抽象。这有优点也有缺点:

优点:人们可以完全控制内存,可以用它做任何他们想做的事

缺点:人们可以完全控制内存,可以用它做任何他们想做的事

权力越大,责任越大。在像C 这样使用手动内存管理的语言中,不正确的内存管理可能会产生严重的安全后果。在最好的情况下,它可能会导致拒绝服务,而在最坏的情况下,它可能允许攻击者执行任意代码。许多语言试图通过施加编码限制或使用垃圾收集器来消除整个问题来减少这种责任。然而,Zig 采取了不同的方法。

Zig 同时提供多种优势:

手动内存管理:你做你的。记忆的控制权掌握在你的手中。没有像Rust 那样的编码限制。无隐藏分配: 在您不知情并允许其发生的情况下,堆上不会分配任何内容。 Zig 利用分配器类型来实现此目的。任何在堆上分配的函数都会接收分配器作为参数。任何不这样做的东西都不会在堆上分配,这是肯定的。避免内存泄漏的安全工具,例如std.heap.GeneralPurposeAllocatorZig,不会像Rust 那样限制您的编码方式,帮助您保持安全并避免泄漏,但仍然可以让您像在C 中一样做任何您想做的事情。我个人认为可能是一个方便的中间立场。

注意:为了提高可读性,一些路径被缩短为三个点

FixBufferAllocatorGeneralPurposeAllocatorTestingAllocatorc_allocatorStackFallbackAllocatorLoggingAllocator 您始终可以实现自己的分配器。

3、十亿美元的错误与Zig Optional

此C 代码突然崩溃,除了让您知道SIGSEGV 到底发生了什么之外,没有给您任何线索:

C的老问题?用Zig 解决它

在C语言中,地址被表示为数值,这使得开发人员可以对指针进行算术运算。此功能使C 开发人员能够通过操作地址来访问和修改任意内存位置。

大多数这些问题都可以使用Slices 来解决。切片提供了一种更安全、更直观的方式来操作和访问数组或内存部分:

每种类型都有一个对齐号,它定义了该类型的合法内存地址。对齐以字节为单位,并确保变量的起始地址可被对齐值整除。例如:

u8 类型的自然对齐方式为1,这意味着它可以驻留在任何内存地址。该u16 类型的自然对齐方式为2,这意味着它只能驻留在地址可被2 整除的内存位置,例如0、2、4、6、8 等.该u32 类型的自然对齐方式为4对齐,这意味着它只能驻留在地址可被4 整除的内存位置,例如0、4、8、12、16 等.CPU 强制执行这些对齐要求。如果变量的类型未正确对齐,则可能会导致程序崩溃(例如分段错误)或导致非法指令。

现在我们将在下面的代码中有意创建一个指向unsigned int 的未对齐指针。此代码在大多数CPU 上运行时会崩溃:

C 语言的语义定义数组始终作为引用传递

许多C API 都有错误代码的概念,其中函数的返回值表示成功状态或表示发生的特定错误的整数。

Zig 使用相同的方法来处理错误,但通过在类型系统中以更有用和更具表现力的方式捕获错误来改进概念。

Zig 中的错误集与枚举类似。但是,整个编译过程中的每个错误名称都会被分配一个大于0 的无符号整数。

错误集类型和普通类型可用于使用! 形成错误联合类型。运算符(例如:FileOpenError!u16)。这些类型的值可能是错误值,也可能是正常类型的值。

Try x 是xcatch |err| 的快捷方式return err 通常用在错误处理不合适的地方。

总的来说,Zig 的错误处理机制与C 类似,但具有类型系统支持。

8、一切都是一种表达

从高级语言到C语言,你可能会错过以下功能:

IIFE.js

9、C有更复杂的语法需要处理

看看这个C类型:

甚至有像cdecl.org 这样的工具可以帮助您阅读C 类型并将其人性化。我非常确定,对于真正的C 开发人员来说,处理此类类型可能并不那么具有挑战性。有些人有幸拥有阅读上帝语言的能力。但对于像我这样宁愿让事情变得简单的人来说,Zig 类型更容易阅读和维护。

10、结论

在这篇博文中,我们讨论了C 语言的一些问题,这些问题导致人们寻找或创建过去遗留下来的语言的替代品。

用户评论

泪湿青衫

哎呀,C语言的问题一直让人头疼,看到用Zig来解决,真是眼前一亮!期待这个新语言的强大功能。

    有5位网友表示赞同!

别在我面前犯贱

之前写C代码的时候,总是因为各种小问题头疼不已,Zig听起来好像能解决这些问题,得试试看。

    有13位网友表示赞同!

残花为谁悲丶

一直听说C语言效率高,但是调试起来太痛苦了。Zig能解决这些老问题吗?希望是这样!

    有6位网友表示赞同!

你是梦遥不可及

以前用C写代码,总是担心内存泄漏,Zig真的能解决这个问题吗?有点期待它的表现。

    有7位网友表示赞同!

惦着脚尖摘太阳

C语言的老问题太多了,希望Zig能带来新的解决方案,让我们开发者能更轻松地工作。

    有19位网友表示赞同!

怅惘

看到这个标题,我就想起了那些年调试C代码的日子。Zig能解决这个问题,那真是太好了。

    有11位网友表示赞同!

水波映月

C语言的老问题确实让人头疼,如果能用Zig解决,那我就要试试这个新语言了。

    有20位网友表示赞同!

太难

每次写C代码,都感觉像是在解谜,希望Zig能带来一些新的思路,解决这些问题。

    有11位网友表示赞同!

Hello爱情风

用C语言编程,总是觉得效率高,但问题也多。Zig能带来革命性的改变吗?拭目以待。

    有17位网友表示赞同!

十言i

C语言的老问题一直困扰我,看到Zig的介绍,心里有点小激动,希望能真的解决问题。

    有18位网友表示赞同!

♂你那刺眼的温柔

用C语言开发,最怕的就是内存管理和调试,Zig如果能解决这些问题,那我就要重新审视它了。

    有19位网友表示赞同!

优雅的叶子

之前对C语言已经有点厌倦了,Zig的出现让我看到了新的希望,希望它能解决那些老问题。

    有11位网友表示赞同!

一个人的荒凉

C语言的老问题确实让人头疼,看到Zig的介绍,心里挺期待的,但会不会又是炒作呢?

    有13位网友表示赞同!

■□丶一切都无所谓

用C语言编程,总是觉得效率高,但调试起来太痛苦了。Zig能否解决这个问题,我很感兴趣。

    有6位网友表示赞同!

此刻不是了i

C语言的老问题太多,希望Zig能带来一些新的解决方案,让我们开发者能更专注于创意而不是调试。

    有9位网友表示赞同!

孤自凉丶

作为一个老C程序员,看到Zig解决老问题的介绍,心里有点小激动,但会不会太理想化了?

    有11位网友表示赞同!

蔚蓝的天空〃没有我的翅膀

C语言的问题确实不少,Zig如果能解决其中的一些,那对于我们来说就是一大福音。

    有9位网友表示赞同!

哭着哭着就萌了°

听说Zig能解决C语言的老问题,我得去详细了解了解,看看这个新语言到底有多强大。

    有17位网友表示赞同!

*巴黎铁塔

作为一个C程序员,一直在期待能有更好的编程语言出现,Zig的出现让我看到了希望。

    有19位网友表示赞同!

古巷青灯

用C语言开发,总是觉得效率高,但问题也多。Zig如果能解决这些问题,那我就要重新考虑我的编程语言选择了。

    有5位网友表示赞同!

封锁感觉

C语言的老问题一直让人头疼,希望Zig能带来真正的革新,让我们的编程生活更加美好。

    有11位网友表示赞同!