为什么已经有C ++和Rust时就使用Zig?

2021-01-16 07:00:39

如果Zig代码看起来像是跳了起来就无法调用函数,则不是。这意味着您可以确保以下代码仅调用foo()然后再调用bar(),并且可以确保无需知道任何类型的代码:

D具有@property函数,这些函数可以通过类似于字段访问的方式来调用,因此在上面的示例中,c.d可能会调用一个函数。

C ++,D和Rust具有运算符重载,因此+运算符可能会调用函数。

C ++,D和Go具有throw / catch异常,因此foo()可能会引发异常,并阻止bar()被调用。 (当然,即使在Zig中,foo()也会死锁并阻止bar()的调用,但是在任何图灵完备的语言中都可能发生这种情况。)

更一般而言,在堆分配方面要采用自动方法。没有使用堆分配器的新关键字或任何其他语言功能(例如,字符串串联运算符[1])。堆的整个概念严格在用户空间中。有一些提供和使用堆分配器的标准库功能,但是这些是可选的标准库功能,不是语言本身内置的。如果您从未初始化堆分配器,则可以确保您的程序永远不会导致堆分配。

Zig的标准库还很年轻,但是目标是针对每个使用分配器的功能,在运行时或可能在编译时或运行时使用分配器来接受分配器。

这种设计理念的动机是使用户能够编写他们认为必要的任何方式的自定义分配器策略,而不是强迫他们甚至鼓励他们采用可能不适合其需求的特定策略。例如,Rust似乎鼓励使用单一的全局分配器策略,该策略不适用于许多用例,例如OS开发和高性能游戏开发。 Zig从Jai关于分配器的立场中汲取线索,因为该语言是由高性能游戏设计师针对高性能游戏的用例开发的。

如前所述,该主题仍然有些模糊,随着Zig标准库的成熟,它将变得更加具体。重要的是,堆分配是用户空间的概念,而不是内置于语言中。

[1]:实际上有一个字符串连接运算符(通常是数组连接运算符),但是它仅在编译时有效,因此仍然没有运行时堆分配。

Zig具有完全可选的标准库,只有在使用它时,它才会被编译到您的程序中。 Zig对链接libc或不链接libc均提供相同的支持。 Zig对裸机和高性能开发非常友好。

编程的圣杯之一是代码重用。可悲的是,在实践中,我们发现自己多次重新发明了轮子。通常是有道理的。

如果应用程序具有实时要求,则使用垃圾回收或任何其他非确定性行为的任何库都将不具有依赖性。

如果一种语言很容易忽略错误,从而验证一个库是否正确处理并冒出错误,那么您可能会很想忽略该库并重新实现它,因为它知道一个人正确地处理了所有相关错误。 Zig的设计使程序员能够做的最懒惰的事情是正确地处理错误,因此人们可以合理地确信库将适当地冒起错误。

当前,C是最通用和可移植的语言,这在实际上是正确的。任何无法与C代码进行交互的语言都可能会导致混淆。 Zig试图通过同时使其直接兼容外部功能的C ABI并引入安全性和语言设计来防止实现中的常见错误,从而成为库的新可移植语言。

Zig是一种编程语言,但它还附带了一个构建系统和程序包管理器,即使在传统的C / C ++项目中,它们也很有用。

您不仅可以编写Zig代码而不是C或C ++代码,还可以使用Zig代替自动工具,cmake,make,scons,ninja等。此外,它(将)为以下程序提供程序包管理器:本机依赖性。即使整个项目的代码库都使用C或C ++,该构建系统也适用。

诸如apt-get,pacman,homebrew之类的系统软件包管理器对于最终用户体验至关重要,但是它们不足以满足开发人员的需求。特定于语言的软件包管理器可以是没有贡献者和拥有数十个参与者之间的区别。对于开源项目,使项目完全无法构建对于潜在贡献者来说是一个巨大的障碍。对于C / C ++项目,具有依赖关系可能是致命的,尤其是在没有软件包管理器的Windows上。即使只是构建Zig本身,大多数潜在的参与者也很难理解LLVM依赖关系。 Zig将(将)提供一种方法,使项目直接依赖于本机库-而不依赖于用户。系统软件包管理器,以提供正确的版本,并且以一种实际上可以保证的方法,无论使用什么系统,并且与目标平台无关,都可以在首次尝试时成功构建项目。

Zig提供了一种使用声明性API来用合理的语言代替项目的构建系统来构建项目的方法,该声明性API还提供了程序包管理,因此实际上可以依赖其他C库。具有依赖关系的能力可以实现更高级别的抽象,从而可以扩展可重用的高级代码。

C ++,Rust和D具有大量功能,并且可能会分散您正在处理的应用程序的实际含义。人们发现自己调试他们对编程语言的知识,而不是调试应用程序本身。

Zig没有宏,也没有元编程,但仍然足够强大,可以以清晰,非重复的方式表达复杂的程序。甚至具有宏特殊情况格式的Rust,也可以在编译器本身中实现。同时,在Zig中,等效功能在标准库中实现,编译器中没有特殊情况的代码。

当您查看Zig代码时,一切都是简单的表达式或函数调用。没有运算符重载,属性方法,运行时分派,宏或隐藏的控制流。 Zig致力于实现C的所有极佳简单性,但不包括陷阱。

可以从下载部分下载Zig。 Zig为Linux,Windows,MacOS和Freebsd提供二进制存档。 以下内容描述了此存档的内容: 使用成熟的,受到良好支持的LLVM基础架构,该基础架构可进行深度优化并支持大多数主要平台 附带了libc的源代码,可以在需要任何受支持的平台时动态编译这些源代码