每个人都可以写编译器——Roslyn CTP试用

问题描述

每个人都可以写编译器?听上去很夸张。语法分析?词法分析?NO,要是这样,就谈不上“每个人”了。事实上,如果你会用C#,水平在使用TreeView一类的控件没有什么大障碍,借助Roslyn,都可以试一试。Roslyn是什么?Roslyn是VS11(下一代VisualStudio开发代号)新增的一个特性的开发代号,它的目的是,开放C#和VisualBasic的编译器的API,使得开发者可以借助编译器解析代码文件,动态为编程语言增加功能,扩展编译器,自定义编译器动作,乃至其它。说的很玄乎,介绍一些典型的应用场景。很多人用过CodeRush,里面的重构代码很好用,但是我想让你写一个一定让你觉得不容易。借助Roslyn,这一点十分容易就能实现(Roslyn带了一个代码在等效形式转换的例子,大家可以自己看)相信不少人都有这样的需求,把一个C#源代码转换成VB.NET的,或者相反,网上也提供了不少在线转换的工具。但是不少有BUG,“仅供参考”是必须的。现在有了Roslyn,你同样可以实现这样的转换,因为基于官方编译器,所以可靠性大幅增加。自动属性是VisualC#2008新增的一个语法糖,之前只有微软能这么做,因为编译器是一个“黑盒”,现在有了Roslyn,你也可以做相同的事。(同样有示例代码)有的人说,我不要那么复杂的,我想来一个源代码高亮的,用Roslyn同样很容易实现。Roslyn如果只能做以上说到的这些,那么它不过是个玩具了。事实上,元编程(MetaProgramming)才是Roslyn的设计目标,所谓元编程,就是说你的程序可以产生程序,产生的程序去完成具体的功能,你的程序是程序的程序,故叫做元编程。事实上,代码生成器就是元编程,不过它工作在开发阶段,实现也很丑陋。相信很多人都羡慕Ruby,ActiveRecord把元编程发挥到了极致。现在C#也能做这么酷的事情。RoslynCTP的下载地址:http://www.microsoft.com/download/en/details.aspx?id=27746&WT.mc_id=rss_alldownloads_all在我的WindowsServer2003电脑上安装,需要拷贝一个叫sqmapi.dll的文件到系统文件夹。并且先安装好以下软件:VisualStudio2010VisualStudio2010SP1补丁VisualStudio2010SP1SDK。微软为RoslynCTP设立了一个论坛http://social.msdn.microsoft.com/forums/en-us/roslyn大家可以去反馈。RoslynCTP软件包里面有很多例子,都比较复杂,我写了一个简单的控制台程序,可以解析源代码中的符号。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingRoslyn.Compilers;usingRoslyn.Compilers.CSharp;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){stringsourcecode=@"publicclassTest{publicstaticvoidMain(string[]args){intsum=0;for(inti=1;i<=100;i++){sum+=i;}Console.WriteLine(sum);Console.WriteLine(i++*3+(5-2)/7);}}";SyntaxTreetree=SyntaxTree.ParseCompilationUnit(sourcecode);processChilds(tree.Root.ChildNodes());}staticvoidprocessChilds(IEnumerable<SyntaxNode>nodes,intlevel=0){foreach(varnodeinnodes){Console.WriteLine("{0}{1}:{2}",newstring('',level*2),node.Kind,node.GetFirstToken().ValueText);if(node.HasChildren)processChilds(node.ChildNodes(),level++);}}}}

这是运行结果ClassDeclaration:publicMethodDeclaration:publicPredefinedType:voidParameterList:(Parameter:stringArrayType:stringPredefinedType:stringArrayRankSpecifier:[Block:{LocalDeclarationStatement:intVariableDeclaration:intPredefinedType:intVariableDeclarator:sumEqualsValueClause:=NumericLiteralExpression:0ForStatement:forVariableDeclaration:intPredefinedType:intVariableDeclarator:iEqualsValueClause:=NumericLiteralExpression:1LessThanOrEqualExpression:iIdentifierName:iNumericLiteralExpression:100PostIncrementExpression:iIdentifierName:iBlock:{ExpressionStatement:sumAddAssignExpression:sumIdentifierName:sumIdentifierName:iExpressionStatement:ConsoleInvocationExpression:ConsoleMemberAccessExpression:ConsoleIdentifierName:ConsoleIdentifierName:WriteLineArgumentList:(Argument:sumIdentifierName:sumExpressionStatement:ConsoleInvocationExpression:ConsoleMemberAccessExpression:ConsoleIdentifierName:ConsoleIdentifierName:WriteLineArgumentList:(Argument:iAddExpression:iMultiplyExpression:iPostIncrementExpression:iIdentifierName:iNumericLiteralExpression:3DivideExpression:(ParenthesizedExpression:(SubtractExpression:5NumericLiteralExpression:5NumericLiteralExpression:2NumericLiteralExpression:7Pressanykeytocontinue...

早上论坛有问题,打了很多字都没了。。。还有些什么想不起来了。。。先写这么多。

解决方案

本帖最后由 caozhy 于 2011-10-20 07:03:35 编辑
解决方案二:
该回复于2011-10-20 07:04:09被版主删除
解决方案三:
该回复于2011-11-07 10:49:15被版主删除
解决方案四:
进来涨见识的
解决方案五:
该回复于2011-10-20 11:51:05被版主删除
解决方案六:
学习了。。。
解决方案七:
应该是不错的东西,但对它的性能表示怀疑
解决方案八:
不错的东西
解决方案九:
谢谢分享!先收藏下哈!
解决方案十:
//听起来很美,可以尝试一下.谢谢楼主

解决方案十一:
前提条件太苛刻!
解决方案十二:
没办法只引用一些DLL就实现?如果不行就是鸡肋了
解决方案十三:
太鸡肋?
解决方案十四:
我是元编程的忠实粉丝,诱惑很大很大啊,win2008能装vs2011吗?
解决方案十五:
这个是不是得有VS11才行啊?
解决方案:
引用13楼sbwwkmyd的回复:

我是元编程的忠实粉丝,诱惑很大很大啊,win2008能装vs2011吗?

刚查了一下,需要win2008R2。我的笔记本是32位CPU,visitOEM版的,装win2008可以激活,但是不知道R2行不行。
解决方案:
引用13楼sbwwkmyd的回复:

我是元编程的忠实粉丝,诱惑很大很大啊,win2008能装vs2011吗?

刚查了一下,需要win2008R2。我的笔记本是32位CPU,visitOEM版的,能激活win2008。但是不知道能不能无条件升级或安装激活R2?
解决方案:
有点时候确实有用
解决方案:
UP下...
解决方案:
takealook...404
解决方案:
楼主能不能提供一个sqmapi.dll下载,谢谢
解决方案:
引用20楼sbwwkmyd的回复:

楼主能不能提供一个sqmapi.dll下载,谢谢

我现在用的也是win2003
解决方案:
引用20楼sbwwkmyd的回复:

楼主能不能提供一个sqmapi.dll下载,谢谢

不用了,谢谢
解决方案:
引用16楼sbwwkmyd的回复:

引用13楼sbwwkmyd的回复:我是元编程的忠实粉丝,诱惑很大很大啊,win2008能装vs2011吗?刚查了一下,需要win2008R2。我的笔记本是32位CPU,visitOEM版的,能激活win2008。但是不知道能不能无条件升级或安装激活R2?

这个CTP预览是forVS2010的。另外,如果你要装2008R2,我可以提供你激活key。
解决方案:
这个,听起来不错,要是C++的编译器开放api的话,更爽啊。
解决方案:
学习了封闭了这么就的VS终于有走向开放的趋势了
解决方案:
有点意思关注
解决方案:
跟着微软跑,就是要屁颠屁颠的,而且还跟不上
解决方案:
该回复于2011-10-20 13:58:24被版主删除
解决方案:
把一个C#源代码转换成VB.NET的,在哪里转换
解决方案:
收藏下,有空看
解决方案:
这么说,可以用C#做易语言之类的那种编程软件了?,当然也可以做VS2012了?
解决方案:
引用23楼caozhy的回复:

这个CTP预览是forVS2010的。另外,如果你要装2008R2,我可以提供你激活key。

如果有需要的时候我会找你的,谢谢你的热情。vs2010sp1装了一上午,因为无缘无故的回滚了一次。
解决方案:
学习学习
解决方案:
鸡肋。。。
解决方案:
求救:VisualStudio2010SP1SDK我和vs2010是中文版的,刚打了个sp1补丁,重启以后下载了个英文版的SDK(没找到中文版的),安装提示错误说我没装vs2010。怎么办?
解决方案:
vs2010就象是vista。确实是鸡肋。
解决方案:
API好多的东西不懂,学习
解决方案:
引用34楼zzxap的回复:

鸡肋。。。

赞。mono有源码。你可以能实现楼主的大部分功能。早听说vb6.0的编译器要开源。后来没消息了,不知道是真是假。如果真开源了。估计vb又会热起来。
解决方案:
引用35楼sbwwkmyd的回复:

求救:VisualStudio2010SP1SDK我和vs2010是中文版的,刚打了个sp1补丁,重启以后下载了个英文版的SDK(没找到中文版的),安装提示错误说我没装vs2010。怎么办?

不好意思,开始那个下的不是SP1的,刚下了个SP1的SDK,还是报错ErrorType:Microsoft.VisualStudio.Sdk.Setup.MEIExecutionExceptionErrormessage:WindowsInstallerhasencounteredanerrorinstallingthepackageMicrosoftVisualStudio2010SDKSP1MSIerrorcode:1601这个信息等于没有,不知道怎么办?
解决方案:
这是解释还是编译?
解决方案:
引用39楼sbwwkmyd的回复:

不好意思,开始那个下的不是SP1的,刚下了个SP1的SDK,还是报错ErrorType:Microsoft.VisualStudio.Sdk.Setup.MEIExecutionExceptionErrormessage:WindowsInstallerhasencounteredanerrorinstallingthepackageMicrosoftVisualStudio2010SDKSP1MSIerrorcode:1601这个信息等于没有,不知道怎么办?

我在这个地址下的,是不是下载的包不匹配?那么正确的包应该在哪下呢?
解决方案:
看起来不错,有时间研究一下
解决方案:
哇,,,原来如此,学习学习哦
解决方案:
引用36楼myqq1060151476的回复:

vs2010就象是vista。确实是鸡肋。

才不是你说的这样呢。
解决方案:
我只会VB
解决方案:
太复杂,俺用不到
解决方案:
引用44楼xinyaping的回复:

引用36楼myqq1060151476的回复:vs2010就象是vista。确实是鸡肋。才不是你说的这样呢。

鸡肋这个词,仅仅是一个主观意愿。你的功能,我用不着,或者有更好的时候,自然称之为鸡肋。比如,在windows环境下写程序,我认为C++就是鸡肋,相对于C#基本没有多少优势。甚至有很多东西非托管C++很难实现,比如基于元数据的编程。但是C++粉就会很不舒服了,就好像从小吃辣椒长大的吃不到辣椒就不舒服一样。
解决方案:
引用44楼xinyaping的回复:

引用36楼myqq1060151476的回复:vs2010就象是vista。确实是鸡肋。才不是你说的这样呢。

对于绝大多数开发者说,他们仍然使用C#1.1的方式写程序,VS2010只不过是一个界面更漂亮的VS2003,这么说也无可厚非。如同有的工厂还在用Pentium4的电脑运行基于DOS的程序,对他们来说,Pentium4其实就是一个速度更快的8086而已。
解决方案:
引用41楼sbwwkmyd的回复:

引用39楼sbwwkmyd的回复:不好意思,开始那个下的不是SP1的,刚下了个SP1的SDK,还是报错ErrorType:Microsoft.VisualStudio.Sdk.Setup.MEIExecutionExceptionErrormessage:WindowsInstallerhasencounteredanerrorinstallingth……

没错,就是这个地址。要先装VS2010SP1。测试版的东西不太完善,建议你最好使用和微软开发者接近的平台。他们使用英文版系统和VS2010、Windows7或者/和WindowsServer2008。
解决方案:
楼主终于来了,谢谢你给我的激活码和资料。想问楼主,我41楼的问题有得救吗?

时间: 2025-01-21 12:33:29

每个人都可以写编译器——Roslyn CTP试用的相关文章

很多人在为写不出文章而烦恼

很多人在为写不出文章而烦恼,确实就拿笔者SEO空城来说,有时候要写一篇文章真的要想很久才能写出一篇,确实费劲可是没办法,客户需要软文,不得不写,一个文凭再好的也不能天天就能写不完的文章,我不是说自己的写作水平很好,写文章是需要技巧的,而不是随便就敲打出来不经过头脑就能写出来的,就算随便敲打出来的文章也是语句不通顺的文章,这样也是在浪费时间,根本达不到说服用户的文章,接下来我们看看这位网友遇到什么问题. 不知道你有没有启示,还有在看的你,其实互联网上从来都不缺素材,人的大脑也从来不缺少灵感,多去发

不是什么人都可以称作seoer

大家好,我是魏东东.已经好久没有认认真真的写一些文章了.今天心情压抑想写一下关于这段时间的seo心得体会.文章的题目叫<不是什么人都可以叫seoer>,是本人互联 网首创作品.写本文的目的不是来宣扬本人是一个真正的seoer,而是本人不是,所以写下这篇文章用意就是鼓励自己,第二个方面就是警惕那些过于自以为是,盲目不屑一顾的自 命清高的伪seoer们把我们seo这一行搞的白菜价,渐渐的失去了soer们特有的光环. 先谈一下目前seo在国内的现状吧,本人目光狭隘,看的不准确,希望高手多批评. se

做程序员工资高福利好?其实是压力山大 很多人都快疯了

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 软件程序员在如今看来是一个既能挣钱又有工作保障的职业,但是,这种职业对你的精神健康却会造成巨大的伤害. 有两种事情几乎能让程序员疯掉. 一个是被人们称作"骗子综合征(imposter syndrome)"的东西.患这种症状的人通常是发现一起共事的所有程序员都比自己聪明.比自己有天份.比自己有才能.你生活中一直恐惧中,担心其他人会最终发现你是个冒牌货.你的技术和能力是装出来的. 经常会有女性程序员坦白说遭受"骗子综合征(i

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了 进入21世纪,新的编程语言如雨后春笋一样不停地冒出来.需求当然是重要的驱动力量,但是在其中起了重要作用的就是工具链的改善. 2000年,UIUC的Chris Lattner主持开发了一套称为LLVM(Low Level Virtual Machine)的编译器工具库套件.后来,LLVM的scope越来越大,Low Level Virtual Machine已经不足以表示LLVM的全部,于是,LLVM就变成了正式的名字.LLVM可以

99%的人都理解错了HTTP中GET与POST的区别

GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出的他们的区别,你非常清楚知道什么时候该用什么. 当你在面试中被问到这个问题,你的内心充满了自信和喜悦. 你轻轻松松的给出了一个"标准答案": GET在浏览器回退时是无害的,而POST会再次提交请求. GET产生的URL地址可以被

每个人都希望自己的网站能够出现在搜索引擎的前端

每个人都希望自己的网站能够出现在搜索引擎的前端,都希望能够从搜索引擎处博得更多的流量.但是却很少有人考虑,为什么自己的新流量会在短时间内迅速的流失呢?其实想象也很简单,用户觉得你的网站没有新鲜感了,每天看的东西都是枯燥无味的!下次自然就不会再来了!学会一下几点让你的blog杜绝枯燥无味! 一.不要总在说自己 或许网站的掌控权确实在你一个人手中,但是如果你的推销产品不是你自己,那么我们就不该频繁的写自己的/吃/喝/拉/撒/睡/.那为什么明星写这些有人看呢?原因很简单人家营销的就是自己,反之用户需要

做程序员压力山大,很多人都快疯了

软件程序员在如今看来是一个既能挣钱又有工作保障的职业,但是,这种职业对你的精神健康却会造成巨大的伤害. 有两种事情几乎能让程序员疯掉. 一个是被人们称作"骗子综合征(imposter syndrome)"的东西.患这种症状的人通常是发现一起共事的所有程序员都比自己聪明.比自己有天份.比自己有才能.你生活中一直恐惧中,担心其他人会最终发现你是个冒牌货.你的技术和能力是装出来的. 经常会有女性程序员坦白说遭受"骗子综合征(imposter syndrome)"的折磨,这

作为一个自然人,每个人都具有多方面的属性

对于这个未曾谋面的人的理解,便停留在了这几个文字上:40周岁,优雅100创始人兼CEO,前当当网副总裁,清华大学高材生,处女座.这些词,组成了一个一板一眼滴水不漏的商界人士.然而,陈腾华给人的第一印象并不似一个精明的商人,他缺少的并不仅是笔挺的西装和该有的眉头紧锁.我一直在思索,他与众不同的是什么,最后终于恍然大悟,他没有那些行色匆匆和紧张,他呈现给人们的更像是一种生活状态,而生活二字,从不是那么简单,一个人也从不是几个文字便能代表的,真正能总结一个人的,是他散发出来的强大气场.陈腾华,现任优雅

很多人都在埋怨没有遇到好的团队,但好的团队不可能凭空出现,一流的团队不能仅靠团队成员努力,作为Leader,要有可行的规划,并坚定地执行、时势地调整(转)

  <西游记>中的唐僧团队历经千难万险,终于求得真经,目标明确.分工合理为这支队伍最终走向成功奠定了基础.唐僧从一开始,就为这个团队设定了西天取经的目标,虽然经历各种挫折与磨难,但目标从未动摇.悟空探路.八戒牵马.沙僧挑担,几位徒弟一起肩负着保护唐僧的任务.虽然性格迥异.各有缺点,但目标分解合理及成员分工合作,最终风雨同舟,取得真经. <西游记>的故事引申到实际团队技术管理中,也一样有借鉴意义,本文作者为CTO俱乐部会员.湖北同城一家网络科技有限公司开发总监杨斌,他结合自己多年经历