By Tag: ziglang

Chapter 5 - 异步 - 了解ziglang的异步是如何工作的
Chapter 5 - 异步 - 了解ziglang的异步是如何工作的
Anonymous

title: Chapter 5 - 异步 weight: 6 date: 2023-04-28 18:00:00 description: Chapter 5 - 了解ziglang的异步是如何工作的 警告:当前版本的编译器还不支持异步 Async 要对Zig的异步进行有效的理解,需要熟悉调用栈的概念。如果你以前没有听说过这个,请查看wikipedia页面。 <!-- TODO:实际上解释一下调用栈?--> 一个传统的函数调用包括三个方面: 用参数启动被调用的函数,推入函数的堆栈框架 将控制权转移到该函数 在函数完成后,将控制权交还给调用者,取回函数的返回值并弹出函数的堆栈框架 有了Zig的异步函数,我们可以做得更多,控制权的转移是一个持续的双向对话(也就是说,我们可以多次将控制权交给函数并收回)。正因为如此,在异步上下文中调用一个函数时必须要有特别的考虑;我们不能再像正常情况下那样推送和弹出堆栈框架(因为堆栈是不稳定的,在 当前堆栈框架之上的东西可能被覆盖),而是明确地存储异步函数的框架。虽然大多数人不会使用它的全部功能,但这种Async的风格对于创建更强大的结构(如事件循环)是很有用的。 Zig的async风格可以被描述为可暂停的无堆栈的coroutines。Zig的async与操作系统中的线程有很大的不同,后者有一个堆栈,只能由内核来暂停。此外,Zig的async是为你提供控制流结构和代码生成;async并不意味着并行或使用线程。 暂停/恢复 suspend/resume 在上一节中,我们谈到了异步函数如何将控制权交还给调用者,以及异步函数随后如何将控制权收回。这个功能是由关键字[suspend, and resume](https://ziglang.org/documentation/master/#Suspend-and-Resume)提供的。当一个函数暂停时,控制流返回到最后恢复的地方;当一个函数通过async调用时,这是一个隐式恢复。 这些例子中的注释指出了执行的顺序。这里有几件事需要注意: async关键字是用来在异步上下文中调用函数的。 async func()返回函数的框架。 我们必须存储这个框架。 resume关键字用于框架上,而suspend用于被调用的函数上。 这个例子有一个暂停,但没有匹配的恢复。 const expect = @import(std).testing.expect; var foo: i32 = 1; test suspend with no resume { var frame = async func(); //1 _ = frame; try expect(foo == 2); //4 } fn func() void { ...

Chapter 2 - 标准模式 - 本节教程将详细介绍Zig编程语言的标准库
Chapter 2 - 标准模式 - 本节教程将详细介绍Zig编程语言的标准库
Anonymous

title: "Chapter 2 - 标准模式" weight: 3 date: 2023-04-28 18:00:00 description: "Chapter 2 - 本节教程将详细介绍Zig编程语言的标准库." 自动生成的标准库文档可以在这里找到。安装ZLS也可以帮助你探索标准库,它为你提供了完成度。 Allocators 分配器 Zig标准库提供了一个分配内存的模式,它允许程序员准确地选择在标准库中如何进行内存分配--在标准库中没有分配在你背后发生。 最基本的分配器是[std.heap.page_allocator](https://ziglang.org/documentation/master/std/#A;std:heap.page_allocator)。每当这个分配器进行分配时,它都会向你的操作系统索取整页的内存;一个单一字节的分配可能会保留多个kibibytes。由于向操作系统索取内存需要一个系统调用,这对速度来说也是非常低效的。 在这里,我们分配了100个字节作为[]u8。注意defer是如何与free结合使用的--这是Zig中内存管理的一个常见模式 . const std = @import("std"); const expect = std.testing.expect; test "allocation" { const allocator = std.heap.page_allocator; const memory = try allocator.alloc(u8, 100); defer allocator.free(memory); try expect(memory.len == 100); try expect(@TypeOf(memory) == []u8); } std.heap.FixedBufferAllocator是一个分配器,将内存分配到一个固定的缓冲区,而不进行任何堆分配。当不希望使用堆时,例如在编写内核时,这很有用。出于性能方面的考虑,也可以考虑这样做。如果它的字节数用完了,它将给你一个错误OutOfMemory。 test "fixed buffer allocator"...

Chapter 2 - 标准模式 - 本节教程将详细介绍Zig编程语言的标准库
Chapter 2 - 标准模式 - 本节教程将详细介绍Zig编程语言的标准库
Anonymous

title: Chapter 2 - 标准模式 weight: 3 date: 2023-04-28 18:00:00 description: Chapter 2 - 本节教程将详细介绍Zig编程语言的标准库. 自动生成的标准库文档可以在这里找到。安装ZLS也可以帮助你探索标准库,它为你提供了完成度。 Allocators 分配器 Zig标准库提供了一个分配内存的模式,它允许程序员准确地选择在标准库中如何进行内存分配--在标准库中没有分配在你背后发生。 最基本的分配器是[std.heap.page_allocator](https://ziglang.org/documentation/master/std/#A;std:heap.page_allocator)。每当这个分配器进行分配时,它都会向你的操作系统索取整页的内存;一个单一字节的分配可能会保留多个kibibytes。由于向操作系统索取内存需要一个系统调用,这对速度来说也是非常低效的。 在这里,我们分配了100个字节作为[]u8。注意defer是如何与free结合使用的--这是Zig中内存管理的一个常见模式 . const std = @import(std); const expect = std.testing.expect; test allocation { const allocator = std.heap.page_allocator; const memory = try allocator.alloc(u8, 100); defer allocator.free(memory); try expect(memory.len == 100); try expect(@TypeOf(memory) == []u8); } std.heap.FixedBufferAllocator是一个分配器,将内存分配到一个固定的缓冲区,而不进行任何堆分配。当不希望使用堆时,例如在编写内核时,这很有用。出于性能方面的考虑,也可以考虑这样做。如果它的字节数用完了,它将给你一个错误OutOfMemory。 test fixed buffer allocator...

Chapter 1 - 基础知识 Chapter 1 - 这将使你快速掌握几乎所有的Zig编程语言。这一部分的教程应该可以在一小时内完成."
Chapter 1 - 基础知识 Chapter 1 - 这将使你快速掌握几乎所有的Zig编程语言。这一部分的教程应该可以在一小时内完成."
Anonymous

title: "Chapter 1 - 基础知识" weight: 2 date: 2023-04-28 18:00:00 description: "Chapter 1 - 这将使你快速掌握几乎所有的Zig编程语言。这一部分的教程应该可以在一小时内完成." Assignment 赋值 赋值语法: (const|var) identifier[: type] = value. const表示identifier是一个constant 常量,存储一个不可变的值。 var表示identifier是一个variable 变量,存储一个可变的值。 : type是对identifier的类型注释,如果可以推断出value的数据类型,可以省略。 const constant: i32 = 5; // signed 32-bit constant var variable: u32 = 5000; // unsigned 32-bit variable // @as performs an explicit type coercion const inferred_constant = @as(i32, 5); var inferred_variable = @as(u32, 5000); 常量和变量必须有一个值。如果不能给出已知的值,只要提供一个类型注释,就可以使用undefined值,它可以强制到任何类型 . const a: i32 = undefined; var b: u32 =...

Chapter 1 - 基础知识 这将使你快速掌握几乎所有的Zig编程语言。这一部分的教程应该可以在一小时内完成.
Chapter 1 - 基础知识 这将使你快速掌握几乎所有的Zig编程语言。这一部分的教程应该可以在一小时内完成.
Anonymous

title: Chapter 1 - 基础知识 weight: 2 date: 2023-04-28 18:00:00 description: Chapter 1 - 这将使你快速掌握几乎所有的Zig编程语言。这一部分的教程应该可以在一小时内完成. Assignment 赋值 赋值语法: (const|var) identifier[: type] = value. const表示identifier是一个constant 常量,存储一个不可变的值。 var表示identifier是一个variable 变量,存储一个可变的值。 : type是对identifier的类型注释,如果可以推断出value的数据类型,可以省略。 const constant: i32 = 5; // signed 32-bit constant var variable: u32 = 5000; // unsigned 32-bit variable // @as performs an explicit type coercion const inferred_constant = @as(i32, 5); var inferred_variable = @as(u32, 5000); 常量和变量必须有一个值。如果不能给出已知的值,只要提供一个类型注释,就可以使用undefined值,它可以强制到任何类型 . const a: i32 = undefined; var b: u32 =...