使用 Duff 设施实现协程

知道Duff设施 的时候,只把它作为一个没多少实用价值的小技巧。然而,前段时间查询协程 的时候,发现了在C语言中使用Duff设施实现协程的技巧!(详见http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html )

 

于是再次被 C 语言shock到

 

其一,虽然看到过 “宏定义可以改变C语言的语法” 这样的说法,但之前觉得不过是文本替换而已,在这里却确确实实地看到了如何用宏向C中增加了原本不支持的“语言特性”!

 

其二,Simon Titham 的话:“当然,这一技巧破坏了这本书的每一个编码标准……[但是]任何试图牺牲算法明晰来确保语法清晰的编码标准都应该被重写。”(引自维基百科 )告诉我们,编码标准是为了使代码更易读。一个语法清晰但算法不明晰的代码显然不是易读的。但是,一般而言,想要牺牲语法清晰来追求算法明晰也未必可行,对于C语言却并非不能办到!

 

举个例子,维斯百科中协程 词条,将C#也列为支持协程的语言,但是事实上,C#并没有明确的协程概念。只不过,C#2.0加入了iterator,于是就可以用iterator模拟协程了。

 

我们知道,C#的iterator并没有加入什么新东西,编译器只是生成IEnumerator接口的一个实现。如果查看生成的IL,就会发现C#编译器生成的内容与Duff设施极其相似,只是因为C#中标签不能贯穿而多加了几条goto而已。

 

于是,C语言靠宏就能完成的事情,C#必须等到MS升级编译器后才能使用。或者说,别的语言里非要改编译器才能实现的功能,到C里面不过是几行宏……

 

C语言真可怕……

你可能感兴趣的:(c,算法,C#,iterator,语言,编译器)