在许多年前,“语言”就等同于“平台”,例如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/。如果您还没有报名,也可以直接前来,也欢迎带上感兴趣的朋友或同事。根据以往的经验,场地就像乳沟,挤挤总是有的……

赵劼 / CC BY 2.5

转载于:https://www.cnblogs.com/wk23415/archive/2011/03/23/1992330.html

[ZZ]分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发相关推荐

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

    在许多年前,"语言"就等同于"平台",例如C,C++以及最早的Ruby和Python等等.但是随着技术发展,出现了一些通用的平台,例如.NET和Java,逐渐这 ...

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

    在许多年前,&ld上海徐汇企业网站制作quo;语言"就等同于"平台",例如C,C++以及最早的Ruby和Python等等.但是随着技术发展,出现了一些通用的平台, ...

  3. 一起谈.NET技术,分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发

    在许多年前,"语言"就等同于"平台",例如C,C++以及最早的Ruby和Python等等.但是随着技术发展,出现了一些通用的平台,例如.NET和Java,逐渐这 ...

  4. Java 版本、语言规范、API、JDK、IDE、Java 源程序编译、执行原理(跨平台性根本原因)、特殊字符用法、8 大数据类型小结

    文章目录 前言 一.三大版本类型 二.Java 语言规范 三.应用程序接口(API) 四.Java 开发工具包(JDK) 五.集成开发环境(IDE) 六.Java 运行环境(JRE) 七.Java 源 ...

  5. 3.4 学编程不拘于语言,学语言不限于平台——《逆袭大学》连载

    返回到[全文目录] 目录 3.4 学编程不拘于语言,学语言不限于平台 编程语言 软件和硬件--计算机要作为一个整体看待 语言的江湖 语言不是回事 多平台上的精彩 3.4 学编程不拘于语言,学语言不限于 ...

  6. JAVA语言规范 JAVA SE 8 - 类型、值和变量

    JAVA语言规范 JAVA SE 8 - 类型.值和变量 类型和值的种类 简单类型和值 整数类型和值 整数操作 浮点数类型.格式和值 浮点数操作 boolean类型和布尔值 引用类型和值 对象 Obj ...

  7. 【C】——C语言规范:C89、C90、C95、C99

    本文转载 [K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版 ...

  8. C语言规范:C89、C90、C95、C99

    本文转载 [K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版 ...

  9. C语言规范:C89、C90、C95、C99及C89和C99区别

    [K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版(按照惯例 ...

最新文章

  1. 02JavaScript中的变量
  2. 机器学习如何选择模型 机器学习与数据挖掘区别 深度学习科普
  3. C语言每日一题之No.9
  4. java考察代码_一段简单的关于字符串的 Java 代码竟考察了这么多东西
  5. 阿里二面:你来设计一下 Flink 性能调优?
  6. [科技]Loj#6564-最长公共子序列【bitset】
  7. windosw7 Hosts文件的位置
  8. 9张图带你领略AI态势!
  9. 苹果id是什么格式的_iTunes Converter mac(音频格式转换工具)
  10. 美国62%智能音箱用户都使用了语音购物,连鹦鹉都忍不住了
  11. 字符多维php递归遍历目录
  12. getTime()的兼容性(ios)
  13. 如何把 Mac 中的文件拷贝到NTFS硬盘?
  14. TestFlight测试步骤
  15. STM32(RFID)阶段三(触屏数字键盘)
  16. 【Java启程】语句结构
  17. 20 React项目生成及部署
  18. 全球5G模组厂商型号价格对比
  19. STM32F103RBT6 mcu芯片
  20. 大数据时代的大数据管理发展,经历了哪几个阶段?

热门文章

  1. 拟人退火算法解3SAT
  2. 什么是设备管理系统?设备管理系统解决方案有何优势?
  3. 软工网络15团队作业2——团队计划
  4. 美签 计算机 敏感专业,美国签证:14个最容易被check的敏感专业
  5. laravel安装-中文语言包
  6. 四川调整村卫生室一般诊疗费标准按5元收取-四川-村卫生室-收费
  7. 计算机自动操作软件有哪些,什么软件可以控制电脑自动开关机
  8. HTML案例--西式甜品网
  9. 在idea中创建maven工程,搭建MVC框架,完成和servlet相似的操作
  10. JAVA怎么给手机发短信对接验证码短信接口DEMO示例