??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
W二步:选择正确的设|?
W三步:写完博客之后Q按q里可以发布了Q?
如果以后需要写新的博客的话Q还可以直接点这里:
Word 2013是单好用啊Q虽然Live Writer没有了,但是有了Word 2013Q其实也是一L?/p>
W一ơ是在高中认识了龚敏敏。那个时候我刚做完那个傻逼的2D ARPG不久Q龚敏敏已经是M$RA的实习生了,囑Ş学上的造诣肯定要比我高许多Q其中的差距构成了大跟菜鸟的关pR当然现在我管中心已经攑֜了程序设计语aQprogramming languageQ以下简UPLQ上Q但是还知道一些图形学的内容,跟龚敏敏的差距自然也已经~小C不构成大和菜鸟的关pȝE度了。尽他q是比我多知道很多东ѝ?/p>
W二ơ是在大学的时候认识了g9yuayon。g9菊苣是做形式化和证明的,自然也知道很多PL的事情。那应该是我大二的时候,在CSDN上偶然发Cg9菊苣的博客,觉得文章写的很好Q就Z把博客上面的email“密码”给破了之后发emaill他。后来g9菊苣告诉了我很多诸如在哪里可以获得知识的事情Q于是我也就做了PL。尽现在已l很跟g9菊苣联系了,不过我感觉目前我跟g9的差距应该还属于大神跟菜鸟的关系Q因Z很久以前写的博客我都q不能完全搞明白?/p>
W三ơ就是今天的事情了。大安知道最q我在写一个《如何设计一门语a》的pd文章。这个系列文章肯定是会l写下去的,因ؓ我的语言都还没做出来。所以可以很明显地看出来Q我现在也在做一个语a。这跟王垠的那个one当然是不一LQ因为我从一开始就没打代替所有东西,而且目标也很明确Q就是把它做成跟C++/C#一P菜鸟可以很容易上手写出清晰易懂的代码Q大也可以在里面挖掘出很多奇技淫y。于是我不可避免的就遇到了CPS的问题?/p>
大家都知道C#有yield和await两个关键字,F#也有computation expression。于是我在惻I如果yield和await不是关键字,而是一个函敎ͼ会发生什么事情。展开来讲Q就是如果要让程序员自己实现一个ؓ特定目的服务的CPS变换Q那我的语法要怎么做。对于没有怎么设计q程序语a的h来说Q“设计一个语法”这U事情其实是很容易被误解的。语法ƈ不是说要在这里放一个括P在那里放一个关键字Q在别的地方q能省略一个什么东西(瞧瞧go抄了javascript那个屎一L分号省略{略Q。这些都属于品味的问题。品x不需要设计的Q那是靠感觉的,是一U艺术。只要你拿出来觉得漂亮,那就是好的。真正需要思考的东西是什么,那自然是围绕早上面的cdpȝ了?/p>
我用通俗易懂的方法来解释一下,什么是cdpȝQ或者说在我们这些做PL的h看来Q眼中的E序大概是什么样子的。我们拿一个C#的异步程序来_其实也就是上一文章讲的那个例子了?
async void button4_Click(object sender, EventArgs e) { try { string a=await Http.DownloadAsync(url1); string b=await Http.DownloadAsync(url2); textBox1.Text=a+b; } catch(Exception ex) { textBox1.Text=ex.Message; } }
大家都很熟悉吧。如果这个这么简单的E序q看不懂的话Q那肯定是没有认真阅L的《如何》系列。好了,现在开始来Ԍ做PL的h到底是如何看待这个程序的呢:
async void button4_Click(Object, EventArgs) { try { String=await (String -> Task<String>) (String); String=await (String -> Task<String>) (String); (TextBox -> String -> Void#TextBox.Text) (TextBox, String + String); } catch(Exception) { (TextBox -> String -> Void#TextBox.Text) (TextBox, (Exception -> String#Exception.Message) (Exception)); } }
嗯,差不多就是这个样子。这个函数究竟是下蝲一个盗版小_q是下蝲一个带节操的日本电影,I竟是同步下载,q是异步下蝲Q是下蝲C个文件夹Q还是下载到skydrive——关我屁事!我只看这里关于类型的部分?/p>
所以,如果await是一个函数的话,那他应该是什么类型?如果yield也是一个函敎ͼ那他应该是什么类型?如果q门语言让程序员来创建属于自qawait和yield甚至是他自己的想要的计算Q那我应该如何做一个框架让他往里面套,或者他写出来的q个函数I竟要在什么上下文里面满什么样的一个类型的关系呢?我最q就一直在惌个问题?/p>
一开始我把目光投向了F#的computation expressionQ因为F#的这个东西就h我想要的一切功能。后来我xq个功能搬进来的时候,发现怎样都套不上。当然我很快发CQ这其实是因为F#归根l底q是一个函数是语言Q他是不能在一个for循环里面写break、continue或者return的。F#的一个for循环Q永q是一个完的for循环。但是我的语a是可以的Q于是这样在cd上就不完了——不q这是小事,牺牲一点点完美换来易用性是值得的。当Ӟ牺牲很多完美来满x用性,我觉得是不值得的?/p>
既然for循环里面可以带break/continue/returnQ那么“我的computation expression”的For函数Q就不能是类gIEnumerable<T>->(T->M<U>)->M<U>q种Ua的东西了。那我应该怎么做呢Q?/p>
写到q里Q我觉得在微软工作就是好啊。关于编E语a领域的很多改q其实都是从微Yq里做出来的。通俗的部分,看看完美的C#Q看看ASP.NET MVC的razor模板在Visual Studio里面的智能提C的功能——这可是一个可以合HTML+CSS+Javascript+C#的代码,写的时候丝般顺滑,行云水Q俨然这四门语言是一门语a一栗在学术上,微Y的各个研I也A献了相当多的东西——不q我觉得你们对这些应该是不感兴趣的,管你们在linux上面也用了很多微软的成果?/p>
那这能说明什么问题呢Q这意味着Q我可以随时access到微软做~程语言的大们Q抓他们来问问题。不q他们是很忙的,l常不在U(我们也有一个类似QQq样子的东西Q。不q今天我随手打开了一下,展开了我U篏的几个大的l,发现F#他爹竟然是绿的,于是我随手就发了一句hiQ看看h家在不在。h家回了我Q于是我开始问q个问题了?/p>
什么,你不知道F#他爹是谁Q他当然是Don Syme了。写函数式语a不认识Don SymeQ就犹如ȝ理不认识牛顿Q读数学不认识柯西,写C++不知道Bjarne StroustrupQ用操作pȝ不知道Dave Cutler一P要跪着爬回自己学校里重新读书?/p>
Don Syme是微软的Principle ResearcherQ翻译过来大概就是“顶U科学家”的意思吧Q很有更牛逼的东西了?/p>
于是故事到这里就l束了,因ؓDon Syme大神他很快就回复我说Q如果for循环支持break/continue/returnQ那我就不应该从F#的computation expression里面获取灉|。至于我的问题要怎么办,q还是个open question。于是我们愉快的聊天q下面的一句话l束了:
Don Syme: Research
在最q这几年里,一赯论编译器的h也不多,一般都是ooseven、@装配脑袋、@I明{(<--高手Q要?、@belleveinvis{这几个人。而且也零星有一些我也不记得叫什么名字的在我的评论里面提一些很好的Q让我得C充分的学习。因此我惻I如果有兴的人可以加q来一赯论的话,应该不仅ҎQ对大家也是有好处的。而且我本人喜Ƣ的领域也比较分散,譬如囑Ş界面、Y件渲染、编译原理、游戏开发等{。这几个领域都有互相促进的作用,而且需要的背景知识交集又少Q不同领域的人的思想和类型也不一栗如果群里的人北京分布比较广泛的话,也许q会有意想不到的idea出现?/p>
所以只要满以下要求的人都热烈Ƣ迎?br>1、热qE?br>2、不是来求代码的
3、不要问各种傻逼问题(譬如说ؓ什么cout<<1+2<<endl;会有错误啊)和求写大作业Q我可没旉这些不见棺材不泪的学生们Q?br>4、可以交换知识就最好了
本穷丑矮不是VIPQ故h数有上限Q不q我惛_该是达不到的Q,先到先得?/p>
引用http://www.shnenglu.com/vczh/archive/2012/11/29/195779.html的三?/p>