使用 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语言真可怕……

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值