基于个人的使用经验,我从语言、框架、 开发环境和运行环境四个方面对 Flex 和 Silverlight 这两门技术做一个比较,自己认为这个比较还是比较全面的。(这样的比较有意义吗?个人意见,只要别 把自己当成宗教教徒,将语言看作工具而不是信仰,那么比较就是有意义的。)
语言( Silverlight 以 C# 为准) | |||
特性 | 比较 | 胜出 | |
Flex | Silverlight | ||
语法 | Flex 的编程语言 ActionScript 在变量与属性声明 的方面语法有一点罗嗦(有些类似 VB ): public var varName : int; 相比之下 C# 就要简洁一些: public int varName; 不过, ActionScript 支持以字面量的方式声明字典,这方面又比 C# 的 Dictionary 来得简明: public var dict = { x: 1, y: 2 }; |
| √ |
语言特性 | ActionScript 支持动态类属性,这 是 C# 目前所不支 持的,因此在动态编程方面, Flex 要简洁得多,也减少了很多代码生成的工作。 | √ |
|
OO 特性 | ActionScript 不支持抽象类和抽象 方法。虽然对一般性的编程来说没有太大问题,但是对框架设计来说这是一个严重的缺点。 |
| √ |
反射 | 反射对于元编程是相当重要的。 Flex 的反射机制比较原始,只支持有限的反射方法,并且代码中没有明确引用的类在编译阶段会被排除,这使 得动态创建类更为麻烦。 不过得益于语言的动态特性, Flex 反射代码比同等的 C# 代码要更加简明。 Silverlight 也排除了一些高级反 射特性(比如 TypeDescriptor 相关的一些方法),不过总体来说反射机制还是比较完整的,但同时反射的语法比较罗嗦。 |
| √ |
基本类库 | Flex 的基本类库相当精简,精简的代价就是 有些基本功能(如字符串的 trim 、日期的格式化)都欠奉,不得不求助于工具类库。 Flex 的集合类库功能也有一些薄弱。 Silverlight 类库也比完整的 .Net 类库精简了许多,有些时候如操作 Xml 的时候不大顺手。不过大体上来说还是够用的。 |
| √ |
扩充特性 | E4X 是 Flex 的独有特性,在 Flex 中使用 XML 简单到了让 Linq to XML 也相形见绌的地步。 Silverlight 胜于 Flex 之处包括: Linq to object 、 lambda 表达式和显式多线程,这些都是 Flex 所不支持的。 |
| √ |
语言支持 | Flex 只支持 ActionScript , Silverlight 则支持 C# 、 VB 、 IronPython 、 IronRuby 、 JScript 等多种语言。但不论 Visual Studio 还是 Expression Blend 都没有为 脚本语言创建项目提供任何支持,这使得 Silverlight 的多语言优势打了一个很大的折扣 |
| √ |
总的来说,语言方面是 Silverlight 大胜 Flex 。
框架 | |||
特性 | 比较 | 胜出 | |
Flex | Silverlight | ||
界面组件 | 经过几年发展, Flex 的界面组件已经比较完整。基本框架中包括超过 50 个界面组件,远远超过 Silverlight 的组件数量。但是 Flex 里也缺少如 AutoComplete 等少数重要组件。 Silverlight 本身就组件数量和功 能方面远逊于 Flex ,不过添加 Silverlight Toolkit 以后可以在一定程度上弥补其不足。 | √ |
|
布局 | Flex 的布局机制简单且灵活。 Canvas 支持多种对齐和摆放方式,灵活 性远远超过 Silverlight Canvas ,是布局中最常使用的组件。 Canvas 、 HBox 和 VBox 三个组件基本上可以包揽 90% 上界面布局的工作。 此外, Flex 中还有一些布局组件如 Panel 、 Form 和 ViewStack 是 Silverlight 所缺乏的。 Flex 还支持基于辅助线的布局, Silverlight 里面没有这样的功能。 Silverlight 的布局组件不仅数量 少,基于附加属性的语法也比较冗长拖沓。 | √ |
|
样式 | Flex 的样式语法基于 CSS ,非常简洁,且对于熟悉 HTML 的用户来说马上可以上手。 Silverlight 的样式声明语法相当繁琐。比较一下 Flex/Silverlight 的样式设置: Flex: Button { margin: 10; } <mx:Button />
Silverlight: <Style x:Key=”component” TargetType=”Button”> <Setter Property=”Margin” Value=”10” /> </Style> <Button Style=”{StaticResource component}” /> 可以看到,相比 Flex 所用的 CSS 语法来说, Silverlight 中超过一半以上的代码 是纯粹的语法噪音,只是为了方便解析器而设计的,对设计者来说完全是不必要的额外负担。此外, Silverlight 并不直接支持类似 Flex 的全局样式。虽然 StyleManager 可以达到类似的效果,但语法更加罗嗦,会使得 XAML 更加冗长。 | √ |
|
动画 | Flex 有多达 10 多种动画。 Silverlight 基于依赖属性的动画只 相当于 Flex 的 AnimationProperty ,数量 和功能都比较受限,并且只对于 Dependency Property 有效。 | √ |
|
数据绑定 | Flex 的数据绑定语法直观且简洁,可以使用 几乎任意的表达式。声明绑定属性的语法也相当简单,任何属性只要加上一个 [Bindable] 标签即可。 Silverlight 的数据绑定语法相当累 赘,至少造成了两个严重后果: 1 、大量数据绑定属性是造成 XAML 冗长难读的罪魁祸首; 2 、依赖属性编写很麻烦,需要大量样本代码,而许多框架特性又严重依赖于依赖属性,使得编写 Silverlight 组件成为相当累人的 工作。 | √ |
|
通信机制 | Flex 和 Silverlight 都支持大量标准化的通 信机制,包括 XML 、 Web Service 和二进制数据等,支 持程度也大致在同一水平上。 Flex 略微胜过 Silverlight 的地方在于 Flex 有一个标准化的二进制通讯标准: AMF ,基于 AMF 的服务框架不论开源或商业的目前都有广泛的应用。 Silverlight 在这方面还是一片空 白。 | √ |
|
异常处理 | Flex 的一个问题是不支持全局异常处理,对 框架设计而言这是明显的缺憾。 Silverlight 支持应用程序级别的全局异常处理。不过这个异常处理似乎也不是非常完整,有个别异常还是会漏网,造 成 Silverlight 插件出错。 |
| √ |
国际化 | Flex 对国际化的支持比较完整,使用上也很 方便。唯一的小问题是支持额外的语言需要要执行一次 copylocale 命令行。 Silverlight 对国际化的支持是有问 题的,虽然可以使用,但要做很多手工工作,并且需要一些 work around 才能成功执行。 |
|
|
其他特性 | Flex 包括一个非常方便的界面特性: State ,在界面有少量变化的时候使用非 常方便,可以避免很多不必要的编码。这是 Silverlight 所欠缺的。 Silverlight 的 DeepZoom 是 Flex 所没有的功能。 | √ |
|
外观 | 外观是否好看应该说是个见仁见智的问题。不过 Flex 似乎在细节方面做得更好,请看 Flex/Silverlight 默认按钮外观的比较:
Flex 组件默认情况下就有一个相当合适的边距,看起来很舒服,基本上不用再作什么调整。 Silverlight 就差多了,密密麻麻 的挤在一起,显得非常局促,必须在样式上作很多调整才会比较好看。在这些细节上 Silverlight 明显不如 Flex 。 |
|
|
框架方面 Flex 可以说是大优势战胜 Silverlight 。
IDE | |||
特性 | 比较 | 胜出 | |
Flex | Silverlight | ||
可视化设计器 | 具有讽刺意味的是,号称 Visual 的微软开发环境在 WPF 时代就再也难以自称 Visual 了。 Visual Studio 中的 Silverlight 可视化设计器目前只能说是一个废品,拖拉不能用,属性设置不能用,预览也不能用,并且常常假死,微 软自己都似乎不好意思把它显示出来了。 Expression Blend 说实话也并不好用,不过它编辑 XAML 时的性能倒是比 Visual Studio 好多了,至少不会出现经常假死的情况。 Flex Builder 编辑器经过几年发展,在可视化设计上已经达到不错的水准,使用也相当方便。不足之处在于不能同时打开 太多页面,不然内存的耗用会相当惊人。 | √ |
|
代码编辑 | 在代码编辑的方面则是 Visual Studio 要比 Flex Builder 表现更好。对于代码辅助和编辑提示方面, Visual Studio 比 Flex Builder 表现更加成熟。 不过 Flex Builder 也有 Visual Studio 所不及之 处: 1 、类导航的 功能更加丰富,使用快捷键比 Visual Studio 中更迅捷; 2 、无论设计还是代码视图都支持文档大纲,浏览和跳转更加方便; 3 、指定文件编码也要比 Visual Studio 要容易。 |
| √ |
代码隐藏 | 由于 Flex Builder 并不直接支持 Code Behind 模型,因此在界面和对应代码的管理上要比 Visual Studio 麻烦一些。 |
| √ |
编辑器性能 | 对于可视化编辑器而言, Flex Builder 的性能要比 Visual Studio 好得多。对代 码编辑器而言 Visual Studio 和 Flex Builder 表现差不多,但 Flex Builder 占用内存比较厉害。 | √ |
|
编译器性能 | Flex 编译性能一直都是一个饱受诟病的重大 问题。在项目大到一定程度,编译效率就开始急剧下降,编译一次需要三四十秒是常有的事。(据说有人编译一次甚至需要 20 分钟以上,不过我还没有遇到) Flex 编译慢是有原因的,因为编译器替程序员完成了相当多的工作。如果你打开 -keep=true 编译开关,检查一下生成 的代码,就知道编译器的工作有多繁重了。如果愿意放弃一些可视化特性,手工编写 ActionScript 组件而避免使用 MXML 组件,就可以在很大程度上提高编译效率。 从长远角度来说,我认同 Flex 这种设计思路,用机器效率来换取程 序员效率是值得的( Unix 格言:宁用计算机一分,不花程序员一秒。)但对于眼下的机器性能来说, Flex 编译性能还是一个无法忽略的问题,编译速度太慢会拖慢迭代开发的节奏,对程序员的心理也不能不说是 一种折磨。 Silverlight 编译效率还是不错的,代价就是冗长的程序代码需要程序员自求多福了,编译器的工作实际上是很轻松 的。 |
| √ |
调试 | 在开发环境的支持下, Flex 和 Silverlight 的调试都比较方便。 Flex 的一个小问题是开发人员需要单独安装一个 Debug 版本的 Flash Player , Silverlight 则不用,所以 Silverlight 更加方便一些。 Silverlight 缺少 Flex Builder 内置的 Profiler ,没有简单的方法进行性能 测试。传统的 .Net 性能测试工具基本上都不支持 Silverlight | √ |
|
开放性 | 基于 Eclipse 的 Flex Builder 开放性明显要优于封闭的 Visual Studio ,有大量免费的 Eclipse 插件可以直接拿来使用。不过有 少量插件会与 Flex Builder 产生冲突。如果没有大量的 Java 开发工作,那么安装 Flex Builder 完整版要比插件版更加稳妥并且简单。 Visual Studio 的插件数量不多,配合 Silverlight Tools 使用的目前基本上还没有看到。 | √ |
|
IDE 方面 Flex 和 Silverlight 各擅胜场。
环境 | |||
特性 | 比较 | 胜出 | |
Flex | Silverlight | ||
插件大小 | 目前 Flash 插件安装包大小为 1.8M 左右,这么小的体积包含了完整的插件功能可以说是一个了不起的成就。但 Air 的安装包就有点大到离谱了(约 15M ),这是因为 Air 还附带了一个内嵌的 HTML 解析引擎 WebKit 。 Silverlight 插件安装包大小为 4M 出头,比 Flash 大了一倍还多。我比较不理解的一点是既然体积已经这么大了,为什么不干脆把 DockPanel 、 TreeView 和 DatePicker 这些重要的组件加进 去,反倒是 MultiScaleImage 这样未必有多常用的东西成了核心组件?让大量插件用户去另外下载 System.Windows.Controls.dll 实在是个不小的负担。 | √ |
|
安装 | Flash 的插件基本上可以做到全自动安装升 级,不必用户手工参与。这也很容易理解为什么 Flash Player 能够成为占据全球 95% 以上电脑的装机量最大的软件。 Silverlight 插件要麻烦一些,必须用户手工执行安装步骤,这势必影响 Silverlight 插件的普及。当然微软 也可以使用诸如捆绑安装之类的市场手段,这就不再属于技术讨论的范畴了。 | √ |
|
运行性能 | 我没有作过这方面的测试,就使用感觉来说还没有发现明显差别。不过我看到外国已经有这方面的测试,结 果认为 Flex 在 画面渲染效率上优于 Silverlight ,而 Silverlight 则在数学计算上效率高过 Flex 。考虑到 Adobe/Macromedia 就是以图形起家的,而微软在编译器上已经深耕多年,这个结果应该不会让人感到惊讶。由于浏览器插件 的主要功能还是提供显示,用于大量数学计算的场景并不多见,看起来 Flex 还是占有一定优势。 | √ |
|
环 境方面 Flex 仍 然占有优势。
最后再说一些比较琐碎的话题,因为不太好分类,并 且主观意味比较浓厚,就不再详细比较,当作姑妄言之好了。
Flex 和 Silverlight 目前来看都是存在一些 问题的。有些属于语言设计的范畴,比如 ActionScript 的声明语法比较罗嗦,而 Silverlight 则是绑定属性的语法特别累赘,但这些问题受系统设计限制,基本上已经没有修改的余地了(除非整个框 架推倒重来)。另外一些问题是比较严重但是有望解决的, Flex 方面是大项目中的编译速度让人抓狂,不过在 Flex Builder 4 beta 中似乎已经看到了改善的迹象。 Silverlight 则是框架还不够完 整,界面组件有限。 Silverlight 3 已经比 Silverlight 2 有所提高,加上 Silverlight Toolkit 一类扩展可以得到很大改进。 Silverlight 的另一严重问题是 IDE 工具完全没有达到应有的水平, Visual Stuido 插件可用性非常 差,此问题从 Silveright 2 到 3 以后反而有恶化的趋势, VS2010 似乎又是个极其吃机器的怪兽,这个问题短期内能否解决,实在让人无法乐观。
如果从程序员的观点来看, Silverlight 的语言特性要比 Flex 更佳: .Net 框架结构上更加完备、多种开发语言支 持、 Linq 和客 户端多线程,这些都是 Flex 所欠缺的特性,应该为 Silverlight 额外加分。可惜受到开发工具和应用范围的限制,这些优势目前并没有充分发挥出来。此外,从从业人员的 现状来看, Flex 语 法更加简单、容易上手,对非程序员颇具吸引力,而 C# 对这些人来说门槛实在有点过高。所以这些特性是好是坏,眼下也不太好作出结论。
从社区来说, Flex 目前已经拥有相当数量的用户和开发社 群,其独有的特点是来自设计者和程序员两个背景完全不同的群体,因此意见和风格常常参差不齐,好处是能够看到不同观点的碰撞,比较有活力。 Silverlight 社区规模还比较小, 基本上全部来自微软开发者阵营,背景相当一致,对程序设计通常能够有很好的观点,缺点是对 UI 设计师的团体和理念缺乏了解,解决思路大多是以程序员为本位的。另外一个似乎不利于 Silverlight 的现状是: Java/ 开源阵营基本上不会考虑使用 Silverlight ,反或来说,以微软 技术为平台的开发者倒是还有相当一部分会采用 Flex (从博客园的话题分类也可以看得出来)。
Flex 和 Silverlight 未来的趋势如何?看一看这两个技术近几年的发展趋势, Flex 仍然具有领先优势,但该优势目前已经 有所缩小:
- Flex 2 和 Silverlight 1 没有什么好比较 的, Sliverlight 1 功能实在太过贫弱,这时 Flex 遥遥领先;
- Flex3 和 Silveright 2 相比, Silverlight 在框架结构上比版本 1 已经有改天换地的提高,拉近了和 Flex 的距离,但可用组件仍然严重不足;
- Silveright 3 在结构上没有什么 重大改变,主要在于功能的完善。如果说 Flex 2 比 Silverlight 1 领先整整一步的话,那么到 Siliverght 3 ,这个差距已经缩小到半步, Silverlight 在部分特性上甚至超越 了 Flex 。
目前, Silveright 3 刚刚出现,各方面的 支持仍然有待跟进, Silverlight 4 眼下还看不到什么消息。而 Adobe 已经开始准备 Flex 4 ,目前释出了第一个 beta 版本,从已经知道的情况分析,这个版本在框架上将会有相当重大的修改,明显意图再度拉大与 Silverlight 的差距,在许多方面 都设计得更加灵活。但兼容性究竟如何、能否允许从前的用户平稳过渡,将会是 Flex 4 面临的主要问题。
我以前曾经说过,现在仍然这样认为:鉴于微软自身的市场定位,它绝不希望基于 Web 的技术强大到足以让用户忽略浏览器和 操作系统的地步。因此 Silverlight 将来究竟能发展到什么程度,长远来看还是不得不打上一个很大的问号,即使目前来看微软仍然在力推这门 技术。不过已经使用了 Silverlight 的同学也无须太过顾虑,只要是微软推出的技术,不论好或不好,就算是被放弃以后也还能够生存相当一段 时间(看看眼下的 IE6 )。眼下, Flash 在诸如在线视频等市场的领导地位是不争的事实, Silverlight 暂时还没有直接与其对抗的力量,并且它们还都面临着一个共同的对手—— Ajax ,未来还会有 HTML5 来搅局。所以今后一段时间,我们 大概只能看到它们之间发生一些小规模的局部战争。 Flash Player 在浏览器中的覆盖率现在超过 95% ,地位已经极其稳固,有如今日之 Windows ,但同时也意味着基本上再没有上升的空间,只能依势固守。而 Silverlight 则有望以后起之秀的姿 态从 Flash 中 抢走一部分市场份额,然而考虑到其他厂商对微软的警惕心理和 Web 标准领导话语权的力量, Silverlight 恐怕也难以取得非常理想的战绩。作为用户的我们,其实也没有多大必要去在意谁会是最后的赢家(历史 为鉴,最终的赢家最初通常都在人们的视野之外。 Google 勃兴而引导网络时代,当初没有任何人预见到),只要领会时代和技术交锋进步的精彩之处就好了。