[转]Delphi2009带来了什么?
原文 :
目前网上多数Delphi2009新特性的介绍集中在Unicode,以及一些新的VCL上,我试图从一些不同的角度察看一下Delphi2009都有些什么新东西。
集成开发环境 IDE:
粗看起来Delphi2009的IDE较之Delphi2007并没有什么特别的增强。主要的UI元素也没有大的变化。最显著的变化就是Project Manager和Tool Palette,另外DockWindow的按钮样式进行了调整,更加符合整体IDE风格,不像上一个版本那样显得多少有些突兀。
Class Explorer只是针对本工程的,并不会随着Editor中文件的变化而变化,新增的VCL其实无关痛痒,所以单从IDE来看还是难免让我这种好色之徒有些失望。
运行时库 RTL:
用Merge工具比较Delphi2009 RTL和Delphi2007 RTL源码的时候会发现其实内部的增强变化还是很多的:)。更加多的更合理的inline procedure,不知是学习了Java还是C#,TObject也新增的UnitName,HashCode,以及ToString等方法属性。其中的UnitName方法应该还是比较有用的,使得目前的unit进化成兼具namespace和类似Java package的单元。
同时可以看到新增的两个Generics单元,Generics.Collections和Generics.Default已经开始使用新型的namespace的命名模式。Delphi中“万能”的TList类相对于Delphi2007也进行了大量的修改优化以及增订。
个人觉得整个RTL中比较有遗憾的是Generices.Collections中的TList并真正的没有替换掉Classes中的TList,其实从行为上Classes.TList应该只是Generics.Collections.TList有很大的重复。Classes.TList中存放指针其实完全可以由Generics.Collections.TList<Pointer>或者Generics.Collections.TList<Integer>替代。
另外在使用过程中我注意到Editor中的ErrorInsight问题还是很多,如TDictionary中的GetItem()方法就不会被Editor正确的识别。可能CodeGear的人手确实还不是很足。
不管怎么说Unicode是Delphi欠了太多年的东西了,而Generics虽然来得晚了些,毕竟终于是来了。直接进行算术运算的指针功能提供了Object Pascal能够进行更好的低阶编成的能力。
我们还是看到了Tiburon的增强,客观的讲,内部的改进确实还是挺大的,尤其是在CodeGear人手并不是很整齐的情况下,之前觉得遗憾的地方的意思就是说Delphi在外围的变化并没有跟上其内部的改进速度。
可以说Compiler走在了其改进的前面,也可以认为CodeGear本身也并没有在Delphi本身的开发上发挥新Complier的全部威力,最明显的就是Generics。在Tiburon的RTL中使用新特性最多的除了Unicode就是 reference to procedure;.
下面再看下Delphi2009在语言方面的增强
下面再看下Delphi2009在语言方面的增强
-
reference to procedure / function 这个新特性严格说来算是个语法糖,核心层面仍旧是函数指针地址,这也是在Tubron中并没有实现Multi reference的原因,不过,按照这个方向,我们应该会在后面版本中多播引用的实现。总之,这是个好特性,向流行的Closure迈了一大步 :)
-
新的Generics语法,如:var dictionary: TDictionary<String, Integer>
Generics对于现代开发太重要了,毕竟所有的地方我们都离不开容器,而缺乏Generics的容器就如同电视缺了遥控的一样。编译器的支持是最重要的,我们有理由相信Tuburon发布后的Delphi社区的力量有能力实做出媲美stl的Generics库。 -
for in loop,Tubron从很多方面增强了for in loop,在Delphi2005引入for in到之前的Delphi版本, for in loop 的支持其实都是有限的,开发者实作for in loop 也很繁琐,让人欣慰的是这次Tiburon中的 for in 的支持是更加宽泛,开发者对for in loop的实现也变得更加容易,在System单元中引入了IEnumerator,IEnumerable,这表明如果我们看到Delphi类库中实现了IEnumerable的都可以使用for in loop.
System中还多了IEquatable,IComparable等接口,这方面看来也是学习了Java中的一些设计理念,很不错 :)
多线程 MultiThread:
无可阻挡的,我们已经进入了多核的时代,毫无疑问,多核为我们开发人员带来了新的挑战,流行的说法就是挑战与机遇并存。Java在线程方面有天然的优势,它自诞生以来就是冲着多线程来的,即将到来的Java7还会为我们带来一套并行计算体系,记得叫Fork/Join Framework。还好Tiburon在这方面并没有停步不前,在线程开发方面也进行了不小的改进,TThread中增加了获取当前线程对象的静态类方法GetCurrentThread(),个人感觉这点直接就是学自Java(也许是.NET,我不懂.NET,所以不好说),同时增加了TThreadProcedure这个reference to procedure,这使得我们在开发多线程应用的时候更加的便利。再就是在System单元中增加的TMonitor类,千万不要小看这个TMonitor,可以预见,在Tiburon发布后的日子里,这会是开发人员经常使用到的功能类。再有就是SyncObjs单元中增加了TSemaphore,这个以前Allen Bauer在他的blog提到过的,本来计划在下一版的Delphi才放出,不过看来这次放在Tubron中发布了:)
可以预想,今后我们的Delphi程序里面大概会多出诸如
System.TMonitor.Enter(<obj>);
//...
System.TMonitor.Exit(<obj>);
这样的代码。这类似于Java中的
Synchronized(lock) {
//...
}
基本上,这等同于Windows的临界区的作用(critical section),这是Tiburon引入的新的线程同步机制,使用TMonitor就可以告别跟Windows API紧密耦合的锁控制同步的代码了,恩,所以我们有理由期待Delphi for Linux :)
顺便八卦下,Delphi2009并行计算这部分的设计和实现都是Allen Bauer亲自操刀的。
最后再看下Compiler的改进。
顺便八卦下,Delphi2009并行计算这部分的设计和实现都是Allen Bauer亲自操刀的。
最后再看下Compiler的改进。
指针算数运算 PointerMath:
对于Compiler中最大改进的就是Generics,这个之前已经提过了,还有一个就是Pointer Math了,这个有C开发经验和开发中使用指针的同学的都会有体会,那就是没有算数支持的指针支持是瘸腿的,有了Generic,有了算数指针,Delphi在低阶开发支持上面基本就可以和C/CPP打个平手了。可以参考下面的代码看看算数指针能给我们带来什么 :)
{$POINTERMATH ON}
procedure MoveRects(Rects: PRect; Count: Integer);
begin
while Count > 0 do
begin
MoveRect(Rects[Count - 1]);
MoveRect((Rects + Count - 1)^);
Dec(Count);
end;
end;
{$POINTERMATH ON}
procedure MoveRects(Rects: PRect; Count: Integer);
begin
while Count > 0 do
begin
MoveRect(Rects[Count - 1]);
MoveRect((Rects + Count - 1)^);
Dec(Count);
end;
end;
反射 Reflection:
很遗憾,Tiburon没有为我们带来完整的反射API,但是,这里面有个玄机,估计应该来自DataSnap架构师的steve的需求吧,就是现在有一个叫$METHODINFO的编译指令,steve就是通过这个编译开关选项来得到完整的Class Metadata的来完成远程对象方法调用的,熟悉Java的同学应该想到,没错,这个就是反射!不过这个反射在我个人看来只是给DataSnap的后门而已现在并没有RTL出现完整的Reflection API的,估计是开发时间原因吧,也许我们应该会在下一版本的Delphi中见到正式的Reflection支持。
总之,Delphi2009带来的新东西确实不少,我个人认为Delphi2007是自Delphi7以来第一个可用版本,而Delphi2009将是自Delphi7以来真正有实质进步的版本,应该会成为最好的一个Delphi版本,还是很值得期待的。:)