问题描述
每个人都可以写编译器?听上去很夸张。语法分析?词法分析?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楼的问题有得救吗?