Hacker News 中文摘要

RSS订阅

我如何将Zig打造成编写网络程序的首选语言 -- How I turned Zig into my favorite language to write network programs in

文章摘要

作者最初对Zig语言持观望态度,但在看到其创始人用Zig重写自己的算法后产生兴趣。他利用重写AcoustID倒排索引项目学习Zig,发现其开发体验极佳,性能优于原C++版本。但在添加服务器接口时,发现Zig的异步I/O支持不足,转而尝试Go的网络编程便利性。

文章总结

标题:我如何将Zig变成编写网络程序的首选语言

我一直关注着Zig这门为编写音频软件(底层、无内存分配、实时)而生的语言,但最初并未太在意——它看起来有些奇怪,我也没发现实际需求。直到看到语言创始人Andrew Kelley在Hacker News上发布用Zig重写我的Chromaprint算法的帖子,才真正产生了兴趣。

在重写AcoustID倒排索引时,我决定用Zig边学边做。新版本比原C++实现更快、扩展性更强,但添加服务器接口时遇到了瓶颈。此前C++版本使用Qt实现异步I/O,原型阶段改用Go的网络编程便利性。而Zig缺乏成熟的异步方案,迫使我开发了Zig版NATS客户端,这让我深入掌握了Zig的网络能力。

如今我正式推出Zio——Zig的异步I/O并发库。它采用类似Go的协程模型:当执行stream.read()时,实际在后台启动I/O操作并挂起当前任务,操作完成后自动恢复。这种伪同步写法极大简化了状态管理,支持: - 全异步网络/文件I/O - 配合协程运行的同步原语(互斥锁、条件变量等) - Go风格的通道 - 操作系统信号监控

性能方面,单线程模式已超越Go和Rust的Tokio框架,上下文切换开销堪比函数调用。多线程模式虽健壮性稍逊,性能仍具优势。由于实现了标准读写接口,Zio可无缝兼容外部库(如示例中的HTTP服务器)。

以下是通过Zio实现的HTTP服务器核心代码结构: zig // 包含运行时初始化、TCP监听、连接处理等完整逻辑 // 展示如何通过reader/writer接口与标准库交互

最初我以为Zig只适合编写底层核心模块,需要其他语言构建上层。但Zio改变了这一切——下一步我将升级NATS客户端内部使用Zio,继而开发基于Zio的HTTP客户端/服务端库。

(注:原文中关于个人经历细节及部分技术探讨做了精简,保留核心的技术演进路径和项目价值说明)

评论总结

总结评论内容:

  1. 对Zig语言的兴趣与质疑
  • 正面评价:"Move Zig, for great justice."(评论1)
  • 负面担忧:"Isn't this a bad time to be embracing Zig? It's currently going through an intrusive upheaval of its I/O model."(评论4)
  1. 技术实现讨论
  • 关于协程性能:"A coroutine switch...inevitably breaks the branch predictor's idea of your return stack"(评论5)
  • 异步实现方式对比:"What this and e.g. libtask do seems so much cleaner to me"(评论9)
  1. 与其他语言的比较
  • 与Scala的ZIO比较:"Do you know that there's a concurrent Scala library named ZIO"(评论3)
  • 与Rust的比较:"if this library also gives me Go-style concurrency without having to rely on a garbage collector, then I am likely to enjoy it"(评论7)
  1. 命名问题
  • 命名冲突:"There is an extremely popular library/framework for Scala named ZIO out there... Naming is hard."(评论8)
  1. 发展前景
  • 积极看法:"it's been getting better and better lately"(评论6)
  • 技术疑问:"What makes a NATS client implementation the right prototype from which to extract a generic async framework layer?"(评论2)