演出季上“异步编程模型的演变”幻灯片
演出季终于过去了,现在就来做一个收尾吧。这次的主题是“异步编程模型的演变”,主要回顾了微软在.NET平台上异步编程上的进化:基于回调,基于迭代生成器,基于类库,基于语言。不过这样的编程模型其实并非微软独有,而是一些运用比较广泛的异步编程方式,因此在SD 2.0大会上我其实完全用JavaScript进行演示。从结果上来看,除了最早的TUP,其他两场演讲(.NET技术大会和SD 2.0)的反响都不错。
严格说来,这场演讲在过去一个月中讲了四次,其中第一次是在CSDN举办的TUP活动上。您可能注意到“异步编程”是我后半年关注的重点,例如在创新院赞助的nBazaar交流会上我分享的话题都是关于异步编程的,这次要在1小时内覆盖之前两场演讲,自然信息量很大。于是在TUP活动上的演讲便不太理想,因为内容实在太多,结果绝大部分内容几乎都是匆匆扫过。不幸中的万幸,这次演讲的幻灯片倒成了一个“阅读材料”(下载)。
我将异步编程模型的演变过程分为四个部分:
- 基于回调:这是最传统的异步编程模型,“回调”是“异步”的天然属性,例如.NET里的Begin/End异步模型或是基于事件的异步模型。在前端开发中,XMLHttpRequest或是DOM事件,事实上都是基于事件的异步编程模型。这种编程模型破坏了代码的局部性,写起来非常麻烦,更别说是异步操作的组合、异常处理、取消等操作了。
- 基于迭代生成器:我把这个单独提出来说,是因为迭代生成器几乎已经成为现代语言的标配了,在JavaScript 1.7里也有相应的特性——自然,可怜的Java语言是不曾提供支持的。有了迭代生成器,我们就可以在发起异步操作的时候,将控制权交给外部,由外部来决定代码什么时候继续执行,这就在一定程度上保持了代码的局部性。
- 基于类库:由于异步编程十分困难,有时候语言层面的支持有限,聪明的程序员们想尽了各种办法来简化异步编程。其中主要的办法就是总结出一种异步模型,并围绕这种模型提供一种异步类库。其中的典型便是“推集合模型”以及“响应式编程”。只可惜想要基于死板的Java语言开发出好用的异步类库也总是使不出劲,与它形成鲜明对比的便是Scala语言,基于同样的平台,生产力却天下地下。
- 基于语言:有时候,语言设计者会直接在语言层面上简化异步编程的问题,其中的典型便是Erlang语言以及下个版本的C#。不过这里我主要讨论的是F#语言里的异步工作流。不过严格来说,F#的异步工作流是个类库,它使用了F#的“计算表达式”特性,这才是个语言特性。我参考了F#的异步工作流,开发Jscex(一个JavaScript至JavaScript编译器)以及Jscex.Async组件(基于Jscex的异步类库)。
由于TUP上的失策,我为一个星期后的.NET技术大会上重新组织了内容,减少了“代码赏析”的数量,增加了演示用的示例。我的演示是在Mac OS上基于Mono 2.8和MonoMac编写的带有Mac OS原生界面的应用程序,以此体现异步编程对于各平台上UI编程的重要性。有了TUP的经验,这次的演讲反响不错,我也被评为这次会议Top 5讲师。幻灯片如下(下载):
我为SD 2.0大会使用JavaScript重新编写了所有的示例,并在创新院内部的分享交流会上进行了试讲。试讲的反馈是“干货太多”,这使得我重新提炼了一下示例。不过在大会的前一天,我还是补充了一个基于node.js开发的最简单的静态文件服务器,以此表示Jscex并非只能在浏览器里使用。幻灯片如下(下载):
有趣的是,在我之前的一场演讲接近尾声的时候,会场里大约只坐了一半人,因此我一开始还担心没人来听。幸运的是在演讲开始时位子已经基本坐满了,后来还有一些人站在一旁。演讲之后的反馈很少,不过都是正面的。会后我还和业界的一些JavaScript大牛交流了一下Jscex,这也是我接下来一段时间的一个工作重点,希望能够做大做好。
这个演出季已经过去了,接下来又到了nBazaar交流会的时间了。第三届交流会将在1月15日举行,具体消息将在不久之后公开,敬请关注。我们又准备了四场有价值的演讲,一定能让您满意。