<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://riceballl.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2friceballl.spaces.live.com%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Riceball LEE personal weblogs</title><description /><link>http://riceballl.spaces.live.com/</link><language>en-US</language><pubDate>Tue, 01 Jul 2008 03:19:35 GMT</pubDate><lastBuildDate>Tue, 01 Jul 2008 03:19:35 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><live:identity><live:id>-1711333523425955962</live:id><live:alias>riceballl</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>绵阳地震——幸与不幸，为还在灾区的灾民——出奇愤怒</title><link>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!254.entry</link><description>&lt;p&gt;汶川大地震发生，得知重庆，除了强烈的震感外，掉落的壁挂外，一切都好，连不幸死掉的几个，都是因为恐慌踩死的。 &lt;p&gt;心里踏实多，都江堰也联系上了，姨爹，姐姐他们都很万幸，地震是均不在家里，一切平安。除了在绵阳的大老子，从地震开始，就始终没有联系上，心里暗暗祷告，一切平安。几经波折，昨天得知在绵竹的大老子终于联系上，三哥开车去德阳接了。实在是万幸之至啊！ &lt;p&gt;今天，给家里打了电话，大老子和我聊起死里逃生的经历，才知道，地震比传说的还厉害，他们那里两座山，已经垮掉一座，夷为平地，下面的镇子，也被山石彻底掩埋。还有的地方则是平地凭空立起一座山。 &lt;p&gt;他们在市里还好点点，不过大老子也是从废墟中爬出来，伤了一只胳膊。逃难的人比比皆是，但是却不知道该往哪里逃，她和幸免与难的邻居以及其它的灾民在公园露宿，屎尿到处都是，口渴急了，也只有喝混着尿水的泉水，在路边吃野菜，绵阳政府的人一个也不见了，后来部队来了，问起政府在哪里，说政府就在那边看得到，但是人不知道跑哪里去了，都咒骂道当地政府死光了。后来救援物资的车辆远远不断的来了，但是他们却依然得不到水和食物，分发物资的当地人将矿泉水一箱箱的给他们自己的亲戚，当他们厚起脸上去要的时候，那人就说上午的物资已经分发完了，下午再来，尽管后面的物资堆集如山。当中的某些人又将这些水又拿去卖5块1瓶。可怜逃难的人身上哪有钱啊，他们中的人当时真的就气得想强抢了，被大老子他们劝了下来。 &lt;p&gt;她和幸免与难的邻居只好一路延着公路走向德阳，吃路边地的菜，而到处都充满尸体腐烂的恶臭，也没有人告诉他们集结点在哪里，只知道快逃，快逃！偶尔碰到部队的人，看到他们在路边坐着没力气的样子，就会给点水压缩饼干，就为这一点水和饼干，他们好感动，而对地方政府则恨死了。 &lt;p&gt;到了德阳，终于通过电话联系上了重庆，我大老子终于安全了，大老子说我三哥上德阳的时候多亏买了许多吃的，让和她一起逃难的人可以在支持许多天。但是以后呢，唉？ &lt;p&gt;为啥，没有人组织，规定好集结点，发放食物的地点？为啥会把食物交给当地人分发？为啥没有人告知？ &lt;p&gt;救灾物资不是让人拿来发这种十足霉了良心的黑心钱的！！在这样的环境下，这种人该枪毙！&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1711333523425955962&amp;page=RSS%3a+%e7%bb%b5%e9%98%b3%e5%9c%b0%e9%9c%87%e2%80%94%e2%80%94%e5%b9%b8%e4%b8%8e%e4%b8%8d%e5%b9%b8%ef%bc%8c%e4%b8%ba%e8%bf%98%e5%9c%a8%e7%81%be%e5%8c%ba%e7%9a%84%e7%81%be%e6%b0%91%e2%80%94%e2%80%94%e5%87%ba%e5%a5%87%e6%84%a4%e6%80%92&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=riceballl.spaces.live.com&amp;amp;GT1=riceballl"&gt;</description><category>有感而发</category><comments>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!254.entry#comment</comments><guid isPermaLink="true">http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!254.entry</guid><pubDate>Sun, 18 May 2008 10:02:26 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://riceballl.spaces.live.com/blog/cns!E8401F3A3BFA6F86!254/comments/feed.rss</wfw:commentRss><wfw:comment>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!254.entry#comment</wfw:comment><dcterms:modified>2008-05-18T10:02:26Z</dcterms:modified></item><item><title>欢迎 Embarcadero，愿Delphi发展更好</title><link>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!252.entry</link><description> 傻B的董事局早已物是人非了，如今的傻B董事局早就对编译器开发不感兴趣了，从去年就开始想把这部分卖掉，可惜开价太高，无人接手，才迫不得已弄出个CodeGear，其实这也是在为分离做准备。&lt;br&gt;EMbarcadero的产品线全是用Delphi开发的，旗下的开发者大多是在TurboPascal时代就开始编程，技术力量很强。&lt;br&gt;EMbarcadero Greg 认为数据库开发其实和程序开发类似，他们目前的产品线是：数据建模，快速SQL开发和调试，数据库发布和更新。而程序开发则是UML建模，快速代码开发和调试，程序的发布和更新。&lt;br&gt;&lt;br&gt;根据EMbarcadero 的Greg的回复揣测，这次 EMbarcadero 购买Delphi可能在如下的几个方面加强Delphi: &lt;br&gt;  1. 平台独立&lt;br&gt;  2. UM与建模（代码数据&amp;lt;-&amp;gt;UML）&lt;br&gt;  3. 数据建模工具以及SQL调试开发工具的集成&lt;br&gt;&lt;br&gt;不管怎么说，Delphi发展的里程碑不会有太大的变化，今年实现泛型和匿名函数，明年为实现64Bit coding.&lt;br&gt;&lt;br&gt;&lt;br&gt;我所希望的是未来的UML建模工具中的后台代码语言Delphi(OOPascal)是唯一语言，然后可以根据开发者的需求的转化任何的其它的语言项目:C++, Java, ECMA4, Php, Ruby等等。&lt;br&gt;Pascal语言由于它的严格和优雅，可以很方便的移植为其它语言（而反过来，由于其它语言太过于灵活，在语言之间的互译就变得不太容易），但是手工操作总是让人觉得繁琐和不方便。&lt;br&gt;另外，如lsu所言，同一语言编译成不同平台的VMcode也是意义非凡。&lt;br&gt;&lt;br&gt;就项目开放本身而言，至于语言的选择，这要看各个公司的积累，用那种语言无所谓，关键是快速高效。&lt;br&gt;对个人学习OO而言，用Delphi则比较方便快速，OO的严格使得学会Delphi的OO,学其它面向对象的语言也更容易。&lt;br&gt;不知道新东家有没有这个魄力，将Delphi的编译器核心(非IDE部分)开源，如能，那么多平台开发以后必将是Delphi的天下。&lt;br&gt;&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1711333523425955962&amp;page=RSS%3a+%e6%ac%a2%e8%bf%8e+Embarcadero%ef%bc%8c%e6%84%bfDelphi%e5%8f%91%e5%b1%95%e6%9b%b4%e5%a5%bd&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=riceballl.spaces.live.com&amp;amp;GT1=riceballl"&gt;</description><category>计算机与 Internet</category><comments>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!252.entry#comment</comments><guid isPermaLink="true">http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!252.entry</guid><pubDate>Sun, 11 May 2008 03:01:10 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://riceballl.spaces.live.com/blog/cns!E8401F3A3BFA6F86!252/comments/feed.rss</wfw:commentRss><wfw:comment>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!252.entry#comment</wfw:comment><dcterms:modified>2008-05-11T03:01:10Z</dcterms:modified></item><item><title>童蒙止观</title><link>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!249.entry</link><description>&lt;p&gt;书失之，网得之，暂记于此。 &lt;p&gt;童蒙止观、修习止观坐禅法要(埔里.佛光寺)  &lt;p&gt;&lt;a title="http://www.lianxin.org.cn/down/download.asp?softid=408" href="http://www.lianxin.org.cn/down/download.asp?softid=408"&gt;http://www.lianxin.org.cn/down/download.asp?softid=408&lt;/a&gt; &lt;p&gt;  &lt;h5&gt;童蒙止观&lt;/h5&gt; &lt;p&gt; &lt;hr width="100%" size=1&gt; 　　No. 1915天台止观有四本。一曰圆顿止观。大师于荆州玉泉寺说。章安记为十卷。二曰渐次止观。在瓦官寺说。弟子法慎记。本三十卷。章安治定为十卷。今禅波罗蜜是。三曰不定止观。即陈尚书令毛喜请大师出。有一卷。今六妙门是。四曰小止观。即今文是。大师为俗兄陈针出。寔大部之梗概。入道之枢机。曰止观。曰定慧。曰寂照。曰明静。皆同出而异名也。若夫穷万法之源底。考诸佛之修证。莫若止观。天台大师灵山亲承。承止观也。大苏妙悟。悟止观也。三昧所修。修止观也。纵辩而说。说止观也。故曰。说己心中所行法门。则知台教宗部虽繁。要归不出止观。舍止观不足以明天台道。不足以议天台教。故入道者不可不学。学者不可不修。奈何叔世寡薄驰走声利。或胶固于名相。或混肴于闇证。其书虽存。而止观之道蔑闻于世。得不为之痛心疾首哉。今以此书命工镂板。将使闻者见者。皆植大乘缘种。况有修有证者。则其利尚可量耶。予因对校乃为叙云。时绍圣二年仲秋朔。余杭郡释元照序  &lt;p&gt;修习止观坐禅法要(一曰童蒙止观亦名小止观)  &lt;p&gt;天台山修禅寺沙门智顗述  &lt;p&gt;诸恶莫作。众善奉行。自净其意。是诸佛教  &lt;p&gt;若夫泥洹之法。入乃多途论其急要。不出止观二法。所以然者。止乃伏结之初门。观是断惑之正要。止则爱养心识之善资。观则策发神解之妙术。止是禅定之胜因。观是智慧之由藉。若人成就定慧二法。斯乃自利利人法皆具足。故法华经云。佛自住大乘如其所得法定慧力庄严以此度众生。当知此之二法如车之双轮鸟之两翼。若偏修习即堕邪倒。故经云。若偏修禅定福德。不学智慧。名之曰愚。偏学知慧不修禅定福德名之曰狂。狂愚之过虽小不同。邪见轮转盖无差别。若不均等此则行乖圆备。何能疾登极果。故经云。声闻之人定力多故不见佛性。十住菩萨智慧力多。虽见佛性而不明了。诸佛如来定慧力等。是故了了见于佛性。以此推之。止观岂非泥洹大果之要门。行人修行之胜路。众德圆满之指归。无上极果之正体也。若如是知者止观法门实非浅。故欲接引始学之流辈。开蒙冥而进道。说易行难。岂可广论深妙。今略明十意。以示初心行人登正道之阶梯。入泥洹之等级。寻者当愧为行之难成。毋鄙斯文之浅近也。若心称言旨于一眴间。则智断难量神解莫测。若虚构文言情乖所说。空延岁月取证无由。事等贫人数他财宝。于己何益者哉  &lt;p&gt;　具缘第一　诃欲第二　弃盖第三　调和第四　方便第五　正修第六　善发第七　觉魔第八　治病第九　证果第十  &lt;p&gt;今略举此十意。以明修止观者。此是初心学坐之急要。若能善取其意而修习之。可以安心免难。发定生解证于无漏之圣果也  &lt;p&gt;　　具缘第一  &lt;p&gt;夫发心起行欲修止观者。要先外具五缘。第一持戒清净。如经中说。依因此戒。得生诸禅定及灭苦智慧。是故比丘应持戒清净。然有三种行人。持戒不同。一者若人未作佛弟子时不造五逆。后遇良师教受三归五戒为佛弟子。若得出家受沙弥十戒。次受具足戒作比丘比丘尼。从受戒来清净护持无所毁犯。是名上品持戒人也。当知是人修行止观必证佛法。犹如净衣易受染色。二者若人受得戒已。虽不犯重。于诸轻戒多所毁损。为修定故即能如法忏悔。亦名持戒清净能生定慧。如衣曾有垢腻若能浣净染亦可着。三者若人受得戒已。不能坚心护持轻重诸戒。多所毁犯。依小乘教门即无忏悔四重之法。若依大乘教门犹可灭除。故经云。佛法有二种健人。一者不作诸恶。二者作已能悔。夫欲忏悔者。须具十法助成其忏。一者明信因果。二者生重怖畏。三者深起惭愧。四者求灭罪方法。所谓大乘经中明诸行法。应当如法修行。五者发露先罪。六者断相续心。七者起护法心。八者发大誓愿度脱众生。九者常念十方诸佛。十者观罪性无生。若能成就如此十法。庄严道场洗浣清净着净洁衣。烧香散花于三宝前如法修行。一七三七日。或一月三月。乃至经年专心忏悔。所犯重罪取灭方止。云何知重罪灭相。若行者如是至心忏悔时。自觉身心轻利得好瑞梦。或复睹诸。灵瑞异相。或觉善心开发。或自于坐中。觉身如云如影。因是渐证得诸禅境界。或复豁然解悟心生善识法相。随所闻经即知义趣。因是法喜心无忧悔。如是等种种因缘。当知即是破戒障道罪灭之相。从是已后坚持禁戒。亦名尸罗清净。可修禅定。犹如破坏垢腻之衣。若能补治浣洗清净犹可染着。若人犯重禁已恐障禅定。虽不依诸经修诸行法。但生重惭愧。于三宝前发露先罪。断相续心。端身常坐。观罪性空念十方佛。若出禅时即须至心烧香礼拜忏悔。诵戒及诵大乘经典。障道重罪自当渐渐消灭。因此尸罗清净禅定开发。故妙胜定经云。若人犯重罪已。心生怖畏欲求除灭。若除禅定余无能灭。是人应当在空闲处摄心常坐。及诵大乘经。一切重罪悉皆消灭。诸禅三昧自然现前。第二衣食具足者。衣法有三种。一者如雪山大士。随得一衣蔽形即足。以不游人间堪忍力成故。二者如迦叶常受头陀法。但畜粪扫三衣不畜余长。三者若多寒国土。及忍力未成之者。如来亦许三衣之外。畜百一等物。而要须说净知量知足。若过贪求积聚则心乱妨道。次食法有四种。一者若上人大士。深山绝世。草果随时得资身者。二者常行头陀受乞食法。是乞食法。能破四种邪命。依正命自活。能生圣道故。邪命自活者。一下口食。二仰口食。三维口食。四方口食。邪命之相。如舍利弗为青目女说。三者阿兰若处。檀越送食。四者于僧中洁净食。有此等食缘具足。名衣食具足。何以故。无此等缘则心不安隐于道有妨。第三得闲居静处。闲者不作众事名之为闲。无愦闹故名之为静。有三处可修禅定。一者深山绝人之处二者头陀兰若之处。离于聚落极近三四里。此则放牧声绝无诸愦闹。三者远白衣住处清净伽蓝中。皆名闲居静处。第四息诸缘务。有四意。一息治生缘务。不作有为事业。二息人间缘务。不追寻俗人朋友亲戚知识。断绝人事往还。三息工巧技术缘务。不作世间工匠技术医方。禁咒卜相书数算计等事。四息学问缘务。读诵听学等悉皆弃舍。此为息诸缘务。所以者何。若多缘务。则行道事废心乱难摄。第五近善知识。善知识有三。一外护善知识。经营供养善能将护行人不相恼乱。二者同行善知识。共修一道互相劝发不相扰乱。三者教授善知识。以内外方便禅定法门示教利喜。略明五种缘务竟  &lt;p&gt;　　诃欲第二  &lt;p&gt;所言诃欲者。谓五欲也。凡欲坐禅修习止观。必须诃责。五欲者。是世间色声香味触。常能诳惑一切凡夫令生爱着。若能深知过罪。即不亲近是名诃欲。一诃色欲者。所谓男女形貌端严。修目长眉朱唇素齿。及世间宝物。青黄赤白红紫缥绿。种种妙色能令愚人见则生爱作诸恶业。如频婆娑罗王。以色欲故身入敌国。在淫女阿梵波罗房中。优填王以色染故截五百仙人手足。如此等种种过罪。二诃声欲者。所谓箜篌筝笛。丝竹金石音乐之声。及男女歌咏赞诵等声。能令凡夫闻即染着起诸恶业。如五百仙人雪山住。闻甄陀罗女歌声。即失禅定心醉狂乱。如是等种种因缘。知声过罪。三诃香欲者。所谓男女身香。世间饮食馨香及一切薰香等。愚人不了香相。闻即爱着开结使门。如一比丘在莲华池边。闻华香气心生爱乐。池神即大诃责。何故偷我香气。以着香故令诸结使卧者皆起。如是等种种因缘。知香过罪。四诃味欲者。所谓苦酸甘辛咸淡等。种种饮食肴膳美味。能令凡夫心生染着起不善业。如一沙弥染着酪味。命终之后生在酪中受其虫身。如是等种种因缘。知味过罪。五诃触欲者。男女身分柔软细滑。寒时体温热时体凉。及诸好触。愚人无智为之沉没起障道业。如一角仙。因触欲故遂失神通。为淫女骑颈。如是等种种因缘。知触过罪。如上诃欲之法。出摩诃衍论中说。复云哀哉众生常为五欲所恼。而犹求之不已。此五欲者得之转剧。如火益薪其焰转炽。五欲无乐如狗啮枯骨。五欲增诤如鸟竞肉。五欲烧人如逆风执炬。五欲害人如贱毒蛇。五欲无实如梦所得。五欲不久假借须臾如击石火。智者思之亦如怨贼。世人愚惑贪着五欲至死不舍。后受无量苦恼。此五欲法与畜生同有。一切众生常为五欲所使。名欲奴仆。坐此弊欲沈堕三涂。我今修禅复为障蔽。此为大贼急当远之。如禅经偈中说  &lt;p&gt;　生死不断绝　　贪欲嗜味故&lt;br&gt;　养冤入丘冢　　虚受诸辛苦&lt;br&gt;　身臭如死尸　　九孔流不净&lt;br&gt;　如厕虫乐粪　　愚人身无异&lt;br&gt;　智者应观身　　不贪染世乐&lt;br&gt;　无累无所欲　　是名真涅槃&lt;br&gt;　如诸佛所说　　一心一意行&lt;br&gt;　数息在禅定　　是名行头陀　  &lt;p&gt;　　弃盖第三  &lt;p&gt;所言弃盖者。谓五盖也。一弃贪欲盖。前说外五尘中生欲。今约内意根中生欲。谓行者端坐修禅。心生欲觉念念相续。覆盖善心。令不生长觉已应弃。所以者何。如术婆伽欲心内发。尚能烧身。况复心生欲火而不烧诸善法。贪欲之人去道甚远。所以者何。欲为种种恼乱住处。若心着欲无由近道。如除盖偈说  &lt;p&gt;　入道惭愧人　　持钵福众生&lt;br&gt;　云何纵尘欲　　沉没于五情&lt;br&gt;　已舍五欲乐　　弃之而不顾&lt;br&gt;　如何还欲得　　如愚自食吐&lt;br&gt;　诸欲求时苦　　得时多怖畏&lt;br&gt;　失时怀热恼　　一切无乐处&lt;br&gt;　诸欲患如是　　以何能舍之&lt;br&gt;　得深禅定乐　　即不为所欺　  &lt;p&gt;二弃嗔恚盖。嗔是失佛法之根本。坠恶道之因缘。法乐之冤家善心之大贼。种种恶口之府藏。是故行者于坐禅时思惟。此人现在恼我及恼我亲。赞叹我冤。思惟过去未来亦如是。是为九恼。故生嗔恨。嗔恨故生怨。以怨心生故便起心恼。彼如是嗔觉覆心。故名为盖。当急弃之无令增长。如释提婆那以偈问佛  &lt;p&gt;　何物杀安乐　　何物杀无忧&lt;br&gt;　何物毒之根　　吞灭一切善　  &lt;p&gt;佛以偈答言  &lt;p&gt;　杀嗔则安乐　　杀嗔则无忧&lt;br&gt;　嗔为毒之根　　嗔灭一切善　  &lt;p&gt;如是知已。当修慈忍以灭除之。令心清净。三弃睡眠盖。内心昏闇名为睡。五情闇蔽放恣。支节委卧睡熟为眠。以是因缘名为睡眠。盖能破今世后世实乐法心。及后世生天及涅槃乐。如是恶法最为不善。何以故。诸余盖情觉故可除。睡眠如死无所觉识。以不觉故难可除灭。如佛诸菩萨诃睡眠弟子。偈曰  &lt;p&gt;　汝起勿抱臭尸卧　　种种不净假名人&lt;br&gt;　如得重病箭入体　　诸苦痛集安可眠&lt;br&gt;　如人被缚将去杀　　灾害垂至安可眠&lt;br&gt;　结贼不灭害未除　　如共毒蛇同室居&lt;br&gt;　亦如临阵两刃间　　尔时云何安可眠&lt;br&gt;　眠为大闇无所见　　日日欺诳夺人明&lt;br&gt;　以眠覆心无所见　　如是大失安可眠　  &lt;p&gt;如是等种种因缘。诃睡眠盖。警觉无常。减损睡眠。令无昏覆。若昏睡心重。当用禅镇杖却之。四弃掉悔盖。掉有三种。一者身掉。身好游走诸杂戏谑。坐不暂安。二者口掉。好喜吟咏竞诤是非。无益戏论世间语言等。三者心掉。心情放逸。纵意攀缘。思惟文艺世间才技诸恶觉观等名为心掉。掉之为法破出家人。心如人摄心犹不能定。何况掉散。掉散之人如无钩醉象穴鼻骆驼不可禁制。如偈说  &lt;p&gt;　汝已剃头着染衣　　执持瓦钵行乞食&lt;br&gt;　云何乐着戏掉法　　放逸纵情失法利　  &lt;p&gt;既失法利又失世乐。觉其过已当急弃之。悔者悔能成盖。若掉无悔则不成盖。何以故。掉时未在缘中故。后欲入定时方悔。前所作忧恼覆心故名为盖。但悔有二种。一者因掉后生悔如前所说。二者如作大重罪人常怀怖畏。悔箭入心坚不可拔。如偈说  &lt;p&gt;　不应作而作　　应作而不作&lt;br&gt;　悔恼火所烧　　后世堕恶道&lt;br&gt;　若人罪能悔　　悔已莫复忧&lt;br&gt;　如是心安乐　　不应常念着&lt;br&gt;　若有二种悔　　若应作不作&lt;br&gt;　不应作而作　　是则愚人相&lt;br&gt;　不以心悔故　　不作而能作&lt;br&gt;　诸恶事已作　　不能令不作　  &lt;p&gt;五弃疑盖者。以疑覆心故。于诸法中不得信心。信心无故于佛法中空无所获。譬如有人入于宝山。若无有手无所能取。然则疑过甚多未必障定。今正障定疑者有三种。一者疑自。而作是念我诸根闇钝。罪垢深重非其人乎。自作此疑。定法终不得发。若欲修定勿当自轻。以宿世善根难测故。二者疑师。彼人威仪相貌如是。自尚无道何能教我。作是疑慢即为障定。欲除之法如摩诃衍论中说。如臭皮囊中金。以贪金故。不可弃其臭囊。行者亦尔。师虽不清净。亦应生佛想。三疑法。世人多执本心。于所受法不能即信敬心受行。若心生犹豫即法不染心。何以故。疑障之义如偈中说  &lt;p&gt;　如人在岐路　　疑惑无所趣&lt;br&gt;　诸法实相中　　疑亦复如是&lt;br&gt;　疑故不勤求　　诸法之实相&lt;br&gt;　见疑从痴生　　恶中之恶者&lt;br&gt;　善不善法中　　生死及涅槃&lt;br&gt;　定实真有法　　于中莫生疑&lt;br&gt;　汝若怀疑惑　　死王狱吏缚&lt;br&gt;　如师子抟鹿　　不能得解脱&lt;br&gt;　在世虽有疑　　当随喜善法&lt;br&gt;　譬如观岐道　　利好者应逐　  &lt;p&gt;佛法之中信为能入。若无信者虽在佛法终无所获。如是种种因缘。觉知疑过当急弃之。问曰不善法广尘数无量。何故但弃五法。答曰此五盖中即具有三毒等分。四法为根本。亦得摄八万四千诸尘劳门。一贪欲盖。即贪毒。二嗔恚盖。即嗔毒。三睡眠及疑。此二法是痴毒。四掉悔即是等分摄合为四分。烦恼一中有二万一千。四中合为八万四千。是故除此五盖。即是除一切不善之法。行者如是等种种因缘弃于五盖。譬如负债得脱。重病得差。如饥饿之人得至丰国如于恶贼中得自免济。安隐无患。行者亦如是。除此五盖。其心安隐清凉快乐。如日月以五事覆翳烟尘云雾罗睺阿修罗手障。则不能明照。人心五盖亦复如是  &lt;p&gt;　　调和第四  &lt;p&gt;夫行者初学坐禅。欲修十方三世佛法者。应当先发大誓愿。度脱一切众生。愿求无上佛道。其心坚固犹如金刚。精进勇猛不惜身命。若成就一切佛法终不退转。然后坐中正念思惟一切诸法真实之相。所谓善不善无记法。内外根尘妄识。一切有漏烦恼法。三界有为生死因果法。皆因心有。故十地经云。三界无别有。唯是一心作。若知心无性则诸法不实。心无染着则一切生死业行止息。作是观已。乃应如次起行修习也。云何名调和。今借近譬以况斯法。如世间陶师欲造众器。先须善巧调泥。令使不强不懦。然后可就轮绳。亦如弹琴前应调弦。令宽急得所。方可入弄出诸妙曲。行者修心亦复如是。善调五事必使和适。则三昧易生。有所不调多诸妨难。善根难发。一调食者。夫食之为法。本欲资身进道。食若过饱则气急。身满百脉不通。令心闭塞坐念不安。若食过少则。身羸心悬意虑不固此二皆非得定之道。若食秽触之物。令人心识昏迷。若食不宜之物则动宿病。使四大违反。此为修定之初。须深慎之也。故经云身安则道隆。饮食知节量。常乐在空闲。心静乐精进。是名诸佛教。二调睡眠者。夫眠是无明惑覆。不可纵之。若其眠寐过多非唯废修圣法。亦复丧失功夫。而能令心闇昧善根沉没。当觉悟无常调伏睡眠。令神气清白念心明净。如是乃可栖心圣境三昧现前。故经云。初夜后夜亦勿有废。无以睡眠因缘。令一生空过无所得也。当念无常之火烧诸世间。早求自度勿睡眠也。三调身。四调息。五调心。此三应合用不得别说。但有初中后。方法不同是则入住出相有异也。夫初欲入禅调身者。行人欲入三昧调身之宜。若在定外行住进止。动静运为。悉须详审。若所作粗犷则气息随粗。以气粗故则心散难录。兼复坐时烦愦心不恬怡。身虽在定外亦须用意。逆作方便后入禅时。须善安身得所。初至绳床即须先安坐处。每令安稳久久无妨。次当正脚。若半跏坐以左脚置右脚上。牵来近身。令左脚指与右髀齐。右脚指与左髀齐。若欲全跏即正右脚置左脚上。次解宽衣带周正。不令坐时脱落。次当安手以左手掌置右手上。重累手相对顿置左脚上。牵来近身当心而安。次当正身先当挺动其身并诸支节。作七八反如似按摩法。勿令手足差异。如是已则端直。令脊骨勿曲勿耸。次正头颈令鼻与脐相对。不偏不斜。不低不昂。平面正住。次当口吐浊气吐气之法开口放气。不可令粗急。以之绵绵恣气而出。想身分中百脉不通处。放息随气而出。闭口鼻纳清气。如是至三。若身息调和但一亦足。次当闭口唇齿才相拄着。舌向上齶。次当闭眼才令断外光而已。当端身正坐。犹如奠石。无得身首四肢切尔摇动。是为初入禅定调身之法。举要言之。不宽不急是身调相。四初入禅调息法者。息有四种相。一风二喘三气四息。前三为不调相。后一为调相。云何为风相。坐时则鼻中息出入觉有声是风也。云何喘相。坐时息虽无声而出入结滞不通是喘相也。云何气相。坐时息虽无声亦不结滞而出入不细是气相也。云何息相。不声不结不粗。出入绵绵若存若亡。资神安隐情抱悦豫。此是息相也。守风则散。守喘则结。守气则劳。守息即定。坐时有风喘气三相。是名不调而用心者。复为心患。心亦难定。若欲调之当依三法。一者下着安心。二者宽放身体。三者想气。遍毛孔出入通同无障。若细其心令息微微然。息调则众患不生。其心易定。是名行者初入定时调息方法。举要言之。不涩不滑是调息相也。五初入定时调心者。有三义。一入二住三出。初入有二义。一者调伏乱想不令越逸。二者当令沉浮宽急得所。何等为沈相。若坐时心中昏暗无所记录。头好低垂。是为沈相。尔时当系念鼻端。令心住在缘中无分散意此可治沈。何等为浮相。若坐时心好飘动身亦不安。念外异缘此是浮相。尔时宜安心向下。系缘脐中制诸乱念。心即定住则心易安静。举要言之不沈不浮。是心调相。其定心亦有宽急之相。定心急病相者。由坐中摄心用念。因此入定是故上向。胸臆急痛当宽放其心想。气皆流下患自差矣。若心宽病相者。觉心志散慢身好逶迤。或口中涎流或时闇晦。尔时应当敛身急念。令心住缘中。身体相持以此为治心。有涩滑之相推之可知。是为初入定调心方法。夫入定本是从粗入细。是以身既为粗。息居其中。心最为细静。调粗就细令心安静。此则入定初方便也。是名初入定时调二事也。二住坐中调三事者。行人当于一坐之时随时长短。十二时或经一时。或至二三时。摄念用心。是中应须善识身息心三事调不调相。若坐时向虽调身竟。其身或宽或急或偏或曲或低或昂。身不端直。觉已随正。令其安隐中无宽急。平直正住。复次一坐之中。身虽调和而气不调和。不调和相者。如上所说。或风或喘。或复气急。身中胀满当用前法随而治之。每令息道绵绵如有如无。次一坐中身息虽调。而心或浮沉宽急不定。尔时若觉当用前法调令中适。此三事的无前后。随不调者而调适之。令一坐之中。身息及心三事。调适无相乖越。和融不二此则能除宿患。妨障不生定道可克。三出时调三事者。行人若坐禅将竟。欲出定时。应前放心异缘开口放气。想从百脉随意而散。然后微微动身。次动肩膊及手头颈。次动二足悉令柔软。次以手遍摩诸毛孔。次摩手令暖以揜两眼。然后开之。待身热稍歇。方可随意出入。若不尔者坐或得住心。出既顿促则细法未散住在身中。令人头痛百骨节强。犹如风劳。于后坐中烦躁不安。是故心欲出定每须在意。此为出定调身息心方法。以从细出粗故。是名善入住出。如偈说  &lt;p&gt;　进止有次第　　粗细不相违&lt;br&gt;　譬如善调马　　欲住而欲去　  &lt;p&gt;法华经云。此大众诸菩萨等。已于无量千万亿劫。为佛道故勤行精进。善入住出无量百千万亿三昧。得大神通久修梵行。善能次第习诸善法  &lt;p&gt;　　方便行第五  &lt;p&gt;夫修止观。须具方便法门。有其五法。一者欲。欲离世间一切妄想颠倒。欲得一切诸禅智慧法门故。亦名为志。亦名为愿。亦名为好。亦名为乐。是人志愿好乐一切诸深法门故。故名为欲。如佛言曰。一切善法欲为其本。二者精进。坚持禁戒弃于五盖。初夜后夜专精不废。譬如钻火未热终不休息。是名精进善道法。三者念念世间为欺诳可贱。念禅定为尊重可贵。若得禅定即能具足。发诸无漏智一切神通道力。成等正觉广度众生。是为可贵。故名为念。四者巧慧。筹量世间乐。禅定智慧乐得失轻重。所以者何。世间之乐。乐少苦多虚诳不实。是失是轻。禅定智慧之乐。无漏无为寂然闲旷。永离生死。与苦长别是得是重。如是分别故名巧慧。五者一心。分明明见世间可患可恶。善识定慧功德可尊可贵。尔时应当一心决定修行止观。心如金刚天魔外道不能沮坏。设使空无所获终不回易。是名一心。譬如人行先须知道通塞之相。然后决定一心涉路而进。故说巧慧一心。经云。非智不禅非禅不智。义在此也  &lt;p&gt;　　正修行第六  &lt;p&gt;修止观者有二种。一者于坐中修。二者历缘对境修。一于坐中修止观者。于四威仪中亦乃皆得。然学道者坐为胜故。先约坐以明止观。略出五意不同。一对治初心粗乱修止观。所谓行者初坐禅时心粗乱故。应当修止以除破之。止若不破即应修观。故云对破初心粗乱修止观。今明修止观有二意。一者修止自有三种。一者系缘守境止。所谓系心鼻端脐间等处。令心不散。故经云。系心不放逸亦如猿着锁。二者制心止所谓随心所起即便制之不令驰散。故经云。此五根者心为其主。是故汝等当好止心。此二种皆是事相不须分别。三者体真止。所谓随心所念。一切诸法悉知从因缘生。无有自性。则心不取。若心不取则妄念心息。故名为止。如经中说云  &lt;p&gt;　一切诸法中　　因缘空无主&lt;br&gt;　息心达本源　　故号为沙门　  &lt;p&gt;行者于初坐禅时。随心所念一切诸法。念念不住。虽用如上体真止而妄念不息。当反观所起之心。过去已灭。现在不住。未来未至。三际穷之了不可得。不可得法则无有心。若无有心则一切法皆无。行者虽观心不住皆无所有。而非无刹那。任运觉知念起。又观此心念以内有六根外有六尘。根尘相对故有识生。根尘未对识本无生。观生如是观灭亦然。生灭名字但是假立。生灭心灭。寂灭现前了无所得。是所谓涅槃空寂之理。其心自止。起信论云。若心驰散即当摄来住于正念。是正念者当知唯心无外境界。即复此心亦无自相。念念不可得谓初心修学未便得住。抑之令住往往发狂。如学射法久习方中矣。二者修观有二种。一者对治观。如不净观对治贪欲。慈心观对治嗔恚。界分别观对治着我数息观对治多寻思等。此不分别也。二者正观。观诸法无相并是因缘所生。因缘无性即是实相。先了所观之境一切皆空。能观之心自然不起。前后之文多谈此理。请自详之。如经偈中说  &lt;p&gt;　诸法不牢固　　常在于念中&lt;br&gt;　已解见空者　　一切无想念　  &lt;p&gt;二对治心沉浮病修止观。行者于坐禅时。其心闇塞无记瞪瞢。或时多睡。尔时应当修观照了。若于坐中其心浮动轻躁不安。尔时应当修止止之。是则略说对治心沉浮病修止观相。但须善识药病相对用之。一一不得于对治有乖僻之失。三随便宜修止观。行者于坐禅时。虽为对治心沈故修于观照。而心不明净亦无法利。尔时当试修止止之。若于止时即觉身心安静。当知宜止。即应用止安心。若于坐禅时。虽为对治心浮动故修止。而心不住。亦无法利。当试修观。若于观中。即觉心神明净寂然安隐。当知宜观。即当用观安心。是则略说随便宜修止观相。但须善约便宜修之则心神安隐烦恼患息。证诸法门也。四对治定中细心修止观。所谓行者先用止观对破粗乱。乱心既息即得入定。定心细故觉身空寂受于快乐。或利便心发能以细心取于偏邪之理。若不知定心止息虚诳。必生贪着。若生贪着执以为实。若知虚诳不实。即爱见二烦恼不起。是为修止。虽复修止若心犹着爱见结业不息。尔时应当修观。观于定中细心。若不见定中细心。即不执着定见。若不执着定见。则爱见烦恼业悉皆摧灭。是名修观。此则略说对治定中细心修止观相。分别止观方法并同于前。但以破定见微细之失为异也。五为均齐定慧修止观。行者于坐禅中因修止故。或因修观而入禅定。虽得入定而无观慧。是为痴定。不能断结。或观慧微少。即不能发起真慧。断诸结使发诸法门。尔时应当修观破析则定慧均等。能断结使证诸法门。行者于坐禅时。因修观故而心豁然开悟。智慧分明而定心微少。心则动散。如风中灯照物不了。不能出离生死。尔时应当复修于止。以修止故则得定心。如密室中灯则能破暗照物分明。是则略说均齐定慧二法修止观也。行者若能如是于端身正坐之中。善用此五番修止观意。取舍不失其宜。当知是人善修佛法。能善修故必于一。生不空过也。复次第二明历缘对境修止观者。端身常坐乃为入道之胜要。而有累之身必涉事缘。若随缘对境而不修习止观。是则修心有间绝。结业触处而起。岂得疾与佛法相应。若于一切时中。常修定慧方便。当知是人必能通达一切佛法。云何名历缘修止观。所言缘者。谓六种缘。一行二住三坐四卧五作作(下祖卧切)六言语。云何名对境修止观。所言境者谓六尘境。一眼对色。二耳对声。三鼻对香。四舌对味。五身对触。六意对法。行者约此十二事中。修止观故名为历缘对境修止观也。一行者若于行时应作是念。我今为何等事欲行。为烦恼所使。及不善无记事行即不应行。若非烦恼所使。为善利益如法事即应行。云何行中修止。若于行时即知因于行故。则有一切烦恼善恶等法。了知行心及行中一切法皆不可得。则妄念心息。是名修止。云何行中修观。应作是念。由心动身。故有进趣。名之为行。因此行故。则有一切烦恼善恶等法。即当反观行心不见相貌。当知行者及行中。一切法毕竟空寂。是名修观。二住者。若于住时应作是念。我今为何等事欲住。若为诸烦恼及不善无记事住。即不应住。若为善利益事即应住。云何住中修止。若于住时即知因于住故。则有一切烦恼善恶等法。了知住心及住中一切法。皆不可得。则妄念心息。是名修止。云何住中修观。应作是念。由心驻身故名为住。因此住故则有一切烦恼善恶等法。则当反观住心。不见相貌。当知住者及住中一切法毕竟空寂。是名修观。三坐者。若于坐时应作是念。我今为何等事欲坐。若为诸烦恼及不善无记事等。即不应坐。为善利益事则应坐。云何坐中修止。若于坐时则当了知因于坐故。则有一切烦恼。善恶等法。而无一法可得。则妄念不生。是名修止。云何坐中修观。应作是念。由心所念垒脚安身。因此则有一切善恶等法故名为坐。反观坐心不见相貌。当知坐者及坐中。一切法毕竟空寂。是名修观四卧者。于卧时应作是念。我今为何等事欲卧若为不善放逸等事。则不应卧。若为调和四大故卧。则应如师子王卧。云何卧中修止。若于寝息则当了知因于卧故。则有一切善恶等法。而无一法可得则妄念不起。是名修止。云何卧中修观。应作是念。由于劳乏即便昏闇放纵六情。因此则有一切烦恼。善恶等法。即当反观卧心不见相貌。当知卧者及卧中。一切法毕竟空寂。是名修观。五作者。若作时应作是念。我今为何等事欲如此作。若为不善无记等事。即不应作。若为善利益事即应作。云何名作中修止。若于作时即当了知。因于作故则有一切善恶等法。而无一法可得则妄念不起。是名修止。云何名作时修观。应作是念。由心运于身。手造作诸事。因此则有一切善恶等法故名为作。反观作心不见相貌。当知作者及作中一切法毕竟空寂。是名修观。六语者。若于语时应作是念。我今为何等事欲语。若随诸烦恼。为论说不善无记等事而语。即不应语。若为善利益事即应语。云何名语中修止。若于语时即知因此语故。则有一切烦恼善恶等法。了知语心及语中一切烦恼。善不善法皆不可得。则妄念心息。是名修止。云何语中修观。应作是念。由心觉观鼓动气息。冲于咽喉唇舌齿齶故出音声语言。因此语故则有一切善恶等法。故名为语。反观语心不见相貌。当知语者及语中。一切法毕竟空寂。是名修观。如上六义修习止观随时相应用之。一一皆有前五番修止观意。如上所说。次六根门中修止观者。一眼见色时修止者。随见色时如水中月无有定实。若见顺情之色不起贪爱。若见违情之色不起嗔恼。若见非违非顺之色。不起无明及诸乱想。是名修止。云何名眼见色时修观。应作是念。随有所见即相空寂。所以者何。于彼根尘空明之中。各无所见亦无分别。和合因缘出生眼识。次生意识。即能分别种种诸色。因此则有一切烦恼善恶等法。即当反观念色之心不见相貌。当知见者及一切法。毕竟空寂。是名修观。二耳闻声时修止者。随所闻声即知声如响相。若闻顺情之声不起爱心。违情之声不起嗔心。非违非顺之声。不起分别心。是名修止。云何闻声中修观。应作是念。随所闻声空无所有。但从根尘和合生于耳识。次意识生强起分别。因此即有一切烦恼善恶等法。故名闻声。反观闻声之心。不见相貌。当知闻者及一切法。毕竟空寂。是名为观。三鼻嗅香时修止者。随所闻香即知如焰不实。若闻顺情之香不起着心。违情之臭不起嗔心。非违非顺之香不生乱念。是名修止。云何名闻香中修观。应作是念。我今闻香虚诳无实。所以者何。根尘合故而生鼻识。次生意识强取香相。因此则有一切烦恼善恶等法。故名闻香。反观闻香之心。不见相貌。当知闻香及一切法毕竟空寂。是名修观。四舌受味时修止者。随所受味即知如于梦幻中得味。若得顺情美味不起贪着。违情恶味不起嗔心。非违非顺之味。不起分别意想。是名修止。云何名舌受味时修观。应作是念。今所受味实不可得。所以者何。内外六味性无分别。因内舌根和合则舌识生。次生意识强取味相。因此则有一切烦恼善恶等法。反观缘味之识不见相貌。当知受味者及一切法。毕竟空寂。是名修观五身受触时修止者。随所觉触即知如影幻化不实。若受顺情乐触不起贪着。若受违情苦触不起嗔恼。受非违非顺之触。不起忆想分别。是名修止。云何身受触时修观。应作是念。轻重冷暖涩滑等法。名之为触。头等六分名之为身。触性虚假身亦不实。和合因缘即生身识。次生意识忆想分别苦乐等相。故名受触。反观缘触之心不见相貌。当知受触者及一切法。毕竟空寂。是名修观。六意知法中修止观相。如初坐中已明讫。自上依六根。修止观相。随所意用而用之。一一具上五番之意。是中已广分别。今不重辨。行者若能于行住坐卧。见闻觉知等一切处中。修止观者。当知是人真修摩诃衍道。如大品经云。佛告须菩提。若菩萨行时知行。坐时知坐。乃至服僧伽梨。视眴一心出入禅定。当知是人名菩萨摩诃衍。复次若人能如是。一切处中修行大乘。是人则于世间最胜最上。无与等者。释论偈中说  &lt;p&gt;　闲坐林树间　　寂然灭诸恶&lt;br&gt;　憺怕得一心　　斯乐非天乐&lt;br&gt;　人求世间利　　名衣好床褥&lt;br&gt;　斯乐非安隐　　求利无厌足&lt;br&gt;　衲衣在空闲　　动止心常一&lt;br&gt;　自以智慧明　　观诸法实相&lt;br&gt;　种种诸法中　　皆以等观入&lt;br&gt;　解慧心寂然　　三界无伦匹　  &lt;p&gt;　　善根发第七  &lt;p&gt;行者若能如是。从假入空观中。善修止观者。则于坐中身心明净。尔时当有种种善根开发。应须识知。今略明善根发相。有二种不同。一外善根发相。所谓布施持戒孝顺父母尊长。供养三宝及诸听学等。善根开发。此是外事。若非正修。与魔境相滥。今不分别。二内善根发相。所谓诸禅定法门善根开发。有三种意。第一明善根发相有五种不同。一息道善根发相。行者善修止观故。身心调适妄念止息。因是自觉其心渐渐入定。发于欲界及未到地等定。身心泯然空寂定心安隐。于此定中都不见有身心相貌。于后或经一坐二坐。乃至一日二日。一月二月。将息不得不退不失。即于定中忽觉身心运动八触而发者。所谓觉身痛痒冷暖轻重涩滑等。当触发时身心安定虚微悦豫。快乐清净不可为喻。是为知息道根本禅定善根发相。行者或于欲界未到地中。忽然觉息出入长短。遍身毛孔皆悉虚疏。即以心眼见身内三十六物。犹如开仓见诸麻豆等。心大惊喜。寂静安快。是为随息特胜善根发相。二不净观善根发相。行者若于欲界未到地定。于此定中身心虚寂。忽然见他男女身死。死已膖胀烂坏虫脓流出。见白骨狼藉。其心悲喜厌患所爱。此为九想善根发相。或于静定之中。忽然见内身不净。外身膖胀狼藉。自身白骨从头至足。节节相拄。见是事已。定心安隐惊悟无常。厌患五欲不着我人。此是背舍善根发相。或于定心中。见于内身及外身。一切飞禽走兽。衣服饮食屋舍山林。皆悉不净。此为大不净善根发相。三慈心善根发相。行者因修止观故。若得欲界未到地定于此定中忽然发心慈念众生。或缘亲人得乐之相。即发深定。内心悦乐清净不可为喻。中人怨人乃至十方五道众生。亦复如是。从禅定起其心悦乐。随所见人颜色常和。是为慈心善根发相。悲喜舍心发相。类此可知也。四因缘观善根发相。行者因修止观故。若得欲界未到地。身心静定。忽然觉悟心生。推寻三世无明行等诸因缘中不见人我。即离断常。破诸执见。得定安隐解慧开发。心生法喜不念世间之事。乃至五阴十二处十八界中。分别亦如是。是为因缘观善根发相。五念佛善根发相。行者因修止观故。若得欲界未到地定。身心空寂。忽然忆念诸佛功德相好。不可思议所有十力。无畏。不共。三昧。解脱等法。不可思议神通变化。无碍说法广利众生。不可思议。如是等无量功德。不可思议。作是念时即发爱敬心生。三昧开发身心快乐。清净安隐无诸恶相。从禅定起身体轻利。自觉功德巍巍人所爱敬。是为念佛三昧善根发相。复次行者因修止观故。若得身心澄净。或发无常苦空无我不净。世间可厌食不净相。死离尽想。念佛法僧戒舍天。念处正勤如意根力觉道。空无相无作。六度诸波罗蜜神通变化等。一切法门发相。是中应广分别。故经云。制心一处无事不办。二分别真伪者。有二。一者辨邪伪禅发相。行者若发如上诸禅时。随因所发之法或身搔动。或时身重如物镇压。或时身轻欲飞。或时如缚。或时逶迤垂熟。或时煎寒。或时壮热。或见种种诸异境界。或时其心闇蔽。或时起诸恶觉。或时念外散乱诸杂善事。或时欢喜躁动。或时忧愁悲思。或时恶触身毛惊竖。或时大乐昏醉。如是种种邪法。与禅俱发。名为邪伪。此之邪定若人爱着。即与九十五种鬼神法相应。多好失心颠狂。或时诸鬼神等知人念着其法。即加势力令发诸邪定。邪智辩才神通惑动世人。凡愚见者谓得道果皆悉信伏。而其内心颠倒专行鬼法惑乱世间。是人命终永不值佛。还堕鬼神道中。若坐时多行恶法。即堕地狱。行者修止观时。若证如是等禅有此诸邪伪相。当即却之。云何却之。若知虚诳正心不受不着即当谢灭。应用正观破之即当灭矣。二者辨真正禅发相。行者若于坐中发诸禅时。无有如上所说诸邪法等。随一一禅发时。即觉与定相应。空明清净内心喜悦憺然快乐。无有覆盖。善心开发信敬增长。智鉴分明身心柔软微妙虚寂。厌患世间无为无欲出入自在。是为正禅发相。譬如与恶人共事恒相触恼。若与善人共事久见其美。分别邪正二种禅发之相。亦复如是。三明用止观长养诸善根者。若于坐中诸善根发时。应用止观二法修令增进。若宜用止则以止修之。若宜用观则以观修之。具如前说略示大意矣  &lt;p&gt;　　觉知魔事第八  &lt;p&gt;梵音魔罗。秦言杀者。夺行人功德之财。杀行人智慧之命。是故名之为恶魔。事者如佛以功德智慧。度脱众生入涅槃为事。魔常以破坏众生善根。令流转生死为事。若能安心正道。是故道高方知魔盛。仍须善识魔事。但有四种。一烦恼魔二阴入界魔三死魔。四鬼神魔。三种皆是世间之常事。及随人自心所生。当须自心正除遣之。今不分别鬼神魔相。此事须知。今当略说。鬼神魔有三种。一者精魅。十二时兽变化作种种形色。或作少女老宿之形。乃至可畏身等非一。恼惑行人。此诸精魅欲恼行人。各当其时而来。善须别识若于寅时来者必是虎兽等。若于卯时来者必是兔鹿等。若于辰时来者必是龙鳖等。若于已时来者必是蛇蟒等。若于午时来者必是马驴驼等。若于未时来者必是羊等。若于申时来者必是猿猴等。若于酉时来者必是鸡乌等。若于戌时来者必是狗狼等。若于亥时来者必是猪等。子时来者必是鼠等。丑时来者必是牛等。行者若见常用此时来。即知其兽精。说其名字诃责即当谢灭。二者堆剔鬼。亦作种种恼触行人。或如虫蝎缘人头面。钻刺熠熠或击枥人两腋下。或乍抱持于人。或言说音声喧闹。及作诸兽之形异相非一。来恼行人。应即觉知一心闭目阴而骂之作是言。我今识汝汝是阎浮提中食火臭香。偷腊吉支邪。见喜破戒种。我今持戒终不畏汝。若出家人应诵戒本。若在家人应诵三归五戒等。鬼便却行匍匐而去。如是若作种种留难恼人相貌。及余断除之法。并如禅经中广说。三者魔恼。是魔多化作三种五尘境界。相来破善心。一作违情事则可畏五尘令人恐惧。二作顺情事则可爱五尘令人心着。三非违非顺事。则平等五尘动乱行者。是故魔名杀者。亦名华箭。亦名五箭。射人五情故。名色中作种种境界。惑乱行人。作顺情境者。或作父母兄弟。诸佛形像端正男女可爱之境。令人心着。作违情境界者。或作虎狼师子罗刹之形。种种可畏之像。来怖行人。作非违非顺境者。则平常之事。动乱人心令失禅定。故名为魔。或作种种好恶之音声。作种种香臭之气。作种种好恶之味。作种种苦乐境界。来触人身皆是魔事。其相众多。今不具说。举要言之。若作种种五尘。恼乱于人令失善法。起诸烦恼皆是魔军。以能破坏平等佛法。令起贪欲忧愁嗔恚睡眠等。诸障道法。如经偈中说  &lt;p&gt;　欲是汝初军　　忧愁为第二&lt;br&gt;　饥渴第三军　　渴爱为第四&lt;br&gt;　睡眠第五军　　怖畏为第六&lt;br&gt;　疑悔第七军　　嗔恚为第八&lt;br&gt;　利养虚称九　　自高慢人十&lt;br&gt;　如是等众军　　压没出家人&lt;br&gt;　我以禅智力　　破汝此诸军&lt;br&gt;　得成佛道已　　度脱一切人　  &lt;p&gt;行者既觉知魔事即当却之。却法有二。一者修止却之。凡见一切外诸恶魔境。悉知虚诳不忧不怖。亦不取不舍。妄计分别息心寂然彼自当灭。二者修观却之。若见如上所说种种魔境。用止不去即当反观。能见之心不见处所。彼何所恼。如是观时寻当灭谢。若迟迟不去但当正心。勿生惧想不惜躯命。正念不动。知魔界如即佛界如。若魔界如佛界如。一如无二如。如是了知。则魔界无所舍。佛界无所取。佛法自当现前。魔境自然消灭。复次若见魔境不谢。不须生忧。若见灭谢亦勿生喜。所以者何。未曾见有人坐禅见魔化作虎狼来食人。亦未曾见魔化作男女来为夫妇。当其幻化。愚人不了。心生惊怖及起贪着。因是心乱失定发狂。自致其患。皆是行人无智受患。非魔所为。若诸魔境恼乱行人。或经年月不去。但当端心正念坚固不惜身命。莫怀忧惧。当诵大乘方等诸经治魔咒。默念诵之。存念三宝。若出禅定亦当诵咒。自防忏悔惭愧及诵。波罗提木叉。邪不干正久久自灭。魔事众多说不可尽。善须识之。是故初心行人。必须亲近善知识。为有如此等难事。是魔入人心能令行者。心神狂乱。或喜或忧因是成患致死。或时令得诸邪禅定智慧。神通陀罗尼。说法教化人皆信伏后即坏人出世善事。及破坏正法。如是等诸异非一说不可尽。今略示其要。为令行人于坐禅中。不妄受诸境界。取要言之若欲遣邪归正当观诸法实相。善修止观无邪不破。故释论云。除诸法实相。其余一切皆是魔事。如偈中说  &lt;p&gt;　若分别忆想　　即是魔罗网&lt;br&gt;　不动不分别　　是则为法印　  &lt;p&gt;　　治病第九  &lt;p&gt;行者安心修道。或四大有病。因今用观心息鼓击发动本病。或时不能善调适身心息三事。内外有所违犯故有病患。夫坐禅之法若能善用心者。则四百四病自然除差。若用心失所。则四百四病因之发生。是故若自行化他。应当善识病源善知坐中内心治病方法。一旦动病非唯行道有障。则大命虑失。今明治病法。中有二意。一明病发相。二明治病方法。一明病发相者。病发虽复多途略出不过二种。一者四大增损病相。若地大增者则肿结沉重身体枯瘠。如是等百一患生。若水大增者。则痰阴胀满食饮不消。腹痛下痢等百一患生。若火大增者。即煎寒壮热。支节皆痛口气大小便痢不通等。百一患生。若风大增者则身体虚悬。战掉疼痛肺闷胀急。呕逆气急如是等。百一患生。故经云。一大不调百一病起。四大不调四百四病。一时俱动。四大病发各有相貌。当于坐时及梦中察之。二者五藏生患之相。从心生患者。身体寒热。及头痛口燥等。心主口故。从肺生患者。身体胀满。四支烦疼心闷鼻塞等。肺主鼻故。从肝生患者。多无喜心忧愁不乐悲思嗔恚。头痛眼闇昏闷等。肝主眼故。从脾生患者。身体面上游风。遍身[病-丙+習]痒疼痛饮食失味等脾主舌故。从肾生患者。咽喉曀塞。腹胀耳聋等。肾主耳故。五藏生病众多各有其相。当于坐时及梦中察之可知。如是四大五藏。病患因起非一。病相众多不可具说。行者若欲修止观法门。脱有患生。应当善知因起。此二种病通因内外发动。若外伤寒冷风热。饮食不消而病。从二处发者。当知因外发动若由用心不调。观行违僻。或因定法发时不知取与而致此二处患生。此因内发病相。复次有三种得病因缘不同。一者四大五藏增损得病如前说。二者鬼神所作得病。三者业报得病。如是等病初得即治甚易得差。若经久则病成。身羸病结治之难愈。二明治病方法者。既深知病源起发。当作方法治之。治病之法乃有多途。举要言之。不出止观二种方便。云何用止治病相。有师言。但安心止。在病处即能治病。所以者何。心是一期果报之主。譬如王有所至处群贼迸散。次有师言。脐下一寸名忧陀那。此云丹田。若能止心守此不散。经久即多有所治。有师言。常止心足下。莫问行住寝卧即能治病。所以者何。人以四大不调故。多诸疾患此由心识上缘故。令四大不调。若安心在下。四大自然调适众病除矣。有师言。但知诸法空无所有不取病相。寂然止住多有所治。所以者何。由心忆想。鼓作四大故有病生。息心和悦众病即差。故净名经云。何为病本所谓攀缘。云何断攀缘谓心无所得。如是种种说用止治病之相非一。故知善修止法能治众病。次明观治病者。有师言。但观心想。用六种气。治病者即是观能治病。何等六种气。一吹。二呼三嘻。四呵。五嘘。六呬。此六种息皆于唇口之中想心。方便转侧而作绵微。而用颂曰  &lt;p&gt;　心配属呵肾属吹　　脾呼肺呬圣皆知&lt;br&gt;　肝藏热来嘘字至　　三焦壅处但言嘻　  &lt;p&gt;有师言。若能善用观想运。作十二种息能治众患。一上息。二下息。三满息。四焦息。五增长息。六灭坏息。七暖息。八冷息。九冲息。十持息。十一和息。十二补息。此十二息皆从观想心生。今略明十二息对治之相。上息治沉重。下息治虚悬。满息治枯瘠。焦息治肿满。增长息治羸损。灭坏息治增盛。暖息治冷。冷息治热。冲息治壅塞不通。持息治战动。和息通治四大不和。补息资补四大衰。善用此息可以遍治众患。推之可知。有师言。善用假想观。能治众病如人患冷。想身中火气起即能治冷。此如杂阿含经。治病秘法七十二种法中广说。有师言。但用止观。检析身中四大病不可得。心中病不可得众病自差。如是等种种说。用观治病。应用不同善得其意皆能治病。当知止观二法。若人善得其意则无病不治也。但今时人根机浅钝作此观想多不成就。世不流传。又不得于此更学气术休粮恐生异见。金石草木之药。与病相应亦可服饵。若是鬼病当用强心加咒以助治之。若是业报病。要须修福忏悔患则消灭。此一种治病之法。若行人善得一意即可自行兼他。况复具足通达。若都不知则病生无治。非唯废修正法。亦恐性命有虞。岂可自行教人。是故欲修止观之者。必须善解内心治病方法。其法非一得意在人岂可传于文耳。复次用心坐中治病。仍须更兼具十法无不有益。十法者。一信。二用三勤。四常住缘中。五别病因法。六方便。七久行。八知取舍。九持护。十识遮障。云何为信。谓信此法必能治病。何为用谓随时常用。何为勤。谓用之专精不息。取得差为度。何为住缘中。谓细心念念依法。而不异缘。何为别病。因起如上所说。何为方便。谓吐纳运心缘想善巧成就。不失其宜。何为久行。谓若用之未即有益。不计日月常习不废。何为知取舍。谓知益即勤有。损即舍之。微细转心调治。何为持护。谓善识异缘触犯。何为遮障。谓得益不向外说未损不生疑谤。若依此十法所治。必定有效不虚者也  &lt;p&gt;　　证果第十  &lt;p&gt;若行者如是修止观时。能了知一切诸法皆由心生。因缘虚假不实故空。以知空故。即不得一切诸法名字相。则体真止也。尔时上不见佛果可求。下不见众生可度。是名从假入空观。亦名二谛观。亦名慧眼。亦名一切智。若住此观即堕声闻辟支佛地。故经云。诸声闻众等自叹言。我等若闻净佛国土。教化众生心不喜乐。所以者何。一切诸法皆悉空寂。无生无灭无大无小无漏无为。如是思惟不生喜乐。当知若见无为入正位者。其人终不能发三菩提心。此即定力多故不见佛性。若菩萨为一切众生。成就一切佛法。不应取着无为而自寂灭。尔时应修从空入假观。则当谛观心性虽空缘对之时。亦能出生一切诸法。犹如幻化虽无定实。亦有见闻觉知等相。差别不同。行者如是观时。虽知一切诸法毕竟空寂。能于空中修种种行。如空中种树。亦能分别众生诸根。性欲无量故则说法无量。若能成就无碍辩才。则能利益六道众生。是名方便随缘止。乃是从空入假观。亦名平等观。亦名法眼。亦名道种智。住此观中智慧力多故。虽见佛性而不明了。菩萨虽复成就此二种观。是名方便观门非正观也。故经云前二观为方便道。因是二空观。得入中道第一义观。双照二谛心心寂灭。自然流入萨婆若海。若菩萨欲于一念中具足一切佛法。应修息二边分别止行于中道正观。云何修正观。若体知心性非真非假。息缘真假之心名之为正。谛观心性非空非假。而不坏空假之法。若能如是照了。则于心性。通达中道圆照二谛。若能于自心见中道二谛。则见一切诸法中道二谛亦不取中道二谛。以决定性不可得故。是名中道正观。如中论偈中说  &lt;p&gt;　因缘所生法　　我说即是空&lt;br&gt;　亦名为假名　　亦名中道义　  &lt;p&gt;深寻此偈意。非惟具足分别中观之相。亦是兼明前二种方便观门旨趣。当知中道正观则是佛眼。一切种智。若住此观则定慧力等。了了见佛性。安住大乘行步平正。其疾如风。自然流入萨婆若海。行如来行。入如来室。着如来衣。坐如来座则以如来庄严而自庄严。获得六根清净入佛境界。于一切法无所染着。一切佛法皆现在前。成就念佛三昧。安住首楞严定。则是普现色身三昧。普入十方佛土教化众生。严净一切佛刹。供养十方诸佛。受持一切诸佛法藏。具足一切诸行波罗蜜。悟入大菩萨位。则与普贤文殊为其等侣。常住法性身中。则为诸佛称叹授记。则是庄严兜率陀天。示现降神母胎出家诣道场。降魔怨成正觉转法轮入涅槃。于十方国土究竟一切佛事。具足真应二身。则是初发心菩萨也。华严经中。初发心时便成正觉。了达诸法真实之性。所有慧身不由他悟。亦云。初发心菩萨。得如来一身作无量身。亦云。初发心菩萨即是佛。涅槃经云。发心毕竟二不别。如是二心前心难。大品经云。须菩提有菩萨摩诃萨。从初发心即坐道场。转正法轮当知则是菩萨为如佛也。法华经中。龙女所献珠为证。如是等经皆明初心具足一切佛法。即是大品经中阿字门。即是法华经中为令众生开佛知见。即是涅槃经中见佛性故住大涅槃。已略说初心菩萨因修止观证果之相。次明后心证果之相。后心所证境界则不可知。今推教所明。终不离止观二法。所以者何。如法华经云。殷勤称叹诸佛智慧则观义。此即约观以明果也。涅槃经。广辩百句解脱以释大涅槃者。涅槃则止义。是约止以明果也。故云。大般涅槃名常寂定。定者即是止义。法华经中。虽约观明果则摄于止。故云。乃至究竟涅槃。常寂灭相终归于空。涅槃中虽约止明果。则摄于观。故以三德为大涅槃。此二大经。虽复文言出没不同。莫不皆约止观二门。辨其究竟并据定慧两法。以明极果。行者当知初中后果。皆不可思议故。新译金光明经云。前际如来不可思议。中际如来种种庄严。后际如来常无破坏。皆约修止观二心。以辨其果。故般舟三昧经中偈云  &lt;p&gt;　诸佛从心得解脱　　心者清净名无垢&lt;br&gt;　五道鲜洁不受色　　有学此者成大道　  &lt;p&gt;誓愿所行者须除三障五盖。如或不除虽勤用功终无所益  &lt;p&gt;修习止观坐禅法要(终)  &lt;p&gt;　　始终心要  &lt;p&gt;　　　　荆溪尊者述  &lt;p&gt;夫三谛者。天然之性德也。中谛者。统一切法。真谛者。泯一切法。俗谛者。立一切法。举一即三非前后也。含生本具。非造作之所得也。悲夫。秘藏不显盖三惑之所覆也。故无明翳乎法性。尘沙障乎化导。见思阻乎空寂。然兹三惑乃体上之虚妄也。于是大觉慈尊喟然叹曰。真如界内绝生佛之假名。平等慧中无自他之形相。但以众生妄想不自证。得莫之能返也。由是立乎三观。破乎三惑。证乎三智。成乎三德。空观者。破见思惑。证一切智成般若德。假观者。破尘沙惑。证道种智成解脱德。中观者。破无明惑证一切种智成法身德。然兹三惑三观三智三德。非各别也。非异时也。天然之理具诸法故。然此三谛性之自尔。迷兹三谛转成三惑。惑破藉乎三观。观成证乎三智。智成成乎三德。从因至果非渐修也。说之次第。理非次第。大纲如此。纲目可寻矣  &lt;p&gt;　　止观坐禅法要记  &lt;p&gt;　　　　宋忠肃公陈瓘莹中  &lt;p&gt;本自不动何止之有。本自不蔽何观之有。众生迷荡去本日远。动静俱失不昏即散。此二病本出生众苦。令彼离苦而获安隐。当用止观以为其药。病瘳药废医亦不立。则止观者乃假名字。即假即空言语道断。以大悲故无说而说。此摩诃止观之所为作也。然其文义深广汪洋无涯。譬如大海孰得其际。以大悲故复作方便。使尝一滴知百川味。使由一沤见全潮体。故于大经之外。又为此书词简旨。要读之易晓。应病之药尽在是矣。善用药者不治己病。止乎其未散。观乎其未昏。方止方观而未尝昏未尝散也。如鸟双翼。如车两轮。穷远极高无往不可及。其至也不出于此。呜呼不知则已。知止观之可以入道者。可不勉哉  &lt;p&gt;　　天台止观统例  &lt;p&gt;　　　　翰林学士守右补阙安定梁肃述  &lt;p&gt;夫止观何为也。导万法之理。而复于实际者也。实际者。何也性之本也。物之所以不能复者。昏与动使之然也。照昏者谓之明。驻动者谓之静。明与静止观之体也。在因谓之止观。在果谓之智定。因谓之行果谓之成。行者行此者也。成者证此者也。原夫圣人有以见惑足以丧志。动足以失方。于是乎止而观之。静而明之。使其动而能静。静而能明。因相待以成法。即绝待以照本。立大车以御正乘。大事而总权消息乎。不二之场鼓。舞于说三之域。至微以尽性。至颐以体神。语其近则一毫之善可通也。语其远则重玄之门可窥也。用至圆以圆之物无偏也。用至实以实之物无妄也。圣人举其言所以示也。广其目所以告也。优而柔之使自求之。拟而议之。使自至之。此止观所由作也。夫三谛者何也。一之谓也。空假中者何也。一之目也。空假者。相对之义。中道者。得一之名。此思议之说非至一之旨也。至一即三。至三即一非相含而然也。非相生而然也。非数义也。非强名也。自然之理也。言而传之者迹也。理谓之本。迹谓之末。本也者。圣人所至之地也。末也者。圣人所示之教也。由本以垂迹。则为小为大为通为别。为顿为渐为显为秘。为权为实为定为不定。循迹以返本则为一为大。为圆为实为无住为中。为妙为第一义。是三一之蕴也。所谓空也者。通万法而为言者也。假也者。立万法而为言者也。中也者。妙万法而为言者也。破一切惑莫盛乎空。建一切法莫盛乎假。究竟一切性莫大乎中。举中则无法非中。目假则何法非假。举空则无法不空。成之谓之三德。修之谓之三观。举其要则圣人极深研几穷理尽性之说乎。昧者使明。塞者使通通则悟。悟则至。至则常。常则尽矣。明则照。照则化。化则成。成则一矣。圣人有以弥纶万法而不差。旁礴万劫而不遗。焘载恒沙而不有复归。无物而不无寓。名之曰佛。强号之曰觉。究其旨其解脱自在。莫大极妙之德乎。夫三观成功者如此。所谓圆顿者。非渐次非不定。指论十章之义也。七章者。恢演始末通道之关也。五略者。举其宏纲截流之津也。十境者。发动之机立观之谛也。十乘者。妙用所修发行之门也。止于正观而终于见境者义备故也。阙其余者非修之要也。乘者何也。载万物而运者也。十者。何也成载之事者也。知其境之妙不行而至者德之上也。乘一而已矣。岂藉夫九哉。九者。非他相生之说。未至者之所践也。故发心者。发无所发。安心者。安无所安。破遍者。破无所破。爰至余乘皆不得已而说也。至于别其义例判为章目。推而广之不为繁。统而简之不为少。如连环不可解也。如贯珠不可杂也。如悬镜不可弇也。如通川不可遏也。义家多门非诤论也。按经证义非虚说也。辩四教浅深事有源也。成一事因缘理无遗也。噫止观其救世明道之书乎。非夫圣智超绝卓尔独立。其孰能为乎。非夫聪明深达得意忘象。其孰能知乎。今之人乃专用章句文字从而释之。又何疏漏耶。或称不思议境。与不思议事皆极圣之域。等觉至人犹所未尽。若凡夫生灭心行三惑。浩然于言说之中。推上妙之理。是犹醯鸡而说大鹏。夏虫之议层冰。其不可见明矣。今止观之说文字万数广论果地。无益初学。岂如暗然自修功至自至。何必以早计为事乎。是大不然。凡所为上圣之域。岂隔阔辽夐与凡境杳绝欤。是唯一性而已。得之为悟。失之为迷。一理而已。迷而为凡。悟而为圣。迷者自隔。理不隔也。失者自失。性不失也。止观之作所以离异同而究圣神。使群生正性而顺理者也。正性顺理所以行觉路而至妙境也。不知此教者。则学何所入。功何所施。智何所发。譬如无目昧于日月之光。行于重险之处。颠踣堕落可胜既乎。噫去圣久远。贤人不出。庸昏之徒含识而已。致使魔邪诡惑。诸党并炽。空有云云。为沈为穿。有胶于文句不敢动者有流于[漭-廾+卉]浪不能住者。又太远而甘心不至者。有太近而我身即是者。有枯木而称定者。有窍号而称慧者。有奔走非道而言权者。有假于鬼而言通者。有放心而言广者。有罕言而为密者。有齿舌潜传为口诀者。凡此之类自立为祖。继祖为家。反经非圣昧者不觉。仲尼有言。道之不明也。我知之矣。由物累也悲夫。隋开皇十八年。智者大师去世。至皇朝建中垂二百载。以斯文相传凡五家师。其始曰灌顶。其次曰晋云威。又其次曰东阳小威。又其次曰左溪朗公。其五曰荆溪然公。顶于同门中慧解第一。能奉师训集成此书。盖不以文辞为本故也。或失则烦。或得则野。当二威之际缄授而已。其道不行。天宝中左溪。始弘解说。而知者盖寡。荆溪。广以传记数十万言。网罗遗法勤矣备矣。荆溪灭后知其说者适三四人。古人云。生而知之者上。学而知之者次。困而学之又其次。夫生而知之者。盖性德者也。学而知之者。天机深者也。若嗜欲深耳目塞。虽学而不知斯为下矣。今夫学者。内病于蔽。外役于烦。没世不能通其文。数年不能得其益则业。文为之屡校梏足也。棼句为之簸糠眯目也。以不能谕之。师教不领之弟子。止观所以未光大于时也。予常戚戚于是整其宏纲。撮其机要。其理之所存。教之所急。或易置之或引伸之。其义之迂。其辞之鄙。或薙除之或润色之。大凡浮疏之患十愈其九。广略之宜三存其一。是祛鄙滞道蒙童。贻诸他人则吾岂敢。若同见同行且不以止观罪我。亦无隐乎尔。建中上元甲子首事笔削三岁。岁在析木之津。功毕云尔&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1711333523425955962&amp;page=RSS%3a+%e7%ab%a5%e8%92%99%e6%ad%a2%e8%a7%82&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=riceballl.spaces.live.com&amp;amp;GT1=riceballl"&gt;</description><category>Tao</category><comments>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!249.entry#comment</comments><guid isPermaLink="true">http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!249.entry</guid><pubDate>Fri, 22 Feb 2008 05:54:18 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://riceballl.spaces.live.com/blog/cns!E8401F3A3BFA6F86!249/comments/feed.rss</wfw:commentRss><wfw:comment>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!249.entry#comment</wfw:comment><dcterms:modified>2008-02-22T05:54:18Z</dcterms:modified></item><item><title>Continuation 概念与协程(CoRoutine)</title><link>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!246.entry</link><description>&lt;p&gt;所谓Continuation就是保存接下来要做的事情的内容(the rest of the computation)。举个简单例子，我在写文档，突然接到电话要外出，这时我存档，存档的数据就是Continuation(继续即将的写作)，然后等会儿回来，调入存档，继续写作。Continuation这个概念就协程来说就是协程保护的现场。而对于函数来说就是保存函数调用现场——Stack Frame值和寄存器，以供以后调用继续从Continuation处执行。换一个角度看，它也可以看作是非结构化Goto语句的函数表达。当我们执行Yield从协程返回的时候，需要保存的就是Continuation了。从理论研究的角度上来说Continuation即是对程序&amp;quot;接下来要做的事情&amp;quot;所进行的一种建模，从而能对之作进一步的分析。Continuation是对未来的完整描述，这对于理论分析而言是有很多方便的地方。实际上任何程序都可以通过CPS(Continuation Passing Style)类型转换为使用Continuation的形式。如：&lt;br&gt; &lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#0000FF"&gt;function&lt;/span&gt;&lt;span style="color:#000000"&gt; foo(x: integer);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  Result :&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; x &lt;/span&gt;&lt;span style="color:#000000"&gt;+&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;; 

&lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;foo 函数的CPS形式:&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt;  foo(x: integer; c: Continuation);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  &lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;使用continuation的函数不&amp;quot;返回&amp;quot;值,而是把值作为一个参数传递给continuation从而&amp;quot;继续&amp;quot;处理值&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;  c.continueWith(x&lt;/span&gt;&lt;span style="color:#000000"&gt;+&lt;/span&gt;&lt;span style="color:#800080"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;对于我们熟悉的Pascal,C++等传统高级编译语言而言，程序本身在运行期是固定不变的，我们只需要记录下执行点(excution point)的信息（例如指针位置和堆栈内容）即足以完整的描述程序未来的运行情况，一般都是使用堆栈保存函数上下文的——采用Activation record或者叫Stack frame来记录从最顶层函数到当前函数的所有函数的上下文，当函数进入时候将局部变量等作为StackFrame压入堆栈，退出函数的时候它的StackFrame就被删掉（具体压入弹出的时机视调用约定而定）。 
&lt;p&gt;而在许多的函数式语言中（如 Scheme 和SmallTalk），它们并不采用堆栈来保存上下文，而是将这些信息保存在continuation记录中。这些continuation记录和堆栈的Frame的区别在于，它不采用后入先出的线性方式，所有continuation记录被组成一棵树（或者图），从一个函数调用另一个函数就等于给当前节点生成一个子节点，然后把系统寄存器移动到这个子节点。一个函数的退出等于从当前节点退回到父节点。这些节点的空间回收是由垃圾回收器(garbage collection)来管理。如果没有引用这个continuation记录，则它就是可以被删除的。这样的调用方式和堆栈方式相比，它可以在一个函数内的任何位置储存自己的上下文信息，然后，在以后某个适当的时刻，从其它的任何一个函数里面返回到自己现在的位置。实际上它使得一个函数可以拥有了多个不同的入口点（知道为何可以看作是Goto语句的函数表达式了吧，不过我们在软件工程中极度忌讳使用GOTO模式避免面条式代码成形。） 
&lt;p&gt;在函数式语言中, continuation的引入是非常自然的过程, 考察如下函数调用： f(h(k(arg)))，根据函数的结合律，我们可以有复合函数 g = f(h(.)), 它自然就是函数k()的continuation，在理论上我们有可能利用泛函分析的一些技术实现对于continuation(复合函数)的化简，但实践已经证明这是极为艰难的，主要是我们的程序不可避免的要涉及到程序与数据的纠缠。不过，我们在引入continuation概念之后，程序运行的表述是非常简单的：&lt;br&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#000000"&gt;  Continuation.Proceed();
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;针对顺序执行的程序，我们可以建立更加精细的运行模型。&lt;br&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#000000"&gt;   &lt;/span&gt;&lt;span style="color:#0000FF"&gt;while&lt;/span&gt;&lt;span style="color:#000000"&gt;(Continuation.HasNextStep()) &lt;/span&gt;&lt;span style="color:#0000FF"&gt;do&lt;/span&gt;&lt;span style="color:#000000"&gt;
   &lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
     Continuation.ProceedOneStep();
   &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;只要以某种方式构造出Continuation 子句(closure)，就意味着我们能够通过单一变量来表示程序未来的运行结构。这样，我们就有可能在某个层面上实现对程序的一种更简洁的描述。 
&lt;p&gt;在上一次对Delphi的CoRoutine(uMeYield.pas)实现的基础上，我实现在对Delphi语言函数的Continuation。通过为CoRoutine类添加了MarkContinuation方法保存Continuation记录以及CallCC方法调用进入保存的Continuation记录所在位置执行CoRoutine。 
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#0000FF"&gt;var&lt;/span&gt;&lt;span style="color:#000000"&gt;
  vContinuationRec: TContinuationRec; 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; YieldProc(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;const&lt;/span&gt;&lt;span style="color:#000000"&gt; YieldObj: TMeCoroutine);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;var&lt;/span&gt;&lt;span style="color:#000000"&gt;
  i: integer;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  i :&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;while&lt;/span&gt;&lt;span style="color:#000000"&gt; true &lt;/span&gt;&lt;span style="color:#0000FF"&gt;do&lt;/span&gt;&lt;span style="color:#000000"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
    inc(i);
    writeln(&lt;/span&gt;&lt;span style="color:#800000"&gt;'&lt;/span&gt;&lt;span style="color:#800000"&gt;i= &lt;/span&gt;&lt;span style="color:#800000"&gt;'&lt;/span&gt;&lt;span style="color:#000000"&gt;, i);
    YieldObj.Yield(i);
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt; i &lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;3&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;then&lt;/span&gt;&lt;span style="color:#000000"&gt; break;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
  YieldObj.MarkContinuation(vContinuationRec);
  inc(i);
  writeln(&lt;/span&gt;&lt;span style="color:#800000"&gt;'&lt;/span&gt;&lt;span style="color:#800000"&gt;i++ end: &lt;/span&gt;&lt;span style="color:#800000"&gt;'&lt;/span&gt;&lt;span style="color:#000000"&gt;, i);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;; 

  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;with&lt;/span&gt;&lt;span style="color:#000000"&gt; TYieldInteger.Create(YieldProc) &lt;/span&gt;&lt;span style="color:#0000FF"&gt;do&lt;/span&gt;&lt;span style="color:#000000"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;try&lt;/span&gt;&lt;span style="color:#000000"&gt;
      Reset;
      &lt;/span&gt;&lt;span style="color:#0000FF"&gt;while&lt;/span&gt;&lt;span style="color:#000000"&gt; MoveNext &lt;/span&gt;&lt;span style="color:#0000FF"&gt;do&lt;/span&gt;&lt;span style="color:#000000"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
        inc(i);
        Writeln(&lt;/span&gt;&lt;span style="color:#800000"&gt;'&lt;/span&gt;&lt;span style="color:#800000"&gt;Current:&lt;/span&gt;&lt;span style="color:#800000"&gt;'&lt;/span&gt;&lt;span style="color:#000000"&gt;, Current);
      &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
      Writeln(&lt;/span&gt;&lt;span style="color:#800000"&gt;'&lt;/span&gt;&lt;span style="color:#800000"&gt;---CallCC---&lt;/span&gt;&lt;span style="color:#800000"&gt;'&lt;/span&gt;&lt;span style="color:#000000"&gt;);
      CallCC(vContinuationRec);
      CallCC(vContinuationRec);
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;finally&lt;/span&gt;&lt;span style="color:#000000"&gt;
      Free;
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;; 

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;程序输出：&lt;br&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#000000"&gt;i&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#800080"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;
Current&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#800080"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;
i&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#800080"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;
Current&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#800080"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;
i&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#800080"&gt;3&lt;/span&gt;&lt;span style="color:#000000"&gt;
Current&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#800080"&gt;3&lt;/span&gt;&lt;span style="color:#000000"&gt;
i&lt;/span&gt;&lt;span style="color:#000000"&gt;++&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;: &lt;/span&gt;&lt;span style="color:#800080"&gt;4&lt;/span&gt;&lt;span style="color:#000000"&gt;
&lt;/span&gt;&lt;span style="color:#800000"&gt;'&lt;/span&gt;&lt;span style="color:#800000"&gt;---CallCC---&lt;/span&gt;&lt;span style="color:#800000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;i&lt;/span&gt;&lt;span style="color:#000000"&gt;++&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;: &lt;/span&gt;&lt;span style="color:#800080"&gt;5&lt;/span&gt;&lt;span style="color:#000000"&gt;
i&lt;/span&gt;&lt;span style="color:#000000"&gt;++&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;: &lt;/span&gt;&lt;span style="color:#800080"&gt;6&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以上实现只是纯学术上的研究，如果要在实际上应用这种函数重入，一来是不符合软件工程规范（当然如果你要作为反破解的扰乱另当别论），二来是你必须很清楚它的限制条件：在需要重入的函数体，不能使用动态分配内存的局部变量（如字符串）。 
&lt;p&gt;当然，Continuation不仅仅只是适用于程序语言理论分析领域，如果我们的眼界开阔一些，不拘泥于构造语言级别通用的continuation结构（这需要以抽象的方式定义并保存任意程序的完整运行状态），而是考察“对程序未来运行的整体结构进行建模”这一更宽广的命题，我们很快就能发现大量对于continuation概念的应用，如：异常处理，回退跟踪（back-tracking），AOP的拦截器，动态工作流，Web Continuation。 
&lt;p&gt;异常处理&lt;br&gt;应用continuation进行异常处理是很显而易见的，只要在可能抛出异常的函数外面try的地方做一个continuation 记录，那么这个函数就可以在需要的时候直接返回到try语句的地方。在出现了异常之后，当异常处理模块修复了错误后，需要返回道发生错误的地方继续执行的时候，就是continuation大显神威的时候。 
&lt;p&gt;回退跟踪（back-tracking）&lt;br&gt;回退跟踪（back-tracking）算法也可以应用continuation，在某些地方保存当前的continuation，然后以后回退的时候，就可以从其它的函数直接跳回。 
&lt;p&gt;AOP（Aspect Oriented Programming）拦截器&lt;br&gt;对原来函数拦截后，我们需要在拦截器中处理函数调用前事件，然后继续执行原函数。&lt;br&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#000000"&gt;  TMethodInterceptor &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&lt;span style="color:#000000"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; Invoke(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;const&lt;/span&gt;&lt;span style="color:#000000"&gt; Invocation: TMethodInvocation);
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
      doSthBeforeInvoke();
      Invocation.Proceed();
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;动态工作流&lt;br&gt;在一些比较复杂的网络协议中，我们通过注册监听器（listener）来处理接收到的网络指令，网络指令之间往往存在一定的关联，我们可以通过针对不同的指令动态调整关联的命令监听器， 或者建立复杂而庞大的有限自动机来描述所有指令之间的关联规则。 
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;动态调整关联的命令监听器的方式&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;TCommandListener &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&lt;span style="color:#000000"&gt;
   &lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; OnEvent(aEvent: TEvent, aFutureListeners: TListeners)
   &lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
      HandleEvent(aEvent);
      aFutureListeners.clear();
      aFutureListeners.add(&amp;quot;ACommand&amp;quot;, new ACommandListener());
      aFutureListeners.add(&amp;quot;BCommand&amp;quot;, new BCommandListener());
   &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;而动态调整关联的命令监听器的方式可以看作是对程序未来运行结构的一种动态调整. 沿着这种方式深入下去, 我们可以建立一种完整的动态工作流机制. 
&lt;p&gt;Web Continuation 
&lt;p&gt;传统Web开发，一般都是以客户端作为主动的，客户端发请求，然后接收响应，然后再发请求...，整个流程都是以客户端为推动源。这样的一个结果就是，一般的web框架都是把他们的控制器分成一个个的方法调用，客户端的请求就对应到这些方法调用当中。而Web Continuation Server 通过引入Continuation机制将逻辑反转了过来，并以此实现了对于page flow的完整描述。 
&lt;p&gt;Continuation Server 以服务器作为主动方，服务器发送页面，然后等待客户端输入之后，继续执行，然后在发送页面并等待回应...，整个流程是服务器通过发送页面和等待回((SendPageAndWait))应进行推动。整个过程就像是函数调用那样，服务器发送页面回应(SendPageAndWait)就是函数调用开始，而用户发送请求就是函数的返回。要实现这个效果，就需要服务器端可以在收到请求之后能返回到之前的发送响应的后一语句。这里的核心就是服务器端需要能够动态的获取运行栈，在发送响应前，先对当前的运行栈作一个快照，然后在响应到达时，重新从快照那里执行，这样就相当于实现了刚才所说的函数调用效果。使用continuation server之后服务器端就只需要一个方法调用，对应初始请求。&lt;br&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; OnRequest()
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  funcA();
  input &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; SendPageAndWait(&amp;quot;GetInfoFromUser.php&amp;quot;);
  HandleInput(input);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;; &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在调用SendPageAndWait的时候，web框架会保存当前函数调用的continuation，向用户返回页面GetInfoFromUser.php，等待用户提交表单之后，web框架重新激活我们所保存的continuation，继续执行我们的函数。这种做法与系统调用和线程调度等机制是非常类似的。虽然这种基于continuation的方式可以自然的解决在session中保存并清理变量的问题，但是使用通用的continuation 实现很有可能会在无意中保存了过多的临时变量，从而对系统性能造成极大的损害，另外在集群环境下，continuation状态如何复制也是需要思考如何解决的问题。 
&lt;p&gt;那么为什么需要Continuation呢？利用 Continuation 理念，可以很好的解决了服务器更新客户端的问题——服务器从而不用再为每一个等待响应的客户端单独建立一个线程，借助Continuations和新IO，可以在有限的线程内支持更多用户。根据Greg Wilkins的测试，使用Continuation的Jetty Cometd服务在10000个并发用户和875个线程下，只用了57M内存。 &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1711333523425955962&amp;page=RSS%3a+Continuation+%e6%a6%82%e5%bf%b5%e4%b8%8e%e5%8d%8f%e7%a8%8b(CoRoutine)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=riceballl.spaces.live.com&amp;amp;GT1=riceballl"&gt;</description><comments>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!246.entry#comment</comments><guid isPermaLink="true">http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!246.entry</guid><pubDate>Tue, 22 Jan 2008 01:28:32 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://riceballl.spaces.live.com/blog/cns!E8401F3A3BFA6F86!246/comments/feed.rss</wfw:commentRss><wfw:comment>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!246.entry#comment</wfw:comment><dcterms:modified>2008-01-22T01:28:32Z</dcterms:modified></item><item><title>Coroutine(协程)与复用</title><link>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!244.entry</link><description>&lt;h2&gt;概念&lt;/h2&gt; &lt;p&gt;协程(Coroutine)这个概念最早是&lt;a href="http://en.wikipedia.org/wiki/Melvin_Conway"&gt;Melvin Conway&lt;/a&gt;在1963年提出的，用它可以实现协作式多任务，协程(coroutine)技术本质上是一种程序控制机制。比如，消费者/生产者，你走几步，我走几步；下棋对弈，你一步我一步。&lt;br&gt;Coroutine(协程)可以分为： &lt;ul&gt; &lt;li&gt;非对称式(asymmetric)协程，或称半对称式(semi-asymmetric)协程，又或干脆就叫半协程(semi-coroutine) &lt;li&gt;对称式(symmetric)协程。 &lt;/ul&gt; &lt;p&gt;非对称式(asymmetric)协程之所以被称为非对称的，是因为它提供了两种传递程序控制权的操作：一种是(重)调用协程(通过coroutine.resume)；另一种是挂起协程并将程序控制权返回给协程的调用者(通过coroutine.yield)。一个非对称协程可以看做是从属于它的调用者的，二者的关系非常类似于例程(routine)与其调用者之间的关系。对称式(symmetric)协程的特点是只有一种传递程序控制权的操作(coroutine.transfer)，即将控制权直接传递给指定的协程。曾经有这么一种说法，对称式和非对称式协程机制的能力并不等价，但事实上很容易根据前者来实现后者。在不少动态脚本语言(Python、Perl,Lua,Ruby)都提供了协程或与之相似的机制。&lt;br&gt;对称式协程机制可以直接指定控制权传递的目标，拥有极大的自由，但得到这种自由的代价却是牺牲程序结构。如果程序稍微复杂一点，那么即使是非常有经验的程序员也很难对程序流程有全面而清晰的把握。这非常类似goto语句，它能让程序跳转到任何想去的地方，但人们却很难理解充斥着goto的程序。非对称式协程具有良好的层次化结构关系，(重)启动这些协程与调用一个函数非常类似：被(重)启动的协程得到控制权开始执行，然后挂起(或结束)并将控制权返回给协程调用者。这与结构化编程风格是完全一致的。 &lt;h2&gt;线程和协程的异同&lt;/h2&gt; &lt;p&gt;协程(Coroutine)类似于线程(Thread)的地方是：每个协程都有有自己的堆栈,自己的局部变量。  &lt;p&gt;线程和协程的主要区别在于：&lt;br&gt; 1. 线程可以并发运行，线程之间是不能共享全局变量。&lt;br&gt; 2. 协程不能并发运行，协程之间可以共享全局变量。 &lt;p&gt;  &lt;h2&gt;协程的实现和使用&lt;/h2&gt; &lt;h3&gt;创建协程&lt;/h3&gt; &lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#000000"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;type&lt;/span&gt;&lt;span style="color:#000000"&gt;
    TMeCoRoutineFunc &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;const&lt;/span&gt;&lt;span style="color:#000000"&gt; aCoRoutine: TMeCoRoutine);
    TMeCoRoutineMethod &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt;() &lt;/span&gt;&lt;span style="color:#0000FF"&gt;of&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;object&lt;/span&gt;&lt;span style="color:#000000"&gt;;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;var&lt;/span&gt;&lt;span style="color:#000000"&gt;
    func: TMeCoroutineFunc; 

  co &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; TMeCoRoutine.create(func)

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;参数是一个函数，返回值是创建的协程对象。
&lt;h3&gt;协程的状态&lt;/h3&gt;
&lt;p&gt;协程有三种状态：挂起(suspended)，运行(running)，停止(dead)。&lt;br&gt;当我们创建一个协程时他开始的状态为挂起态,也就是说我们创建协程的时候不会自动运行。&lt;br&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#000000"&gt;st &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; co.status;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt; 
&lt;p&gt;激活协程
&lt;p&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#000000"&gt;IsSucessful :&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; co.resume();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;激活挂起的协程，使协程继续运行。参数co是一个协程对象。 
&lt;p&gt;如果协程是挂起状态，则继续运行，resume函数返回true。如果协程已经停止或者遇到其他错误，resume函数返回false。
&lt;p&gt; 
&lt;p&gt;挂起协程
&lt;p&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#000000"&gt;co.yield([...]);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;挂起当前协程。直到协程被外部协程使用CoRoutine.Resume再次激活，将返回到执行CoRoutine.Yield函数后的地方继续执行。&lt;br&gt;CoRoutine.yield的参数将传递给SaveYieldedValue虚方法，你需要重载该方法处理。&lt;br&gt;
&lt;p&gt;当一个协程正在运行时,不能在外部终止它.只能在协程内部调用coroutine.yield挂起当前协程。&lt;br&gt;不需要考虑协程安全、协程同步的问题。协程的代码比线程的代码更容易编写。
&lt;p&gt; 
&lt;p&gt;=== “控制”和“行为”的复用 === 
&lt;p&gt;在很多时候，我们需要对数据结构（如：List，Stack）中的元素按某种要求进行遍历，我们称之为“控制”；然后对目标元素进行某个操作，我们称之为“行为”。许多情况下，这种“控制”或行为的代码本来是可以被复用的，但是因为难以将这其中的“控制”和“行为”分离，造成了我们不得不一遍又一遍的书写这些类似的代码（虽然利用回调可以实现在一定程度上的“控制”和行为的分离，但是并不优雅，也不无法实现彻底重用）。 
&lt;p&gt;==== 生产和消费 ====&lt;br&gt;让我们先看下面一段代码，producer过程（生产者）产生一些数值（根据要求进行遍历），而Consumer过程（消费者）则处理值（对目标元素进行操作）：&lt;br&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; producer();
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;var&lt;/span&gt;&lt;span style="color:#000000"&gt;
  i: integer;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;for&lt;/span&gt;&lt;span style="color:#000000"&gt; i :&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;to&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;100&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;do&lt;/span&gt;&lt;span style="color:#000000"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt; i mod &lt;/span&gt;&lt;span style="color:#800080"&gt;5&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;then&lt;/span&gt;&lt;span style="color:#000000"&gt; consumer(i);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;; 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; Consumer(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;const&lt;/span&gt;&lt;span style="color:#000000"&gt; value: integer);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  writeln(value);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;请注意在生产者（producer）调用消费过程（consumer）这里出现了耦合，该生产者只能为这个Cosumer过程服务。我们希望生产者过程（producer）能增强通用性，降低耦合度，能为不同的消费者服务。 
&lt;p&gt;ok，我们想到了回调：&lt;br&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#0000FF"&gt;type&lt;/span&gt;&lt;span style="color:#000000"&gt;
  TComsumerCallback: &lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;const&lt;/span&gt;&lt;span style="color:#000000"&gt; value:integer); 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; producer(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;const&lt;/span&gt;&lt;span style="color:#000000"&gt; aCallBack: TComsumerCallback);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;var&lt;/span&gt;&lt;span style="color:#000000"&gt;
  i: integer;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;for&lt;/span&gt;&lt;span style="color:#000000"&gt; i :&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;to&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;100&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;do&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;循环枚举控制&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt; i mod &lt;/span&gt;&lt;span style="color:#800080"&gt;5&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;then&lt;/span&gt;&lt;span style="color:#000000"&gt; aCallBack(i);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;好了producer可以为不同的消费者服务了。但是，新的问题又出来。如果我们现在还希望仅当消费者要求值的时候才去调用生产者取得值呢？实现控制和行为的彻底的分离。象这样： 
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; MainConsumer();
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  &lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;控制在MyProducer中，控制复用&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;for&lt;/span&gt;&lt;span style="color:#000000"&gt; i &lt;/span&gt;&lt;span style="color:#0000FF"&gt;in&lt;/span&gt;&lt;span style="color:#000000"&gt; MyProducer &lt;/span&gt;&lt;span style="color:#0000FF"&gt;do&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;当消费者要求值的时候才去调用&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
    Consumer(i);
    ....
    &lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;随时可以停止从生产者取值&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;==== Visitor模式与Iterator模式 ====
&lt;p&gt;回调的实质是一种简单Visitor模式，说它简单是因为它只有Visitor，没有Visited部分。利用回调很难做到：消费者要，生产者才给，如果消费者不问不要，生产者就不答不给，这是由visitor模式的特性所决定的：回调的使用者把Callback函数扔到Traversal算法里面，然后运行算法，同时祈祷并等候算法的完成（Push and Wait），使用者完全失去了控制权，只能等待算法整个完成或者中止，才能重新拿到控制权。而尽管使用Iterator模式能很容易的做到这一点（Iterator本质上属于问答模式，或者说消费者/生产者模式，Iterator的用法本身就是Lazy的，一问一答，遍历算法停在那里恭候Iterator使用者的调遣），但是如果放弃回调方式却又无法复用消费者了。要想同时做到既要复用“控制”，又要复用“行为”，这几乎是不可能的（当然如果是仅仅想实现“消费者要，生产者才给”那是可以的，不过难度比回调大，而且并不能通用各种数据结构），因为visitor模式和Iterator模式的特性恰恰是完全相反的：&lt;br&gt; * Iterator是一种主动模型，Pull模型，Ask and Get。Iterator听候用户的调遣。&lt;br&gt; * Vistor是一种被动模型，Push模型，Plugin / callback模型，Push and Pray and Wait。Visitor听候算法的调遣。 
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;利用Iterator模式实现按消费者需要取值：简单的数组、链表只要保存当前调用步骤（数组索引，或者当前指针）和调用环境（内部数据集）的结构，返回给用户就可以了。用户每次调用iterator.next，iterator就把索引或指针向后移动一下。 如果是内部数据复杂的Tree, Graph结构，就相当复杂了。比如是遍历一棵树，而且这棵树的Node里面没有Parent引用，那么Iterator必须自己维护一个栈把前面的所有的Parent Node都保存起来。当用户调用iterator.next的时候，iterator就必须检查自己当前的状态，如果所有的Child Node都走完了，那么就要返回到上面的Parent，继续检查。 &lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;type&lt;/span&gt;&lt;span style="color:#000000"&gt;
  TProducer &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&lt;span style="color:#000000"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;private&lt;/span&gt;&lt;span style="color:#000000"&gt;
    i: integer;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&lt;span style="color:#000000"&gt;
    Current: Integer;
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;function&lt;/span&gt;&lt;span style="color:#000000"&gt; MoveNext: boolean;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;; 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; TProducer.MoveNext;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;var&lt;/span&gt;&lt;span style="color:#000000"&gt;
  i: integer;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  Result :&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; False;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt; i &lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;100&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;then&lt;/span&gt;&lt;span style="color:#000000"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt; i mod &lt;/span&gt;&lt;span style="color:#800080"&gt;5&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;then&lt;/span&gt;&lt;span style="color:#000000"&gt; Current :&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; i;
    i :&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; i &lt;/span&gt;&lt;span style="color:#000000"&gt;+&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;;
    Result :&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; True;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;; 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; MainConsumer();
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;with&lt;/span&gt;&lt;span style="color:#000000"&gt; TProducer.Create &lt;/span&gt;&lt;span style="color:#0000FF"&gt;do&lt;/span&gt;&lt;span style="color:#000000"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;try&lt;/span&gt;&lt;span style="color:#000000"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;while&lt;/span&gt;&lt;span style="color:#000000"&gt; MoveNext &lt;/span&gt;&lt;span style="color:#0000FF"&gt;do&lt;/span&gt;&lt;span style="color:#000000"&gt; 
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
      Consumer(Current);
      ....
      &lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;随时可以停止从生产者取值&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;finally&lt;/span&gt;&lt;span style="color:#000000"&gt;
    Free;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;; 

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这时候，有聪明人就将目光转向了非对称式(asymmetric-coroutine)协程。不难看出这里面的Iterator就是Coroutine里面的生产者（数据提供者，所以有时我们也称之为Generator）。&lt;br&gt;每次Iterator程序就是等在那里，一旦用户（消费者Consumer角色）调用了iterator.next（coroutine.Resume）， Iterator就继续向下执行一步，然后把当前遇到的内部数据的Node放到一个消费者用户能够看到的公用的缓冲区（比如，直接放到消费者线程栈里面的局部变量）里面，然后自己就停下来（coroutine.Yield）。然后消费者用户就从缓冲区里面获得了那个Node。这样Iterator就可以自顾自地进行递归运算，不需要自己管理堆栈上下文，而是协程机制帮助它分配和管理运行栈。从而实现将“控制”和“行为”的彻底解藕。请看如下C#程序： 
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&lt;span style="color:#000000"&gt; System.Collections.Generic; 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&lt;span style="color:#000000"&gt; MyProducer : IEnumerable&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000"&gt;
{a
  &lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;iterator block，实现枚举元素控制&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&lt;span style="color:#000000"&gt; IEnumerator&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000"&gt; GetEnumerator()
  {
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;for&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;int&lt;/span&gt;&lt;span style="color:#000000"&gt; i &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;; i&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000"&gt;elements.Length; i&lt;/span&gt;&lt;span style="color:#000000"&gt;++&lt;/span&gt;&lt;span style="color:#000000"&gt;)
      &lt;/span&gt;&lt;span style="color:#0000FF"&gt;yield&lt;/span&gt;&lt;span style="color:#000000"&gt; elements[i];
  }
  ...
} 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt; item &lt;/span&gt;&lt;span style="color:#0000FF"&gt;in&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&lt;span style="color:#000000"&gt; MyProducer())
{
  &lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;实现终端上打印元素的行为&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;  Console.WriteLine(item);
}

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在这段代码执行过程中，foreach 的循环体和 GetEnumerator 函数体实际上是在同一个线程中交替执行的。这是一种介于线程和顺序执行之间的协同执行模式，之所以称之为协同（Coroutine），是因为同时执行的多个代码块之间的调度是由逻辑隐式协同完成的。就协同执行而言，从功能上可以分为行为、控制两部分，控制又可进一步细分为控制逻辑和控制状态。行为对应着如何处理目标对象，如上述代码中：行为就是将目标对象打印到终端；控制则是如何遍历这个 elements 数组，可进一步细分为控制逻辑（顺序遍历）和控制状态（当前遍历到哪个元素）。其中心思想在于通过Coroutine程序控制机制和Yield将其行为与控制彻底分离，以此来进一步降低代码的耦合度，增强通用性，提高代码的复用率。 &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1711333523425955962&amp;page=RSS%3a+Coroutine(%e5%8d%8f%e7%a8%8b)%e4%b8%8e%e5%a4%8d%e7%94%a8&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=riceballl.spaces.live.com&amp;amp;GT1=riceballl"&gt;</description><comments>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!244.entry#comment</comments><guid isPermaLink="true">http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!244.entry</guid><pubDate>Thu, 03 Jan 2008 14:48:20 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://riceballl.spaces.live.com/blog/cns!E8401F3A3BFA6F86!244/comments/feed.rss</wfw:commentRss><wfw:comment>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!244.entry#comment</wfw:comment><dcterms:modified>2008-01-03T14:48:20Z</dcterms:modified></item><item><title>C# 2.0中的Yield语句在Delphi中的实现</title><link>http://riceballl.spaces.live.com/Blog/cns!E8401F3A3BFA6F86!243.entry</link><description>&lt;h2&gt;Yield与代码协同 (Coroutine) &lt;/h2&gt; &lt;p&gt;C# 2.0 是在不修改 CLR 的前提下由编译器通过有限状态机来实现 iterator block 中 yield 关键字的。&lt;br&gt;从而实现将控制和行为分离。&lt;br&gt;实际上，这一机制的最终目的是提供一个代码协同(Coroutine)执行的支持机制。参见如下的代码，更能&lt;br&gt;说明问题：&lt;br&gt; &lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#0000FF"&gt;using&lt;/span&gt;&lt;span style="color:#000000"&gt; System.Collections.Generic; 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;class&lt;/span&gt;&lt;span style="color:#000000"&gt; Tokens : IEnumerable&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000"&gt;
{
  &lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;iterator block，实现控制枚举的元素&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;public&lt;/span&gt;&lt;span style="color:#000000"&gt; IEnumerator&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000"&gt; GetEnumerator()
  {
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;for&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;int&lt;/span&gt;&lt;span style="color:#000000"&gt; i &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;; i&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000"&gt;elements.Length; i&lt;/span&gt;&lt;span style="color:#000000"&gt;++&lt;/span&gt;&lt;span style="color:#000000"&gt;)
      &lt;/span&gt;&lt;span style="color:#0000FF"&gt;yield&lt;/span&gt;&lt;span style="color:#000000"&gt; elements[i];
  }
  ...
} 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt; item &lt;/span&gt;&lt;span style="color:#0000FF"&gt;in&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;new&lt;/span&gt;&lt;span style="color:#000000"&gt; Tokens())
{
  &lt;/span&gt;&lt;span style="color:#008000"&gt;//&lt;/span&gt;&lt;span style="color:#008000"&gt;实现终端上打印元素的行为&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;  Console.WriteLine(item);
}

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在这段代码执行过程中，foreach 的循环体和 GetEnumerator 函数体实际上是在同一个线程中交替执行的。这是一种介于线程和顺序执行之间的协同执行模式，之所以称之为协同（Coroutine），是因为同时执行的多个代码块之间的调度是由逻辑隐式协同完成的。 
&lt;p&gt;就协同执行而言，从功能上可以分为行为、控制两部分，控制又可进一步细分为控制逻辑和控制状态。行为对应着如何处理目标对象，如上述代码中：行为就是将目标对象打印到终端；控制则是如何遍历这个 elements 数组，可进一步细分为控制逻辑（顺序遍历）和控制状态（当前遍历到哪个元素）。 
&lt;p&gt;其中心思想就是将行为与控制分离，以此来降低代码的耦合度，增强通用性，提高代码的复用率。 
&lt;h2&gt;Delphi中Yield的使用 &lt;/h2&gt;
&lt;p&gt;让我们先看下面一段代码，producer过程（生产者）产生一些数值，而Consumer过程（消费者）则处理值：&lt;br&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px"&gt;&lt;pre style="background-color:White;overflow:auto"&gt;&lt;div&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; producer();
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;var&lt;/span&gt;&lt;span style="color:#000000"&gt;
  i: integer;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;begin&lt;/span&gt;&lt;span style="color:#000000"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF"&gt;for&lt;/span&gt;&lt;span style="color:#000000"&gt; i :&lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;to&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;100&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;do&lt;/span&gt;&lt;span style="color:#000000"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt; i mod &lt;/span&gt;&lt;span style="color:#800080"&gt;5&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#800080"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;then&lt;/span&gt;&lt;span style="color:#000000"&gt; consumer(i);
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;end&lt;/span&gt;&lt;span style="color:#000000"&gt;; 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;procedure&lt;/span&gt;&lt;span style="color:#000000"&gt; Consumer(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;const&lt;/span&gt;&lt;span style="color:#00000