`
RednaxelaFX
  • 浏览: 3015951 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

IronPython放出RC1

    博客分类:
  • DLR
阅读更多
下载链接:http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=17404
Release Notes: [url]http://www.codeplex.com/IronPython/Wiki/View.aspx?title=v2.0 Release Candidate 1 Release Notes&referringTitle=Home[/url]

这次的RC1最大的一个特征就是在MSI安装包里提供了Ngen安装的程序集的选项。把安装的程序集Ngen过之后,程序启动速度会大幅提升,代价是Ngen出来的二进制文件会占据一定空间。(“一定”还是太保守了。Ngen之后的IronPython+标准库+DLR居然会吃掉40M+的内存。天啊!)
另外,还是为了解决DLR与.NET Framework 3.5的System.Core.dll的冲突,在RC1里新增了一个Microsoft.Scripting.ExtensionAttribute.dll程序集,里面只有一个ExtensionAttribute类;只要不同时引用这个程序集合System.Core.dll,应该就不会发生冲突(因为随着IronPython 2.0 RC1发布的DLR里的System.*命名空间全都改成Microsoft.*了,所以不会冲突)。

对DLR的关注者而言有个好消息,那就是已经几个月没跟随IronPython一起发布的ToyScript在这次的RC1里终于回来了。

进入到RC阶段,IronPython 2.0系列的对外API大致进入了稳定阶段(也就是说Beta5之后就不会有大的API变化,只会有bugfix)。但这不代表其底层所使用的内部API到达了稳定阶段——至少,DLR的API还在不停的调整,至少LINQv2的API还在调整,Old-*系的老类/接口也尚未清理完。可以预见,正式发布的IronPython 2.0中的DLR也不会达到API稳定的阶段。我的猜测是DLR的开发进度(deadline)或许会跟C# 4同步,因为C# 4的动态特性依赖于DLR。

===========================================================================

顺便说说最近DLR里的一些变化。我最高兴的一点是文档明显增加了。
许多优化很明显是为了性能改善而做的努力,其中有两个有趣的地方:尽量使用普通for而减少使用foreach来访问数组和实现了IList<T>接口的容器、尽量减少数据所占的空间。
使用普通的for循环是为了减少创建enumerator(也就是iterator)的个数;实际效果看,enumerator对象个数确实是能减少,能减轻GC的压力,但在GC以外这个做法能有多少改善呢?CLR的优化还真是有待进一步提升。
减少数据占用的空间主要是通过把成员变量提升为静态变量,或者使用更小的类型来装数据(例如把ExpressionType跟NodeFlags放在一个Int32里),或者干脆把作用不大的成员变量去掉。
一个东西开发到一定阶段之后,为了性能考虑,代码果然是不得不变丑啊……||

Action方面,原本叫做Rule<T>的类改名为CallSiteRule<T>了,更显著的变化是它的可见性从public变为了internal,而其中一些成员(_parameters、_returnLabel)变成了静态只读成员(Parameters、ReturnLabel),于是原本每个实例都会带着的一些数据变为由每个泛型类型实例带着。CallSiteBinder<T>.Bind()也不再返回Rule<T>,而是直接返回一个“测试+执行”的Expression。

AST方面,有更多类型从Statement转变为Expression,例如Block->BlockExpression、EmptyStatement->EmptyExpression、LoopStatement->LoopExpression、SwitchStatement->SwitchExpression、ThrowStatement->ThrowExpression、TryStatement->TryExpression。
Variable相关的好几个类型也在不停的调整,例如说把VariableExpression合并到ParameterExpression里去之类。
控制流跳转的节点(break、continue、return、goto)合并为GotoExpression。这点比较诡异,没看出具体的好处是什么。而且ReturnStatement为什么还在呢……
另外,早些时候用于标记代码位置信息的SourceLocation和SourceSpan两个类都从Microsoft.Scripting.dll移回到了Microsoft.Scripting.Core.dll里,位于System.Linq.Expression命名空间里(或者IronPython 2.0里叫Microsoft.Linq.Expression)。但没有任何Expression类对它有直接引用,这是怎么回事?其实同一命名空间里有一个Annotations类,SourceSpan信息可以放在它的实例里被Expression所引用。最近新增了一个SymbolDocumentInfo类也是为了生成调试符号信息而存在的。(其实是从SourceFileInformation改名而来,但不知为何SourceFileInformation没被删掉)。这样,以后使用LINQv2的时候就有希望在调试时得到正确的行号信息了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics