> For the complete documentation index, see [llms.txt](https://hitzhangjie.gitbook.io/libmill/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hitzhangjie.gitbook.io/libmill/master.md).

# 序言

\[libmill]\(<http://libmill.org/>), 是**Martin Sustrik**发起的一个基于linux c语言开发的go风格协程库，实现了类似go风格的常见编码操作，如支持协程、chan、非阻塞的网络IO等等，是一个不错的linux平台下c风格协程库实现，代码详见\[libmill-source]\(<https://github.com/sustrik/libmill>)。

* 如果你想从0到1的快速了解如何开发一个协程库，libmill将是一个非常不错的案例；
* 如果你想更深入地了解go，libmill里面也借鉴了go的一些设计思想；
* 或者你想在生产环境中使用，开发者也提供了一个更健壮的版本\[libdill]\(<http://libdill.org/>)可供选择。

有些读者可能会有这样的疑问，笔者为什么不直接学习go，反倒要花时间需学习libmill呢？

* 一，源于我对c语言的某种偏爱。编程语言归根究底是来解决问题的，不管是对认识世界、问题进行更好的抽象、建模，还是更贴近最佳实践等等，层出不出的高级语言引入了越来越多的特性。然而，我们真的需要这些吗？It depends。
* 二，那段时间也是刚开始接触go语言，某种程度还存在一点抵触心理。比如声明变量时数据类型要放在变量名后面，函数返回值列表放在参数列表后面，等等。因为这样的抵触心理，我也曾质疑过go的设计，以及自己要不要第一优先级花时间去掌握它。
* 最后，libmill是基于go语言实现进行设计的，在使用习惯上很相似，也可以起到触类旁通的效果；

下图中类比了go语言和libmill的一些常见操作，相比看后更能认同libmill是一个go风格协程库。

![go风格协程库libmill](/files/-MCaTTq9v7HpS7Uh-m-J)

“**任何比c语言更低级的语言都不足以完整地描述一个计算机系统，任何比c语言更高级的语言都可以用c语言来实现**”，我对c的评价也大致如此。与其为了go的个别特性去学习一门语言，我更愿意花点时间先研究下c如何来实现这样的特性。正是在这种思路下，我接触到了libmill等一众c、c++协程库实现，libtask、boost coroutine、libco等，libmill的实现相对来说更优雅。

当然了，慢慢地随着自己对go的学习逐渐加深，我更愿意将go作为主力开发语言。go运行时实现有些复杂，对libmill的研究反而让自己学习起来更加轻车熟路。此外，在linux c开发时，也多了个不错的选择。

这大致就是我早期学习libmill、go的一个经历。理解了这个go风格协程库的实现，也看到了好的设计思想，看大神的代码就是有种“**听君一席话，胜读十年书**”的感觉，巧妙的设计、黑魔法般的c idioms……

如果读者能够坚持看完本书，尤其是go初学者，应该能帮助加深对计算机系统、协程、go运行时等的一些认识，我认为还是有一定的学习价值的。

如果您觉得这些文章对您、对身边朋友有帮助，也请帮助转发、传播，如能再经济上支持一下，那对我和接下来的创作工作来说，也是一种莫大的鼓励。

![您的支持，是我不竭创造的动力](/files/-MCmBkpboFIGRJ2kcm-9)
