序言

[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

任何比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运行时等的一些认识,我认为还是有一定的学习价值的。

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

您的支持,是我不竭创造的动力

results matching ""

    No results matching ""