集中在Unicode,以及一些新的URL上,我试图从一些不同的角度察看一下Delphi2009都有些什么东西.
IDE:粗看起来Delphi2009的IDE较之Delphi2007并没有什么特别的增强。主要的UI元素也没有大的变化。最显著的变化就是Project Manager和Tool Palette。
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也进行了大量的修改优化以及增订。
个人觉得比较有遗憾的是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能够进行更好的低阶编成的能力。
首先我们看到了Tubron的增强,客观的讲,内部的改进确实还是挺大的,尤其是在CodeGear人手并不是很整齐的情况下,之前觉得遗憾的地方的意思就是说Delphi在外围的变化并没有跟上其内部的改进速度。
可以说Compiler走在了其改进的前面,也就是说CodeGear本身也并没有在Delphi本身上发挥Tubron Complie的全部威力,最明显的就是Generics。在Tubron的RTL中使用新特性最多的除了Unicode就是 reference to procedure;.
下面再看下Delphi2009在语言方面的增强
Language:
1) reference to procedure / function 这个新特性严格说来算是个语法糖,核心层面仍旧是函数指针地址,这也是在Tubron中并没有实现Multi reference的原因,不过,按照这个方向,我们应该会在后面版本中多播引用的实现。总之,这是个好特性,向流行的Closure迈了一大步 :)
2) 新的Generics语法,如:var dictionary: TDictionary<String, Integer>
Generics对于现代开发太重要了,毕竟所有的地方我们都离不开容器,而缺乏Generics的容器就如同电视缺了遥控的一样。编译器的支持是最重要的,我们有理由相信Tuburon发布后的Delphi社区的力量有能力实做出媲美stl的Generics库。
3)for in loop,Tubron从很多方面增强了for in loop,在Delphi2005引入for in到之前的Delphi的Delphi版本。for in 的支持其实都是有限的,这次Turon中的for in 的支持是更加宽泛的,开发者对for in loop的实现也变得更加容易,在System单元中引入了IEnumerator,IEnumerable,这表明如果我们看到Delphi类库中实现了IEnumerable的都可以使用for in loop.
p.s.System中还多了IEquatable,IComparable等接口,这方面看来也是学习了Java中的一些设计理念,很不错 :)
Thread:
Delphi2009在线程方面的也进行了不小的改进。在System单元中多出了一个TMonitor类。SyncObjs单元中增加了TSemaphore,这个以前allen bauer在blog提到过的,本来计划在下一版的Delphi才放出,不过看来这次放在Tubron中发布了:)
TThread中增加了获取当前线程对象的静态类方法,同时增加了TThreadProcedure这个reference to procedure,这使得我们在开发多线程应用的时候更加的便利
刚才上面有朋友说起VCL库,其实我们还是不要轻易说什么是“最好”,当然可以是最喜欢的,如果我们对比下JAVA,VCL的进步真的是太慢了,这很大程度上都是之前Borland公司自己的原因,这次对比RTL中我发现codegear仍旧为今后在linux上的发展留出了空间,不少条件编译指令都作了对应调整,我们有理由等待未来的Delphi for Linux,希望不要再出什么单独的kylix版本了。
我们不妨YY下将来的Delphi:
1)Delphi for Win32
2)Delphi for .NET
3)Delphi for Linux
4)Delphi for Mac
5)Delphi for Mobile
至少想上去还是不错的 不是么 :)
我个人认为Delphi2007是自Delphi7以来第一个可用版本,而Delphi2009将是自Delphi7以来真正有实质进步的版本,的确值得期待。
这是个多核的时代,我的T61FC9就是双核,毫无疑问,多核为我们开发人员带来了新的挑战,流行的说法就是挑战与机遇并存。Java在线程方面有天然的优势,它自诞生以来就是冲着多线程来的,即将到来的Java7还会为我们带来一套并行计算体系,记得叫Fork/Join Framework。还好Tiburon在这方面并没有停步不前,上面的回帖已经提到了线程类增加了获取当前线程的类方法,我个人感觉这点直接就是学自Java。(也许是.NET,我不懂.NET,所以不好说),更好的证据就是那个新增的TMonitor,千万不要小看这个TMonitor,可以预见,在Tiburon发布后的日子里,这会使开发人员经常会打交道的功能类。
大概我们的程序里面也会多出诸如
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的改进。最最大改进的就是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;
最后就是反射Reflection,很遗憾,Tiburon没有为我们带来完整的反射API,但是,这里面有个玄机,就是估计是作DataSnap的steve的需求吧,现在有一个叫
$METHODINFO的变易指令,steve是通过这个编译开关选项来得到完整的class metadata的,熟悉java的同学应该想到,没错,这个就是反射!不过这个目前只是给DataSnap的后门而已现在并没有RTL中有Reflection的,只是估计是时间原因吧,希望我们应该会在下一版本中见到正式的Reflection支持。
最后,Delphi2009真的给我们带来了不少好东西,Delphi2009是个真正值得期待的版本,OK,一起期待吧。 :)