Hacker News 中文摘要

RSS订阅

我太笨了,搞不懂 Zig 的新 IO 接口 -- I'm too dumb for Zig's new IO interface

文章摘要

Zig 0.15引入了新的IO接口,主要涉及std.Io.Readerstd.Io.Writer类型,取代了旧接口。作者在升级库时遇到困难,尤其是对tls.Client的使用感到困惑。尽管Zig的文档不够完善,但通过net.Streamreader()writer()方法,可以尝试理解新接口的使用方式。

文章总结

标题:我对Zig的新IO接口感到困惑

文章主要讲述了作者在升级自己的库时,遇到了Zig 0.15版本中引入的新IO接口问题。新接口主要涉及std.Io.Readerstd.Io.Writer类型,取代了旧接口。作者在尝试使用新的tls.Client时,遇到了不少困惑和挑战。

首先,作者提到tls.Client.init函数需要传入新的ReaderWriter类型,以及一些选项。然而,net.Stream并不直接兼容这些新类型,需要通过reader()writer()方法进行转换。作者发现,将Stream.Reader转换为*std.Io.Reader需要调用interface()方法,而将Stream.Writer转换为*std.Io.Writer则需要获取&interface字段的地址,这种不一致性让作者感到困惑。

接着,作者提到stream.writerstream.reader方法需要传入缓冲区参数,且缓冲区大小至少为std.crypto.tls.max_ciphertext_record_len。作者在代码中设置了这些缓冲区,但在尝试运行代码时,发现需要提供四个选项:ca_bundlehostwrite_bufferread_buffer。作者不理解为什么这些参数需要通过不同的方式传递。

在尝试发送数据时,作者发现程序会挂起,猜测可能是因为缺少write_buffer。于是,作者尝试为write_buffer提供一个缓冲区,解决了挂起问题。然而,在尝试读取服务器响应时,作者发现std.Io.Reader并没有read方法,而是提供了peaktakeByteSignedreadSliceShort等方法。作者最终选择使用stream方法将数据写入缓冲区,但在运行代码时,程序崩溃,提示缓冲区长度断言失败。

最后,作者分享了自己当前的代码版本,虽然不崩溃,但仍然无法正常工作。作者承认在迁移过程中遇到了一些基本问题,例如找不到std.fmt.printInt函数。作者表示,尽管对Zig的新接口感到困惑,但仍然在努力理解和适应这些变化。

总结来说,文章主要反映了作者在使用Zig新IO接口时遇到的种种挑战和困惑,尤其是在处理tls.Client时的复杂性和不一致性。

评论总结

  1. 关于Zig语言的评价

    • 正面评价:Zig语言在底层编程方面表现出色,尤其是其作为C/C++交叉编译器的能力受到赞赏。例如,JaggerJo表示:“Zig would be my go to language for low level stuff.”(Zig将是我进行底层编程的首选语言。)
    • 负面评价:Zig的标准库被认为仍在开发中,存在过度抽象和低层次实现的问题。Galanwe指出:“the standard library is really a big work in progress, constantly shifting, missing a lot of bits”(标准库仍在开发中,不断变化,缺少很多部分。)
  2. 关于Zig的文档和用户体验

    • 文档问题:多位评论者认为Zig的文档不足,导致用户体验不佳。eps表示:“Sounds mostly like a documentation issue, or the lack of thereof.”(这听起来主要是文档问题,或者说是缺乏文档。)
    • 改进建议:hardwaresofton建议通过编写更好的文档和示例来改善用户体验:“the first obvious fix for the issues the OP wrote about is to write better documentation”(解决OP提到的问题的明显方法是编写更好的文档。)
  3. 关于Zig的设计和性能

    • 设计复杂性:Zig的I/O接口被认为复杂,但一旦熟悉后,设计被认为是干净且具有前瞻性的。jedisct1表示:“the design is actually very clean, versatile, and future-proof.”(设计实际上非常干净、多功能且具有前瞻性。)
    • 性能与用户体验的权衡:hardwaresofton指出,Zig在追求绝对性能的同时,可能牺牲了开发体验:“If the tradeoff was absolute performance/avoiding introducing load-bearing performance-lowering abstraction I think that goal was achieved, but DX may have gone out the window.”(如果权衡是绝对性能/避免引入降低性能的抽象,我认为目标已经实现,但开发体验可能已经消失了。)
  4. 关于Zig与其他语言的比较

    • 与C语言的比较:8s2ngy认为Zig在内存安全性和语言特性上不如C语言:“If it is indeed a different way to write code, one that embraces default memory unsafety, why would I choose it over C, which has decades of work behind it?”(如果它确实是一种不同的编码方式,一种默认内存不安全的方式,我为什么要选择它而不是C语言,后者有几十年的积累?)
  5. 关于Zig的实际使用问题

    • 使用中的技术问题:latch分享了在使用Zig时遇到的技术问题,如流式写入和读取的复杂性:“I finally got it working. I had to flush both the encrypted writer and then the stream writer.”(我终于让它工作了。我必须刷新加密写入器和流写入器。)

总结:Zig语言在底层编程和性能优化方面表现出色,但其标准库仍在开发中,文档不足,用户体验有待改善。尽管设计复杂,但一旦熟悉后,其设计被认为是干净且具有前瞻性的。与其他语言如C相比,Zig在内存安全性方面存在争议。