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

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

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

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

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

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

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

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

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

  4. 谈Java语言规范之枚举类型

    文章目录 枚举类型 一. 枚举常量 二.枚举主体声明 对枚举常数自我引用的限制: 三.枚举成员 这不是一顿快餐,希望你沉淀下来,细细品尝 写在前面 枚举类型可以考虑用来替换接口中的常量声明.并且 &l ...

  5. 再谈编程范式-程序语言背后的思想

    link link 编程范式 托马斯.库尔提出"科学的革命"的范式论后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词.编程范式一般包括三个方面,以OOP ...

  6. 浅谈Hybrid技术的设计与实现【转】

    https://www.cnblogs.com/yexiaochai/p/4921635.html 前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术 ...

  7. 再谈编程范式—程序语言背后的思想

    编程范式 托马斯.库尔提出"科学的革命"的范式论后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词.编程范式一般包括三个方面,以OOP为例: 1,学科的逻 ...

  8. 浅谈 JavaScript 编程语言的编码规范

    转自:http://www.ibm.com/developerworks/cn/web/1008_wangdd_jscodingrule/?ca=drs-tp4608 developerWorks 中 ...

  9. 浅谈JCFXBL“技术管理”思路

    浅谈JCFXBL"技术管理"思路 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/details/ ...

最新文章

  1. CentOS 7下安装Nextcloud搭建个人网盘
  2. python语言入门自学-自学编程的6种方法,自学Python
  3. 使用命令将单个java文件打包为jar
  4. 22. Leetcode 237. 删除链表中的节点 (链表-基础操作类-删除链表的节点)
  5. elisa标准曲线怎么做_ELISA标准曲线制作
  6. android 自定义banner,Android项目 引入Banner开源库(轮播图)
  7. 考研计算机网络比较难还是数据结构,2015考研:历年计算机试卷结构与难度分析...
  8. 怎样改动SharePoint管理中心的语言
  9. *** glibc detected *** malloc(): memory corruption
  10. React五——React-router
  11. 安装Git SCM for Windows
  12. 配电室环境监控系统技术方案
  13. html使用css居中
  14. 网站性能优化三大策略
  15. maven项目install报错:\target\surefire-reports for the individual test results
  16. 2.智能快递柜(终端篇)
  17. python怎么将字母排序_请教如何用python按字母顺序排序英文名字但是不可以用sort函数...
  18. 极限、可导、可微、连续之间的关系
  19. ❤表白❤相册——动态3D图片墙
  20. OCAD应用:光楔初始设计

热门文章

  1. 网销客是用来辅助网络营销
  2. Windows .CAB格式离线更新包的安装方法
  3. 2019 siggraph_SIGGRAPH 2019上的Unity:研讨会,讲座,演示等
  4. 高性能网站建设指南-前端性能优化(一)
  5. 爱河许云上计算机乐谱,爱河吉他谱(和弦谱,弹唱)_神马乐团
  6. android选择文件夹api,Android获取文件夹api及对应存储地址整理
  7. 操作系统原理田丽华,测试与作业
  8. 2021-12-1 学习的打卡学习第九天(头插法和一些函数)
  9. CISCO 3750交换机堆叠
  10. 一文搞懂如何使用ArcGIS API for Python训练深度学习模型