Hello World
Spiga

在.NET平台下使用C#交互式控制台(上):简介

2011-08-31 16:25 by 老赵, 3808 visits

上周日在广州的珠三角技术沙龙上,我的演讲题目是“Mono之于.NET程序员”。Mono一直是我十分喜爱的产品,我也一直关注它的发展,总有很多人用各种方式对它进行FUD,甚至是.NET程序员自己。这其实跟程序员使用盗版一样,自掘坟墓,是种无比愚蠢的行为。在演讲中,我提到.NET程序员可以如何从Mono项目中得到帮助,现在便以C#交互式控制台为例,演示下在.NET平台下使用Mono项目的常见方式。

Mono和.NET都是CLI(ECMA 335)的实现,包括C#语言编译器,运行时和类库等等。与微软实现的.NET不同,Mono是个开源项目,我们可以在授权允许的范围内任意折腾。例如,微软在Silverlight里提供了一个JSON类库,但我们无法将其用于普通的.NET项目,于是我们就可以从Mono里剥离相关代码出来。再比如,Windows Phone的SDK中没有提供像.NET 4.0里面一样的任务并行库,于是也有开发人员将Mono里面的实现移植了过来。社区成员也十分喜欢开源,因此无论是Mono团队还是其他开发人员都会很乐意捣鼓各种东西,并且也搞出许多有意思的东西来。C#交互式控制台(有时也将其称为REPL,即Read-Eval-Print-Loop)就是其中一个。

之前Anders Hejlsberg在PDC 2010中提到“C#与Visual Basic的未来”,其中一项功能就是“编译器即服务(Compiler as a Service)”。这个功能是指,把编译器的功能向普通用户开放出来,这样便可以实现更多的东西,例如代码解释执行,或是把代码变成语法树,让程序理解其语义等等(这便是Jscex的根本所在)。其实几年前就已经在Mono有类似的实现了。Mono的C#编译器mcs本身是由C#实现的,因此它直接就包含了编译器的完整功能,API好用与否暂且不论,但的确提供了这方面的能力,需要的同学完全可以自行获取。

Mono编译器功能暴露在Mono.CSharp类库中,而C#的交互式控制台便是“编译器即服务”顺理成章的衍生品。我想你一定遇到过这样的情况,例如,知道DateTime类型的ToString在接受某些参数会输出什么样的效果,却有些记不清,查文档自然会有答案但是太麻烦,其实一试便知。还有比如字符串解析,正则表达式匹配,临时计算等等。我见过很多同学在遇到这种情况的时候,都会直接把代码写在程序里,然后设置断点,然后运行程序观察执行效果。经验丰富一点的朋友则会时刻准备着一个控制台项目或是用Snippit Compiler,写点试验代码运行一下。不过,最理想的方式其实是使用F#,Scala,Ruby,Python等语言中都有的交互式控制台。例如以下便是在VS 2010中自带的F#交互式控制台:

F# REPL

我几乎天天都会用到F#交互式控制台,用来验证一些做法和猜想是否正确,确定之后再写成C#代码。我会F#,使用F#交互控制台自然不在话下。如果您懂得Python或Ruby,则使用IronPython或IronRuby的交互式控制台也是个不错的办法。但如果您只会用C#,那似乎就没辙了。幸运的是,Mono为C#程序员打开了这扇窗,我们也完全可以使用C#的交互式控制台来辅助工作,如下图:

C# REPL

在下一篇文章里,我们便来一起看一下,如何让Mono提供的C#交互式控制台运行在Windows和.NET下。这是个不错的例子,略有障碍,也没有过于复杂或取巧的地方,可以作为.NET程序员利用Mono组件的一个典型示例。

最后再附上上周日的演讲幻灯片,大伙后睹为快:

总之一句话:作为.NET程序员,如果您忽视或排斥Mono的话,损失的将会是你自己。

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

49 条回复

  1. haohaolee
    121.63.62.*
    链接

    haohaolee 2011-08-31 17:05:01

    我原来一直用 powershell 来干类似的活儿

  2. 老赵
    admin
    链接

    老赵 2011-09-01 00:34:57

    @haohaolee

    也是可以的,这跟用F#、IronPython、IronRuby是类似的方式。

  3. lemonhall
    117.32.153.*
    链接

    lemonhall 2011-09-01 01:35:36

    从不排斥MONO,但是MONO现在还在开发么?没有了原来NOVELL的支持,还继续给力着 么?

  4. pengjd
    210.21.243.*
    链接

    pengjd 2011-09-01 02:42:47

    老赵,什么时候也在深圳搞个技术沙龙什么的吧

  5. 老李
    60.49.118.*
    链接

    老李 2011-09-01 03:05:54

    F# interactive不支持intellisence吗?用Tab或Ctrl+Space也没反应。

    谢谢!

  6. 老赵
    admin
    链接

    老赵 2011-09-01 03:58:20

    @lemonhall

    干嘛非要依托在大公司下面,现在都建立独立的公司了,看产品和使用的人数和邮件列表就知道越来越给力了。

  7. 老赵
    admin
    链接

    老赵 2011-09-01 03:58:34

    @老李

    好像是没有……

  8. 老赵
    admin
    链接

    老赵 2011-09-01 03:58:51

    @pengjd

    没空组织了,最多参与一下……

  9. 原数据
    124.93.222.*
    链接

    原数据 2011-09-01 04:53:16

    最后一句亮了。

  10. mathgl
    203.218.7.*
    链接

    mathgl 2011-09-01 04:54:20

    @lemonhall: 从不排斥MONO,但是MONO现在还在开发么?没有了原来NOVELL的支持,还继续给力着 么?

    现在mono是xamarin维护。。。其实么,如果有兴趣的,上主页看看,阅读一下mail-list,很多问题确实是本不需要存在的。

  11. 链接

    campolake 2011-09-01 04:55:36

    有视频就好了

  12. imzrh
    58.58.20.*
    链接

    imzrh 2011-09-01 07:31:42

    老赵换工作后在网上露面的机会明显变少啊. 我以前也用Snippit Complier,后来发现LinqPad更好用,类似的活全交给LinqPad了.

  13. Ariel Lu
    123.127.236.*
    链接

    Ariel Lu 2011-09-01 08:16:56

    CsharpRepl可以用在.net下吗?

  14. 老赵
    admin
    链接

    老赵 2011-09-01 08:43:28

    @Ariel Lu

    你说呢?这种问题真是一搜便知,更何况文章都写在这里了。

  15. 链接

    tobin 2011-09-01 10:09:13

    mono 的推广和应用在国内还太少,学习了!

  16. 两会
    58.23.252.*
    链接

    两会 2011-09-02 01:45:25

    支持老赵,有机会要学一下F#,研究一下Mono。

  17. 链接

    14888263 2011-09-02 04:46:43

    赵劼,网名老赵,洋名Jeffrey Zhao,目前就职于盛大创新院产品开发部,研究员。

    这介绍文字要改了。

  18. Lionheart
    203.110.178.*
    链接

    Lionheart 2011-09-02 05:06:55

    即时窗口不就是是这个功能吗? 调试-窗口-即时

  19. Ariel Lu
    123.127.236.*
    链接

    Ariel Lu 2011-09-02 06:04:28

    @Ariel Lu: 你说呢?这种问题真是一搜便知,更何况文章都写在这里了。

    确实,我在mono-2.10.4上直接就可以编译

    cd mcs\jay
    jay -cv < skeleton.cs ../mcs/cs-parser.jay > ../mcs/cs-parser.cs
    
    cd ..\class\Mono.CSharp
    csc -t:library -out:..\..\..\Mono.CSharp.dll -D:NET_4_0 @Mono.CSharp.dll.sources > ..\..\..\Mono.CSharp.txt
    cd ..\..\tools\csharp
    csc /unsafe -out:..\..\..\csharp.exe -D:ON_DOTNET -r:..\..\..\Mono.CSharp.dll @csharp.exe.sources > ..\..\..\csharp.exe.txt
    cd ..\..\..
    sn -R Mono.CSharp.dll mcs\class\mono.snk > sn.txt
    
  20. 链接

    Ariel Lu 2011-09-02 06:16:39

    @Lionheart: 即时窗口不就是是这个功能吗? 调试-窗口-即时

    这个窗口功能很有限,linq语句就执行不了

  21. boo
    114.113.197.*
    链接

    boo 2011-09-02 06:37:56

    boo给力啊boo给力

  22. 老赵
    admin
    链接

    老赵 2011-09-02 08:15:20

    @Ariel Lu: 这个窗口功能很有限,linq语句就执行不了

    而且还得启动程序才行……

  23. 链接

    Ariel Lu 2011-09-02 08:24:03

    再请教老赵一个问题,CsharpRepl这个工具我已经从mono里编译出来了,但是只要语句一出错,以后的语句都无法正确执行了。老赵有办法解决吗?

  24. zzfff
    61.184.206.*
    链接

    zzfff 2011-09-02 12:41:51

    话说C#5,async这部分或许已经审美疲劳了,Compiler as a Service部分,掉人胃口很久了,信息很少,找到点:codename roslyn,这里有点介绍,9月份微软的BUILD会议Anders会登场吗?还不赶紧,世界末日快到了!

  25. blog_Me
    180.172.207.*
    链接

    blog_Me 2011-09-02 12:51:34

    期待下文! 字数够了吗? 在来点吧,还不够,这样可以了吧!!

  26. 老赵
    admin
    链接

    老赵 2011-09-02 15:40:46

    @zzfff

    BUILD是专注于Windows发布的,估计不太会有相关内容吧。

  27. 老赵
    admin
    链接

    老赵 2011-09-02 15:42:08

    @Ariel Lu: 再请教老赵一个问题,CsharpRepl这个工具我已经从mono里编译出来了,但是只要语句一出错,以后的语句都无法正确执行了。老赵有办法解决吗?

    我没遇到这个情况。

  28. 链接

    卡车司机 2011-09-03 02:29:04

    期待下一篇!

  29. barque
    119.129.109.*
    链接

    barque 2011-09-03 06:20:54

    上次广州沙龙录音我听了,关于那个mvc的view层的Dynamic model是怎么实现的,或者给几个关键词我去搜搜

  30. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-05 00:27:39

    大众点评网已经从.net迁移到java架构了,再次证明.net在企业级和互联网上是不易使用的。

  31. smile
    218.241.86.*
    链接

    smile 2011-09-05 02:55:36

    给力.....

  32. 老赵
    admin
    链接

    老赵 2011-09-05 08:03:21

    @mcpssx

    您终于又出现了,想死我了,可惜怎么还是没进步的样子。大众点评网用.NET出现问题了么?.NET一直用的好好的,是某位领导坚持要迁,众人劝说无果。还有,迁了多少了你知道么?听风就是雨,你也稍微学我打听打听再来发表高见么。不要以为当MS Hater就可以不顾技术人员基本素质啊,大哥。

    .NET的能力我都懒的多说,MySpace,StackOverflow,PlantyOfFish都摆在这里,足以证明其能力了。所谓大负载,还真没多少站点到过MySpace的级别。

  33. 老赵
    admin
    链接

    老赵 2011-09-05 08:05:38

    @barque

    其实昨天就写了,可惜写到一半看笑话去了,结果没写完……

  34. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-05 08:58:40

    @老赵

    点评网迁移架构到java的ppt网上都有了。

    http://www.slideshare.net/killme2008/ss-8805669

    至于你说的myspace云云,基本上对大家没有什么借鉴意义。.net架构的资料,根本无法与java、php相比,就好象你说sqlserver能力不弱于mysql一样,那没有意义,互联网绝对应该选择mysql。

    对了,你原来的麦库的客户端也不是.net的吧?你以前不是说evernote是不会用wpf吗?

  35. zzfff
    61.184.206.*
    链接

    zzfff 2011-09-05 12:20:22

    大众点评网和企业级有半毛钱关系?我一直觉得自己思维有些混乱,看来还没混乱到找不出更混乱的,欣慰!

  36. 老赵
    admin
    链接

    老赵 2011-09-05 12:23:11

    @mcpssx

    跟你说话怎么就那么令人哭笑不得?你思路稍微清楚点好不好,我说了点评没有转Java吗?找到个寥寥数页的PPT就以为得到真理了,真怀疑你看都没看。我说的是:点评.NET用出什么问题了吗?现在点评居然用上了JBoss,这个在我看来就摆明了是个人技术风格和喜好么。刚才问了问点评的朋友,还是不写代码的老板决定转Java的,写代码的码农们没办法,还有他们现在也正在努力干掉JBoss……

    你还号称自己十年经验什么的,到现在还不愿意承认.NET架构跟Java和PHP没有区别,我就不相信你是真不清楚,只是不愿意承认而已。你就知道PHP和MySQL,凭什么不能用Rails和PostgreSQL?真没什么可说的。

    麦库客户端用的是Delphi,只可惜这决策不是我做的。说白了技术无论选择什么都能做出来,就看个人选择什么了。还有evernote不会用WPF之类的,完全听不懂你说什么。

    拜托你不要在我这里说些有的没的,这些东西完全就跟几个月前一样,太无趣了,要不就拿出点技术人员风骨出来。你现在忽然又有空了,就拜托你:

    1. 写点你研究出来的成果,就会在我这里说你研究过这个那个,让你写你从来不写。
    2. 之前给过链接,你去范凯那里说说看。你当时说他死硬派没什么好说的,所以你也就能在我这个不那么强硬的地方捏捏软柿子了。

    到此为止,跟你没什么好说的了,除非你先把上面两点做给我看看。

  37. mcpssx
    59.175.192.*
    链接

    mcpssx 2011-09-06 03:03:53

    @老赵

    到现在还不愿意承认.NET架构跟Java和PHP没有区别,我就不相信你是真不清楚,只是不愿意承认而已。你就知道PHP和MySQL,凭什么不能用Rails和PostgreSQL?真没什么可说的。

    rails, pgsql因为会的人少啊!搞定一个java、php的架构要比.net、rails容易的多。.NET的大规模架构,基本没几个人会也没几个人用过,而php之类的架构网上到处都是。

    麦库客户端用的是Delphi,只可惜这决策不是我做的。说白了技术无论选择什么都能做出来,就看个人选择什么了。

    这就是我以前说过的,.net在用户客户端10年来连delphi、c++ builder都没有超过。

    还有evernote不会用WPF之类的,完全听不懂你说什么。

    针对就是以前你评论evernote因为性能问题从wpf转回了C++,你说性能不佳是因为evernote团队不会用wpf。

    写点你研究出来的成果,就会在我这里说你研究过这个那个,让你写你从来不写。

    因为我现在用的语言,基本上和大家没有什么交集。

    orbPercent = -0.6
    low.cmp.open = (d2$low - d2$open)/d2$atr
    which1 = which(low.cmp.open < orbPercent)
    cl1 = close.cmp.open[which1]
    win.num <- sum(cl1 < orbPercent,na.rm = T)
    win.atr.sum <- -sum(cl1 - orbPercent,na.rm = T)
    

    你看出来这是什么语言?

    之前给过链接,你去范凯那里说说看。你当时说他死硬派没什么好说的,所以你也就能在我这个不那么强硬的地方捏捏软柿子了。

    这个我以前早就说过了,我老早就在javaeye说过他就是黑熊掰玉米,他推的rails我2007年前就预言那流行不起来的。

    http://www.iteye.com/topic/130536?page=13

    mcpssx 写道:

    你这个其实就是ruby是黑客语言的一个原因,黑客语言其是就是一个高手在单打独斗时候威力巨大,团队合作时候一塌糊涂。C++,perl都是这样的典型, 企业开发要的就是规范,不过是一个web开发,搞出了天大的花样。

  38. 老赵
    admin
    链接

    老赵 2011-09-06 05:59:55

    @mcpssx

    谁让你写你现在做的东西了,你不是有十年经验,说起各种技术来都号称研究过么,就这个引擎那个运行时随便写点啊。让你写的时候就找各种理由不写。

    其他跟你没什么好说的,都说过很多次了,亏你还好意思谈网站架构呢。

  39. bin
    122.228.131.*
    链接

    bin 2011-09-07 13:54:39

    mono C#交互式控制台不支持win7的么?

  40. 老赵
    admin
    链接

    老赵 2011-09-07 14:07:45

    @bin

    我就在Win 7上用啊。

  41. hooray
    218.6.198.*
    链接

    hooray 2011-09-08 04:09:38

    用了下挺好,就是发现控制台不支持中文

  42. youyou2046
    58.101.30.*
    链接

    youyou2046 2011-09-08 13:02:16

    争来争去有什么意义吗?Java程序员为什么动不动就说.net应用受限。主要不是这个原因吧。.net才多少年。mono才多久。这些东西不是吹口气就能搞定的。我真的搞不懂。我是一个java程序员,虽然只做了一年但是发现了Java很多的问题。最严重的就是不够简洁,过于死板。想转回.net发现中国的.net非常的不给力。希望老赵努力呀。

  43. zzfff
    123.249.127.*
    链接

    zzfff 2011-09-14 03:43:52

    Future directions for C# and Visual Basic

    Date: September 15, 2011 from 9:00AM to 10:00AM

    Day 3 TOOL-816T Speakers: Anders Hejlsberg

    http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-816T

    总算盼到了

  44. junxy
    220.168.63.*
    链接

    junxy 2011-09-22 02:19:09

    Mono?自从知道她之后,就一直是她的忠实粉丝
    就是入门比较太麻烦,神马配置mono环境,编译安装。。至少要了解Linux,相关学习的中文资料也甚少啊

  45. netwjx
    218.94.19.*
    链接

    netwjx 2011-09-22 03:53:38

    很早就看到mono下有这个交互解释器 结果发现仅仅mono下可用 只好作罢(好像是涉及到图形上有差异 没想过将REPL剥离出来)

  46. Gabriel Zhang
    221.10.30.*
    链接

    Gabriel Zhang 2011-11-01 05:44:17

    老赵,我很好奇盛大里面有用mono运行的项目吗

  47. 旺财
    199.64.0.*
    链接

    旺财 2011-12-28 01:11:02

    必须顶老赵,很多MONO的资源还是从老赵这挖到的,正在用Monotouch+Unity3D做一个项目。

  48. elevenfire
    110.252.2.*
    链接

    elevenfire 2012-01-16 02:27:36

    "mcpssx"这个人就是一个白痴,天天吃撑了,来这里显示自己有多么的无知!请“mcpssx”别在装B了!

  49. elevenfire
    110.252.2.*
    链接

    elevenfire 2012-01-16 02:30:36

    装B的“mcpssx” ,忍不住要骂你了!!!

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我