Hello World
Spiga

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

2011-09-01 00:25 by 老赵, 8422 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

50 条回复

  1. haohaolee
    121.63.62.*
    链接

    haohaolee 2011-09-01 01:05:01

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

  2. 老赵
    admin
    链接

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

    @haohaolee

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

  3. lemonhall
    117.32.153.*
    链接

    lemonhall 2011-09-01 09:35:36

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

  4. pengjd
    210.21.243.*
    链接

    pengjd 2011-09-01 10:42:47

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

  5. 老李
    60.49.118.*
    链接

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

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

    谢谢!

  6. 老赵
    admin
    链接

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

    @lemonhall

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

  7. 老赵
    admin
    链接

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

    @老李

    好像是没有……

  8. 老赵
    admin
    链接

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

    @pengjd

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

  9. 原数据
    124.93.222.*
    链接

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

    最后一句亮了。

  10. mathgl
    203.218.7.*
    链接

    mathgl 2011-09-01 12:54:20

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

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

  11. 链接

    campolake 2011-09-01 12:55:36

    有视频就好了

  12. imzrh
    58.58.20.*
    链接

    imzrh 2011-09-01 15:31:42

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

  13. Ariel Lu
    123.127.236.*
    链接

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

    CsharpRepl可以用在.net下吗?

  14. 老赵
    admin
    链接

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

    @Ariel Lu

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

  15. 链接

    tobin 2011-09-01 18:09:13

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

  16. 两会
    58.23.252.*
    链接

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

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

  17. 链接

    14888263 2011-09-02 12:46:43

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

    这介绍文字要改了。

  18. Lionheart
    203.110.178.*
    链接

    Lionheart 2011-09-02 13:06:55

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

  19. Ariel Lu
    123.127.236.*
    链接

    Ariel Lu 2011-09-02 14: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 14:16:39

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

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

  21. boo
    114.113.197.*
    链接

    boo 2011-09-02 14:37:56

    boo给力啊boo给力

  22. 老赵
    admin
    链接

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

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

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

  23. 链接

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

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

  24. zzfff
    61.184.206.*
    链接

    zzfff 2011-09-02 20: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 20:51:34

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

  26. 老赵
    admin
    链接

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

    @zzfff

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

  27. 老赵
    admin
    链接

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

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

    我没遇到这个情况。

  28. 链接

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

    期待下一篇!

  29. barque
    119.129.109.*
    链接

    barque 2011-09-03 14:20:54

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

  30. smile
    218.241.86.*
    链接

    smile 2011-09-05 10:55:36

    给力.....

  31. 老赵
    admin
    链接

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

    @barque

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

  32. zzfff
    61.184.206.*
    链接

    zzfff 2011-09-05 20:20:22

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

  33. bin
    122.228.131.*
    链接

    bin 2011-09-07 21:54:39

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

  34. 老赵
    admin
    链接

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

    @bin

    我就在Win 7上用啊。

  35. hooray
    218.6.198.*
    链接

    hooray 2011-09-08 12:09:38

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

  36. youyou2046
    58.101.30.*
    链接

    youyou2046 2011-09-08 21:02:16

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

  37. zzfff
    123.249.127.*
    链接

    zzfff 2011-09-14 11: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

    总算盼到了

  38. junxy
    220.168.63.*
    链接

    junxy 2011-09-22 10:19:09

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

  39. netwjx
    218.94.19.*
    链接

    netwjx 2011-09-22 11:53:38

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

  40. Gabriel Zhang
    221.10.30.*
    链接

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

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

  41. 旺财
    199.64.0.*
    链接

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

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

  42. elevenfire
    110.252.2.*
    链接

    elevenfire 2012-01-16 10:27:36

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

  43. elevenfire
    110.252.2.*
    链接

    elevenfire 2012-01-16 10:30:36

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

  44. dbl
    183.62.57.*
    链接

    dbl 2014-03-02 19:39:22

    我不是程序员,是一个工程人员,常用matlab,matlab其实可以再交互环境下调用。net函数。应该跟这个差不多

已自动隐藏某些不合适的评论内容(主题无关,争吵谩骂,装疯卖傻等等),如需阅读,请准备好眼药水并点此登陆后查看(如登陆后仍无法浏览请留言告知)。

发表回复

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

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

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

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

使用Live Messenger联系我