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

threenewbee 2011-10-20 06:51:43
加精
每个人都可以写编译器?听上去很夸张。语法分析?词法分析?NO,要是这样,就谈不上“每个人”了。

事实上,如果你会用C#,水平在使用TreeView一类的控件没有什么大障碍,借助Roslyn,都可以试一试。

Roslyn是什么?Roslyn是VS11(下一代Visual Studio 开发代号)新增的一个特性的开发代号,它的目的是,开放C#和Visual Basic的编译器的API,使得开发者可以借助编译器解析代码文件,动态为编程语言增加功能,扩展编译器,自定义编译器动作,乃至其它。说的很玄乎,介绍一些典型的应用场景。

很多人用过CodeRush,里面的重构代码很好用,但是我想让你写一个一定让你觉得不容易。借助Roslyn,这一点十分容易就能实现(Roslyn带了一个代码在等效形式转换的例子,大家可以自己看)

相信不少人都有这样的需求,把一个C#源代码转换成VB.NET的,或者相反,网上也提供了不少在线转换的工具。但是不少有BUG,“仅供参考”是必须的。现在有了Roslyn,你同样可以实现这样的转换,因为基于官方编译器,所以可靠性大幅增加。

自动属性是Visual C# 2008新增的一个语法糖,之前只有微软能这么做,因为编译器是一个“黑盒”,现在有了Roslyn,你也可以做相同的事。(同样有示例代码)

有的人说,我不要那么复杂的,我想来一个源代码高亮的,用Roslyn同样很容易实现。

Roslyn如果只能做以上说到的这些,那么它不过是个玩具了。事实上,元编程(Meta Programming)才是Roslyn的设计目标,所谓元编程,就是说你的程序可以产生程序,产生的程序去完成具体的功能,你的程序是程序的程序,故叫做元编程。事实上,代码生成器就是元编程,不过它工作在开发阶段,实现也很丑陋。相信很多人都羡慕Ruby,ActiveRecord把元编程发挥到了极致。现在C#也能做这么酷的事情。

Roslyn CTP 的下载地址:http://www.microsoft.com/download/en/details.aspx?id=27746&WT.mc_id=rss_alldownloads_all
在我的Windows Server 2003电脑上安装,需要拷贝一个叫sqmapi.dll的文件到系统文件夹。并且先安装好以下软件:
Visual Studio 2010
Visual Studio 2010 SP1 补丁
Visual Studio 2010 SP1 SDK。微软为Roslyn CTP设立了一个论坛
http://social.msdn.microsoft.com/forums/en-us/roslyn
大家可以去反馈。

Roslyn CTP软件包里面有很多例子,都比较复杂,我写了一个简单的控制台程序,可以解析源代码中的符号。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string sourcecode = @"
public class Test
{
public static void Main(string[] args)
{
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
Console.WriteLine(sum);
Console.WriteLine(i++ * 3 + (5 - 2) / 7);
}
}";
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(sourcecode);
processChilds(tree.Root.ChildNodes());
}

static void processChilds(IEnumerable<SyntaxNode> nodes, int level = 0)
{
foreach (var node in nodes)
{
Console.WriteLine("{0}{1}: {2}", new string(' ', level * 2), node.Kind, node.GetFirstToken().ValueText);
if (node.HasChildren) processChilds(node.ChildNodes(), level++);
}
}
}
}

这是运行结果
ClassDeclaration: public
MethodDeclaration: public
PredefinedType: void
ParameterList: (
Parameter: string
ArrayType: string
PredefinedType: string
ArrayRankSpecifier: [
Block: {
LocalDeclarationStatement: int
VariableDeclaration: int
PredefinedType: int
VariableDeclarator: sum
EqualsValueClause: =
NumericLiteralExpression: 0
ForStatement: for
VariableDeclaration: int
PredefinedType: int
VariableDeclarator: i
EqualsValueClause: =
NumericLiteralExpression: 1
LessThanOrEqualExpression: i
IdentifierName: i
NumericLiteralExpression: 100
PostIncrementExpression: i
IdentifierName: i
Block: {
ExpressionStatement: sum
AddAssignExpression: sum
IdentifierName: sum
IdentifierName: i
ExpressionStatement: Console
InvocationExpression: Console
MemberAccessExpression: Console
IdentifierName: Console
IdentifierName: WriteLine
ArgumentList: (
Argument: sum
IdentifierName: sum
ExpressionStatement: Console
InvocationExpression: Console
MemberAccessExpression: Console
IdentifierName: Console
IdentifierName: WriteLine
ArgumentList: (
Argument: i
AddExpression: i
MultiplyExpression: i
PostIncrementExpression: i
IdentifierName: i
NumericLiteralExpression: 3
DivideExpression: (
ParenthesizedExpression: (
SubtractExpression: 5
NumericLiteralExpression: 5
NumericLiteralExpression: 2
NumericLiteralExpression: 7
Press any key to continue . . .
早上论坛有问题,打了很多字都没了。。。还有些什么想不起来了。。。先写这么多。
...全文
6914 128 打赏 收藏 转发到动态 举报
写回复
用AI写文章
128 条回复
切换为时间正序
请发表友善的回复…
发表回复
yojinlin 2012-06-16
  • 打赏
  • 举报
回复
感謝分享。
tylike 2012-06-16
  • 打赏
  • 举报
回复
楼主能不能提供一个用roslyn项目制作的 语法糖示例?
threenewbee 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用 123 楼 的回复:]
微软要是能直接出一个把C#代码编译成机器码的编译器,那C#就真火了。

底层用C,其他的用C#,而现在C#与C++基本就差在了性能上了,不论是功能还是开发效率,C#都要比C++优秀不少,所以如果C#能在windows平台实现直接编译成机器码,那我估计会有更多的程序用C#写了,而C++的位置就很尴尬
[/Quote]

但是Intel一直在致力于创造一个可以直接运行字节代码的CPU。实际上,你会发现,Intel Pentium 4以后的CPU,CLR、JVM的效率都大幅提高。当然,你也可以说,JVM虚拟机和CLR虚拟机,都更类似一个RISC计算机。
bigbaldy 2012-04-23
  • 打赏
  • 举报
回复
微软要是能直接出一个把C#代码编译成机器码的编译器,那C#就真火了。

底层用C,其他的用C#,而现在C#与C++基本就差在了性能上了,不论是功能还是开发效率,C#都要比C++优秀不少,所以如果C#能在windows平台实现直接编译成机器码,那我估计会有更多的程序用C#写了,而C++的位置就很尴尬
无趣 2011-12-14
  • 打赏
  • 举报
回复
很影响性能,VS老死,我删除了。
PatternA 2011-10-27
  • 打赏
  • 举报
回复
学习了
yunzhongzhizi 2011-10-26
  • 打赏
  • 举报
回复
谢谢楼主分享
greenlele 2011-10-26
  • 打赏
  • 举报
回复
支持了,
taiyang6748118 2011-10-26
  • 打赏
  • 举报
回复
技术贴 感谢楼主分享 学习了
mollyjh 2011-10-25
  • 打赏
  • 举报
回复
收藏了,有空学学。
shine333 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 106 楼 caozhy 的回复:]

引用 105 楼 shine333 的回复:
引用 99 楼 caozhy 的回复:

引用 98 楼 shine333 的回复:
引用 91 楼 caozhy 的回复:
应该这么说,roslyn搞出来,DLR、ET就鸡肋了。如同有了LINQ,那些List.Sort、SortList之类的东西就没用了。事实上,这些东西根本不该有。

前半句不懂,也不想去搞懂。但是后半句,绝对就是大……
[/Quote]
很早以前,我也是持此逻辑,认为.net世界根本就不该允许VB.NET,J#之类的存在(在现代IDE的帮助下,从IF condition THEN ... END IF,切换至if (condition) {}似乎不比VB -> .NET本身来的困难

但是事实上,很多时候,事情不是那么理想主义的。

可以拿我对ie6的看法来做个比较,即作为开发者,你应当遵守新的标准,而不是以腐朽的ie6为基准。并且,时刻引导你的用户向ie6过度。但是,如果你的用户,还是绝大部分还在用ie6的时候,你绝对不能忽视他们,更不能视其为无物。
threenewbee 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 105 楼 shine333 的回复:]
引用 99 楼 caozhy 的回复:

引用 98 楼 shine333 的回复:
引用 91 楼 caozhy 的回复:
应该这么说,roslyn搞出来,DLR、ET就鸡肋了。如同有了LINQ,那些List.Sort、SortList之类的东西就没用了。事实上,这些东西根本不该有。

前半句不懂,也不想去搞懂。但是后半句,绝对就是大言不惭,与“有了瑞士军刀,就不需要剪刀了”一样
……
[/Quote]
你忽视了另一个问题,那就是,如果一个语言/平台本身不断腐败,那么它什么也舍不得扔,最后开发者把它也扔掉了。事实上去问问那些从Java或者C++平台转向.NET、Python和Ruby的,谁不对前两者大量遗留代码和冗余无用繁杂的框架库深恶痛绝?“事实上,这些东西根本不该有”的意思就是,因为有了不该有的,去掉的成本更高,所以不该有。
shine333 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 99 楼 caozhy 的回复:]

引用 98 楼 shine333 的回复:
引用 91 楼 caozhy 的回复:
应该这么说,roslyn搞出来,DLR、ET就鸡肋了。如同有了LINQ,那些List.Sort、SortList之类的东西就没用了。事实上,这些东西根本不该有。

前半句不懂,也不想去搞懂。但是后半句,绝对就是大言不惭,与“有了瑞士军刀,就不需要剪刀了”一样

明白你的比喻,但是你显然没有明白我说的意……
[/Quote]
说不想搞懂,因为我不是一个.net程序员(虽然偶尔也开开VS,写点东西玩玩),roslyn显然与我无关,所以说“不想搞懂”应该没问题。

说“大言不惭”,是因为“事实上,这些东西根本不该有”这句,并非“如同有了LINQ,那些List.Sort、SortList之类的东西就没用了”,故而有军刀之比喻。
一则,没有这些东西,很多后面的东西也不一定会出来,或者出来了可能也不是这个样子。
二则,每一版的更新,特别是.net framework,如果都把前一版稍许有些臭味道,或者已经有新替代方案的就方法破弃掉,那么,结果只能造成广大无辜用户的开发、维护成本上升。有些旧工程,可能只要新增一些模块,并顺便(因为其他某些原因)从.NET X 迁移到 .NET X+1,旧有代码可能根本不需要动,只要重新测试即可。如果因为引入了linq,就不再支持新的API,那么当年的vista就是最好的教材
liuwpy 2011-10-25
  • 打赏
  • 举报
回复
学习了,不知行不行?
wquanchao 2011-10-25
  • 打赏
  • 举报
回复
有一天发现不用编程也能做软件
zhwenlong 2011-10-25
  • 打赏
  • 举报
回复
谢谢分享!先收藏下哈!
founderfang 2011-10-25
  • 打赏
  • 举报
回复
好好学习,天天向上
愚公移码 2011-10-24
  • 打赏
  • 举报
回复
真的吗。
xzayzl 2011-10-24
  • 打赏
  • 举报
回复
谢谢分享
一介布衣萧萧 2011-10-24
  • 打赏
  • 举报
回复
很不错,支持个
加载更多回复(92)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧