技术角度论Flex与Silverlight优劣

开发 后端
基于个人的使用经验,我从语言、框架、开发环境和运行环境四个方面对Flex和Silverlight这两门技术做一个比较,自己认为这个比较还是比较全面的。

这样的比较有意义吗?个人意见,只要别把自己当成宗教教徒,将语言看作工具而不是信仰,那么比较就是有意义的。 

语言(SilverlightC#为准)

特性

比较

胜出

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的时候不大顺手。不过大体上来说还是够用的。

 

扩充特性

E4XFlex的独有特性,在Flex中使用XML简单到了让Linq to XML也相形见绌的地步。

Silverlight胜于Flex之处包括:Linq to objectlambda表达式和显式多线程,这些都是Flex所不支持的。

 

语言支持

Flex只支持ActionScriptSilverlight则支持C#VBIronPythonIronRubyJScript等多种语言。但不论Visual Studio还是Expression Blend都没有为脚本语言创建项目提供任何支持,这使得Silverlight的多语言优势打了一个很大的折扣

 

总的来说,语言方面是Silverlight大胜Flex

框架

特性

比较

胜出

Flex

Silverlight

界面组件

经过几年发展,Flex的界面组件已经比较完整。基本框架中包括超过50个界面组件,远远超过Silverlight的组件数量。但是Flex里也缺少如AutoComplete等少数重要组件。

Silverlight本身就组件数量和功能方面远逊于Flex,不过添加Silverlight Toolkit以后可以在一定程度上弥补其不足。

 

布局

Flex的布局机制简单且灵活。Canvas支持多种对齐和摆放方式,灵活性远远超过Silverlight Canvas,是布局中最常使用的组件。CanvasHBoxVBox三个组件基本上可以包揽90%上界面布局的工作。

此外,Flex中还有一些布局组件如PanelFormViewStackSilverlight所缺乏的。Flex还支持基于辅助线的布局,Silverlight里面没有这样的功能。

Silverlight的布局组件不仅数量少,基于附加属性的语法也比较冗长拖沓。

 

样式

Flex的样式语法基于CSS,非常简洁,且对于熟悉HTML的用户来说马上可以上手。

Silverlight的样式声明语法相当繁琐。比较一下Flex/Silverlight的样式设置:

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基于依赖属性的动画只相当于FlexAnimationProperty,数量和功能都比较受限,并且只对于Dependency Property有效。

 

数据绑定

Flex的数据绑定语法直观且简洁,可以使用几乎任意的表达式。声明绑定属性的语法也相当简单,任何属性只要加上一个[Bindable]标签即可。

Silverlight的数据绑定语法相当累赘,至少造成了两个严重后果:1、大量数据绑定属性是造成XAML冗长难读的罪魁祸首;2、依赖属性编写很麻烦,需要大量样本代码,而许多框架特性又严重依赖于依赖属性,使得编写Silverlight组件成为相当累人的工作。

 

通信机制

FlexSilverlight都支持大量标准化的通信机制,包括XMLWeb Service和二进制数据等,支持程度也大致在同一水平上。

Flex略微胜过Silverlight的地方在于Flex有一个标准化的二进制通讯标准:AMF,基于AMF的服务框架不论开源或商业的目前都有广泛的应用。Silverlight在这方面还是一片空白。

 

异常处理

Flex的一个问题是不支持全局异常处理,对框架设计而言这是明显的缺憾。

Silverlight支持应用程序级别的全局异常处理。不过这个异常处理似乎也不是非常完整,有个别异常还是会漏网,造成Silverlight插件出错。

 

国际化

Flex对国际化的支持比较完整,使用上也很方便。唯一的小问题是支持额外的语言需要要执行一次copylocale命令行。

Silverlight对国际化的支持是有问题的,虽然可以使用,但要做很多手工工作,并且需要一些work around才能成功执行。

 

 

其他特性

Flex包括一个非常方便的界面特性:State,在界面有少量变化的时候使用非常方便,可以避免很多不必要的编码。这是Silverlight所欠缺的。

SilverlightDeepZoomFlex所没有的功能。

 

外观

外观是否好看应该说是个见仁见智的问题。不过Flex似乎在细节方面做得更好,请看Flex/Silverlight默认按钮外观的比较:

<!--[if !vml]-->
<!--[endif]-->

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 StudioFlex Builder表现更加成熟。

不过Flex Builder也有Visual Studio所不及之处:1、类导航的功能更加丰富,使用快捷键比Visual Studio中更迅捷;2、无论设计还是代码视图都支持文档大纲,浏览和跳转更加方便;3、指定文件编码也要比Visual Studio要容易。

 

代码隐藏

由于Flex Builder并不直接支持Code Behind模型,因此在界面和对应代码的管理上要比Visual Studio麻烦一些。

 

编辑器性能

对于可视化编辑器而言,Flex Builder的性能要比Visual Studio好得多。对代码编辑器而言Visual StudioFlex Builder表现差不多,但Flex Builder占用内存比较厉害。

 

编译器性能

Flex编译性能一直都是一个饱受诟病的重大问题。在项目大到一定程度,编译效率就开始急剧下降,编译一次需要三四十秒是常有的事。(据说有人编译一次甚至需要20分钟以上,不过我还没有遇到)

Flex编译慢是有原因的,因为编译器替程序员完成了相当多的工作。如果你打开-keep=true编译开关,检查一下生成的代码,就知道编译器的工作有多繁重了。如果愿意放弃一些可视化特性,手工编写ActionScript组件而避免使用MXML组件,就可以在很大程度上提高编译效率。

从长远角度来说,我认同Flex这种设计思路,用机器效率来换取程序员效率是值得的(Unix格言:宁用计算机一分,不花程序员一秒。)但对于眼下的机器性能来说,Flex编译性能还是一个无法忽略的问题,编译速度太慢会拖慢迭代开发的节奏,对程序员的心理也不能不说是一种折磨。

Silverlight编译效率还是不错的,代价就是冗长的程序代码需要程序员自求多福了,编译器的工作实际上是很轻松的。

 

调试

在开发环境的支持下,FlexSilverlight的调试都比较方便。Flex的一个小问题是开发人员需要单独安装一个Debug版本的Flash PlayerSilverlight则不用,所以Silverlight更加方便一些。

Silverlight缺少Flex Builder内置的Profiler,没有简单的方法进行性能测试。传统的.Net性能测试工具基本上都不支持Silverlight

 

开放性

基于EclipseFlex Builder开放性明显要优于封闭的Visual Studio,有大量免费的Eclipse插件可以直接拿来使用。不过有少量插件会与Flex Builder产生冲突。如果没有大量的Java开发工作,那么安装Flex Builder完整版要比插件版更加稳妥并且简单。

Visual Studio的插件数量不多,配合Silverlight Tools使用的目前基本上还没有看到。

 

IDE方面FlexSilverlight各擅胜场。

环境

特性

比较

胜出

Flex

Silverlight

插件大小

目前Flash插件安装包大小为1.8M左右,这么小的体积包含了完整的插件功能可以说是一个了不起的成就。但Air的安装包就有点大到离谱了(约15M),这是因为Air还附带了一个内嵌的HTML解析引擎WebKit

Silverlight插件安装包大小为4M出头,比Flash大了一倍还多。我比较不理解的一点是既然体积已经这么大了,为什么不干脆把DockPanelTreeViewDatePicker这些重要的组件加进去,反倒是MultiScaleImage这样未必有多常用的东西成了核心组件?让大量插件用户去另外下载System.Windows.Controls.dll实在是个不小的负担。

 

安装

Flash的插件基本上可以做到全自动安装升级,不必用户手工参与。这也很容易理解为什么Flash Player能够成为占据全球95%以上电脑的装机量最大的软件。

Silverlight插件要麻烦一些,必须用户手工执行安装步骤,这势必影响Silverlight插件的普及。当然微软也可以使用诸如捆绑安装之类的市场手段,这就不再属于技术讨论的范畴了。

 

运行性能

我没有作过这方面的测试,就使用感觉来说还没有发现明显差别。不过我看到外国已经有这方面的测试,结果认为Flex在画面渲染效率上优于Silverlight,而Silverlight则在数学计算上效率高过Flex。考虑到Adobe/Macromedia就是以图形起家的,而微软在编译器上已经深耕多年,这个结果应该不会让人感到惊讶。由于浏览器插件的主要功能还是提供显示,用于大量数学计算的场景并不多见,看起来Flex还是占有一定优势。

 

环境方面Flex仍然占有优势。

最后再说一些比较琐碎的话题,因为不太好分类,并且主观意味比较浓厚,就不再详细比较,当作姑妄言之好了。

FlexSilverlight目前来看都是存在一些问题的。有些属于语言设计的范畴,比如ActionScript的声明语法比较罗嗦,而Silverlight则是绑定属性的语法特别累赘,但这些问题受系统设计限制,基本上已经没有修改的余地了(除非整个框架推倒重来)。另外一些问题是比较严重但是有望解决的,Flex方面是大项目中的编译速度让人抓狂,不过在Flex Builder 4 beta中似乎已经看到了改善的迹象。Silverlight则是框架还不够完整,界面组件有限。Silverlight 3已经比Silverlight 2有所提高,加上Silverlight Toolkit一类扩展可以得到很大改进。Silverlight的另一严重问题是IDE工具完全没有达到应有的水平,Visual Stuido插件可用性非常差,此问题从Silveright 23以后反而有恶化的趋势,VS2010似乎又是个极其吃机器的怪兽,这个问题短期内能否解决,实在让人无法乐观。

如果从程序员的观点来看,Silverlight的语言特性要比Flex更佳:.Net框架结构上更加完备、多种开发语言支持、Linq和客户端多线程,这些都是Flex所欠缺的特性,应该为Silverlight额外加分。可惜受到开发工具和应用范围的限制,这些优势目前并没有充分发挥出来。此外,从从业人员的现状来看,Flex语法更加简单、容易上手,对非程序员颇具吸引力,而C#对这些人来说门槛实在有点过高。所以这些特性是好是坏,眼下也不太好作出结论。

从社区来说,Flex目前已经拥有相当数量的用户和开发社群,其独有的特点是来自设计者和程序员两个背景完全不同的群体,因此意见和风格常常参差不齐,好处是能够看到不同观点的碰撞,比较有活力。Silverlight社区规模还比较小,基本上全部来自微软开发者阵营,背景相当一致,对程序设计通常能够有很好的观点,缺点是对UI设计师的团体和理念缺乏了解,解决思路大多是以程序员为本位的。另外一个似乎不利于Silverlight的现状是:Java/开源阵营基本上不会考虑使用Silverlight,反或来说,以微软技术为平台的开发者倒是还有相当一部分会采用Flex(从博客园的话题分类也可以看得出来)。

FlexSilverlight未来的趋势如何?看一看这两个技术近几年的发展趋势,Flex仍然具有领先优势,但该优势目前已经有所缩小:

  • <!--[if !supportLists]--> <!--[endif]-->Flex 2Silverlight 1没有什么好比较的,Sliverlight 1功能实在太过贫弱,这时Flex遥遥领先;
  • <!--[if !supportLists]--> <!--[endif]-->Flex3Silveright 2相比,Silverlight在框架结构上比版本1已经有改天换地的提高,拉近了和Flex的距离,但可用组件仍然严重不足;
  • <!--[if !supportLists]--> <!--[endif]-->Silveright 3在结构上没有什么重大改变,主要在于功能的完善。如果说Flex 2Silverlight 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勃兴而引导网络时代,当初没有任何人预见到),只要领会时代和技术交锋进步的精彩之处就好了。

本文来自Shuhari博客园文章《Flex/Silverlight的技术比较

【编辑推荐】

  1. Office 2010将使用Silverlight改善用户体验
  2. 微软.NET平台主管谈Silverlight企业级开发
  3. Flash与Silverlight多领域实测对比
  4. 微软宣称Silverlight装机量超过三亿
  5. 图解Silverlight 3的7个新功能
责任编辑:彭凡 来源: 博客园
相关推荐

2010-08-09 13:25:02

FlexSilverlight

2009-06-16 15:25:17

SilverlightJavaFXFlex

2009-06-23 13:55:20

JavaFXRIA

2010-08-11 10:10:17

JavaFXFlexSilverlight

2009-04-01 13:26:08

JavaFXFlexSilverlight

2010-07-29 09:25:14

SilverLightAJAXJavaFX

2009-08-02 17:58:15

2010-07-29 09:18:25

JavaFXFlexSilverlight

2019-02-11 08:48:07

XMLJSON前端

2018-09-21 08:50:15

2010-08-09 09:09:43

Flex技术

2010-07-27 15:36:15

Flex swf

2010-08-11 10:59:50

SilverlightFlex4

2010-07-29 14:13:12

Flex控件拖动

2010-08-11 13:01:09

Flex.NETSocket

2010-08-09 15:41:13

Flex字体

2010-07-30 15:35:11

Flex结合

2015-03-23 09:33:28

综合布线光缆

2010-07-20 16:16:21

SDH

2010-08-09 09:41:02

Flex3
点赞
收藏

51CTO技术栈公众号