Hello World
Spiga

分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发

2011-01-13 23:35 by 老赵, 5204 visits

在许多年前,“语言”就等同于“平台”,例如C,C++以及最早的Ruby和Python等等。但是随着技术发展,出现了一些通用的平台,例如.NET和Java,逐渐这些平台上的语言也越来越多。再后来,某些语言在不同平台上的实现也越来越多,事情也变得有些复杂。技术在发展,但是从目前社区的讨论中,我发现许多朋友的观念还没有跟上。简单地说,如今的观念,一定要从“语言即平台”切换成“语言及平台”,当分清“语言”和“平台”这两个不同事物之后,许多问题才能讨论地清楚。

例如我写过一个太监系列《Why Java Sucks and C# Rocks》,其中谈的是C#和Java两个“语言”而不是两者的“平台”。编程“语言”其实是一种“规范”,它涉及了程序员在使用这门语言时的文本表现形式(这里暂不考虑其他形式的语言),而“平台”则包括对这个规范的“实现”(广义的“平台”还包括整个生态环境等等)。C#和Java分别处在各自的平台上,但许多语言其实是跨多种平台的。例如Python,Ruby,Scala,Clojure,JavaScript等等,数不胜数。同样,一个平台上也会出现多种语言。而且事实上,由于.NET和Java这样的平台越来越成熟,语言的设计及实现者也都越来越倾向于让语言运行在“某个平台”上。这么做可以尽可能地利用前人的成果,而不是什么都要自己从头做起。

其实基本的原则就是这么简单,但是真正在考虑问题的时候,可能就不是那么容易了,我们必须时刻保持清晰地头脑。

例如有个人说“C#比Java执行效率高(或低)”,这个说法是否正确?其实这种说法有很大问题。因为我们知道,在这里C#和Java都是“语言”,它们的执行环境CLI及JVM一样都是“规范”,但“执行效率”是一种表现,这和“实现”得如何有很大关系。例如,C#是运行在.NET平台还是Mono上(它们都是CLI规范的具体实现),Java是运行在JRockit还是Hotspot(前者是Oracle的JVM商业实现,后者是Sun的开源实现——当然现在也是Oracle的),亦或是Android的Dalvik上?很显然,不同实现之间的表现会有区别,不可一概而论,否则也不会出现JavaScript引擎的效率之争了。同理,有些人使用Hotspot上的Java性能来说明Java在Android上运行时的表现,这也是不对的——要知道Google在和Oracle的Java专利官司中不断强调Dalvik不是“Oracle那种Java”。作为结论,Java在Android上的表现的确不错,但论证方式也必须正确才行。

当然,有时候“规范”也会影响到“实现”,例如一个动态分发的语言,其性能基本百分百不如在编译期绑定的静态语言。所以事情原本就是这么复杂,做一个思路清晰的程序员并不是件容易的事情。顺便一提,女人在这方面的头脑一般都比较清楚,她们一般都知道骑白马的不一定是王子,也有可能是唐僧。

对于俗称“.NET程序员”的那一批人来说,分清“语言”和“平台”更是一件十分重要的事情,因为C#语言可以说是目前“平台”、“实现”最为广泛的“语言”之一了。之前我为InfoQ写过一篇文章,其中提到Mono的创始人Miguel de Icaza给出的目前C#语言可执行平台的“不完全”列表,几乎覆盖了各种流行的操作系统及设备等等,例如:

  • Windows
  • Mac OS
  • Linux / BSD / Solaris
  • Windows Phone,Android,iOS
  • XBox 360,Wii,PS3
  • ……

因此就拿C#这一种语言来说,“实现”也会各自略有不同,这便是所谓的“配置(Profile)”。目前至少已经有这么多配置了:

  • .NET 4.0配置
  • Silverlight配置
  • Windows Phone 7配置
  • XBox360配置
  • Mono核心配置:与.NET配置相同,可以在Linux,MacOS X,Solaris,Windows和BSD里使用。
  • .NET Micro Framework
  • Mono的iOS配置
  • Mono的Android配置
  • Mono的PS3配置
  • Mono的Wii配置
  • Moonlight配置(与Silverlight兼容)
  • Moonlight扩展配置(Silverlight和完整的.NET 4 API)

“配置”之间的区别主要体现在执行环境的能力(例如iOS不支持运行时代码生成,因此支持AOT但不能JIT)以及类库的覆盖面上(例如XNA类库只存在于Windows Phone及XBox 360等游戏平台),不过它们终究实现了一个核心规范,因此我们可以说在不同平台上都可以“使用.NET进行开发”。

Mono实在是一个了不得的作品,它让我知道了“跨平台原来可以这么做”。之前我也写过有关跨平台的问题,其中谈到在“客户端的跨平台一般都很难得到最佳的体验”,这个论点的最佳证明便是Java。但Mono走的却是另一条跨平台的道路,它在各平台上实现了核心的执行引擎和类库之外,解决“体验”的方式便是在各个平台上提供原生平台的绑定。这样无论是在Mac OS,iOS,Android上都可以得到原生应用的体验。

我很奇怪为什么有些搞.NET的人一边说.NET的适用面太小,一边却忽视Mono的成果,在我看来这完全是“自作孽不可活”,我愈发觉得是否接受Mono是判断一个.NET程序员是否优秀的重要准则。其实Mono实在很火,因为他为广大.NET程序员扩展了工作领域,使用现有的知识来开发iOS等平台的应用程序,还可以共享代码,何乐而不为?前不久苹果发布了Mac上的App Store,于是MonoMac也立即推出了面向AppStore的打包器Frank Krueger也开始着手移植它的作品iCircuit成果显著。因此在我看来,这才是一个现代.NET程序员该有的工作台:

对于MonoTouch这样的新思路,带有疑惑是正常的。我也知道还有许多聪明人可以找到各种反对的理由。不管怎样,我现在这里随意列上几条吧:

  • 有人说,用MonoTouch等.NET实现来做iOS开发“不正式”;我说,这个说法颇有“血统论”的意味,不过既然在Windows上用C++和Delphi都很正式,那么为什么在iOS上使用Objective-C才是正途?
  • 有人说,MonoTouch性能一定不如Objective-C好;我说,这是猜测,即使性能不如Objective-C,看看各种案例也知道这在实践中并不是问题(事实上MonoTouch的前身便是Unity3D对Mono的使用,而iOS上实在有太多游戏在使用Unity3D了)。
  • 有人说,MonoTouch或MonoDroid没有大公司支持,不靠谱;我说,您之前不是经常鄙视类似“开源没有微软靠谱”或是“微软开发人员只知道微软技术”这种说法的吗?
  • 有人说,用MonoTouch等于抛弃了CocoaTouch社区,出了问题都没人问;我说,MonoTouch的问题基本就是CocoaTouch的问题,MonoTouch的UI层就是CocoaTouch,有问题直接去CocoaTouch社区或CocoaTouch程序员,代码直接映射,类库直接使用。
  • 有人说,用MonoTouch的人不好招;我说,用C#、.NET的人比用Objective-C、Cocoa多太多了。给我一个熟练使用.NET和C#的人,三天上手,一周成为能够开发出成品的iOS开发者。
  • 有人说,难道就是为了用.NET所以用MonoTouch?我说,用MonoTouch/MonoDroid的好处很多,例如我可以在iOS、Android、Windows Phone甚至更多平台上共享UI以外的代码,并可以直接使用大量.NET上的类库——这点实在太方便了。不要问我为什么Android上不能使用Java类库,我只知道开发Andorid的同事发现SOAP访问类库没有,REST找不到好的,JSON支持也只有最原始的支持,于是痛苦万分。

我还知道,这些说法依旧挡不住出现基于MonoDroid的DeltaEngine,这是个跨平台的游戏引擎,在Mono的支持下可以运行在Linux,MacOS X,iOS和Android上,在微软.NET支持下可以运行在XBox 360,Windows Phone 7自然还有普通的Windows系统上。在CES 2011上NVidia演示了一个游戏Soul Craft,它运行在LG Optimus 2X,这个游戏正是使用了DeltaEngine。

对于我们来说,最大的限制其实还是眼界和思维,突破这一屏障也是我组织nBazaar技术沙龙的目的之一。本周六将会举办第三届nBazaar技术交流会,具体信息请访问http://nbazaar.org/。如果您还没有报名,也可以直接前来,也欢迎带上感兴趣的朋友或同事。根据以往的经验,场地就像乳沟,挤挤总是有的……

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

32 条回复

  1. 老赵
    admin
    链接

    老赵 2011-01-14 00:27:56

    @mathgl: 难得老赵对mono有如此的认识。。几年前我在公司第一次尝试用mono部署一个服务端的时候,当时的同事都觉得奇怪,没有一个人愿意花时间去了解一下这个到底 是什么...

    mono现在比较不足是书不多,文档也不算全,好多东西还要自己去探索...

    不好意思刚才的回复被我不小心删了……其实mono的东西也没什么特别的,该有的资料也都有……

  2. lovecindywang
    180.168.127.*
    链接

    lovecindywang 2011-01-14 09:00:25

    http://www.go-mono.com/docs/ 里面很多都是Documentation for this section has not yet been entered.

  3. tobin
    124.42.24.*
    链接

    tobin 2011-01-14 09:54:49

    点登录弹个框就没反应了!MONO到现在几乎没有见到过在生产环境中用过!一个成功的案例都没有!

  4. shootsoft
    222.130.128.*
    链接

    shootsoft 2011-01-14 09:58:36

    老大的文章总是信息量巨大啊~

  5. 老赵
    admin
    链接

    老赵 2011-01-14 10:13:45

    @tobin: MONO到现在几乎没有见到过在生产环境中用过!一个成功的案例都没有!

    莫名其妙,我给了那么多你还说没有,那还有什么好说的。

  6. 牧童
    60.247.77.*
    链接

    牧童 2011-01-14 10:25:40

    老大的最后一句话比较经典...

  7. Eric
    125.95.104.*
    链接

    Eric 2011-01-14 12:04:37

    场地就像乳沟,挤挤总是有的

  8. 链接

    麒麟.NET 2011-01-14 12:35:25

    http://monotouch.net/Apps

    看看这里有多少monotouch开发的App

  9. mathgl
    222.216.166.*
    链接

    mathgl 2011-01-14 16:47:43

    @老赵

    mono 和 .net严格来说不是一回事..也有好多特有的东西,例如 simd, coroutine等等。有些东西(例如async socket)和.net的实现有些差异,不能照搬来用的。

    我在想如果有本书讲述一下这些差异的方面就更好,可以节省一些摸索的时间。

    现在用mono的问题在于不少东西都需要去摸索和测试来解决,简单google找不到什么答案。

  10. yogister
    92.70.152.*
    链接

    yogister 2011-01-14 17:32:19

    MONO 不错, 但我担心做大了, Apple 会封杀。 毕竟 Apple要推Obj-C 和Xcode啊~

  11. 老赵
    admin
    链接

    老赵 2011-01-14 17:50:13

    @mathgl

    Mono和.NET的确不是一个东西,它们是对CLI规范的不同实现,规范定义内的东西,可以认为它们是一致的,这基本就是.NET的绝大部分了。话说你说的async socket的差异是指什么啊?

  12. 老赵
    admin
    链接

    老赵 2011-01-14 17:50:49

    @yogister

    其实我很感兴趣到那一天之后果粉们什么反应……

  13. gs
    58.60.2.*
    链接

    gs 2011-01-15 14:06:02

    赵兄 你的邮箱是?

  14. fuxy
    119.134.244.*
    链接

    fuxy 2011-01-15 18:06:51

    之前很喜欢看评论的,后来发现,不管老赵,写什么类型的文章,评论总是,对.net的争论,那怕老赵写的是游记。这里基本成为,喜欢.net和少数不喜欢.net的人争论的地方。话又说回来,有争论才有进步。

    其实,.net和微软没有关系,.net只是一个平台,只可惜它老母是微软,就导致这么多的非议,那是对.net的不公平,很少人说到java的不是时,会说sun(现在是oracle)的总总,可是只要是.net的反对者,基本是在拿微软说事,大家,千万别祸及家人,跟他老母没关系。

    话说,.net下的很多东西还是很好用的,至少,我觉得入门还是比较容易的,让很多初级程序员可以混口饭吃。

    很多人老在批评,微软推出的技术太快,今天vb明天c#,今天form明天wpf,我想这个微软也很为难,微软肯定也想推出一个技术后,能统领几百年,可惜,世道变化太快,只能革新,没办法省下这研发的费用。所以,如果微软明天宣布放弃.net推出新的平台,我一点都不奇怪,也许我依然会抽时间去学习。

    很多人都觉得,在什么平台下,就用什么技术比较好,别这么固执了,有条件,尝试一下别的技术也不错,比如mono。

    不过话又说回来,我个人还是比较喜欢java,只是java变化确实比较慢,导致现在很多人在说它已经老化,开发效率低下,其实这也说明,微软变化快的原因,否则下场就是sun。

    再其实,老那两个语言比来比去的,意义也不是很大,至少这里已经偏离老赵的本意了,老赵是想通过比较,看到彼此的不足。可是这里看到的都是太多无聊的争论。

    希望看到老赵多写一些好文章,而不是把宝贵的时间,浪费在无谓的争论中。

  15. flyingchen
    123.125.157.*
    链接

    flyingchen 2011-01-16 12:45:50

    我认为Mono之所以不被广大.net开发人员认可,可能主要是因为开发者长期活在ms的呵护下,不愿看看外面的世界,也很少认可ms之外的解决方案。

  16. 老赵
    admin
    链接

    老赵 2011-01-16 21:55:27

    @flyingchen

    这方面还真得加上“国内”两个字。

  17. @Waynebaby
    210.22.108.*
    链接

    @Waynebaby 2011-01-18 14:42:24

    我就是是不愿意搞ms外面的技术的代表 真是有够不开放的。

    但是我觉得没啥不认可mono的。

    话说 最近想买块云 但是Windows Asure 好贵啊。。。

    vps么 windows的哪里找 老赵有推荐没 噗噗。。

  18. 贝壳里的海
    202.103.241.*
    链接

    贝壳里的海 2011-01-18 23:15:52

    看来新手也有新手的好处啊,我开始学的时候,平台跟语言就是两个概念~。

  19. tshao
    58.41.103.*
    链接

    tshao 2011-01-24 00:30:45

    那工作台不错,就是看着有点烧钱==

  20. JeeChang
    114.96.13.*
    链接

    JeeChang 2011-01-24 23:38:22

    很期待老赵有空整理下推荐阅读的目录。 更加期待老赵把书托系列扩展下子

  21. Aaron
    192.138.214.*
    链接

    Aaron 2011-01-25 04:33:55

    我愈发觉得是否接受Mono是判断一个.NET程序员是否优秀的重要准则。

    这句话我不太明白,老赵能否说下那些不接受mono的.net程序员不接受的原因?

  22. 老赵
    admin
    链接

    老赵 2011-01-25 09:38:49

    @Aaron

    思想放不开呗,然后就开始找各种理由了。

  23. 链接

    Eric Poon 2011-02-13 17:17:07

    很棒,不过,请问有什么Monodroid的资料?如配置和IDE等。

  24. 老赵
    admin
    链接

    老赵 2011-02-14 09:25:30

    @Eric Poon

    就是官方文档咯。

  25. mathgl
    125.215.206.*
    链接

    mathgl 2011-02-14 17:25:09

    最近发现 mono的gc确实不怎么样。有些简单的例子都没法正常运行。老赵对mono的gc有什么调优心得吗?

  26. 老赵
    admin
    链接

    老赵 2011-02-14 23:39:25

    @mathgl

    不是吧,哪些例子会因为GC问题无法正常运行?

  27. FG
    58.34.81.*
    链接

    FG 2011-02-23 21:14:04

    这图片太给力了

  28. mathgl
    125.215.206.*
    链接

    mathgl 2011-02-27 17:02:30

    @老赵: 不是吧,哪些例子会因为GC问题无法正常运行?

    例如这篇文章提到的这个程序。。我用c#写了一个同样的东西。在.net下非常正常。。在mono 2.4, 2.6 & 2.8都不能顺利执行。。在最新的2.10 (linux) 下可以正常运行。。这个例子虽然有些极端,不过大致可以说明mono以前的gc确实不怎么样。

    P.S: 2.10在linux下表现正常,在win下还是一般,那个例子在win下也不稳定,经常抱outofmemory exception。 顺便赞一个..2.10对于.net 4.0的兼容性不错。现在用ironpython来做配置以及一些dsl。。在.net 4.0编译的ironpython.dll可以直接在mono上用。。。现在mono基本上具备生产环境下应用的条件了。。

  29. 活跃的毛虫
    218.92.75.*
    链接

    活跃的毛虫 2011-04-06 17:31:27

    其实老赵,换句话说,包括我在内的很多程序员需要把所学技术和下一顿吃什么紧密相联的!你对MONO的前景都没那么明朗,更何况我等平民...当然你可以用它们来做研究,做研究是没错的.而我们不行.我会考虑如果在商业应用上出了大问题解决不了怎么办?我连个求助都无门啊!!

  30. 老赵
    admin
    链接

    老赵 2011-04-06 22:51:05

    @活跃的毛虫

    谁说我对Mono的前景不明朗,我对Mono很有信心,反而是很多不接触Mono的人找各种理由说Mono不靠谱……在我看来就是自己给自己找理由而已。

  31. myue
    125.104.103.*
    链接

    myue 2014-10-23 11:03:26

    我想问你现在还有关注mono 或者 xamarin吗 前景渺茫

  32. 老赵
    admin
    链接

    老赵 2014-10-26 23:42:02

    @myue

    我靠,这两年是Xamarin发展最迅速的两年,你居然还不知道,真是有前景对你也没用……

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我