登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
园子
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP申请
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
分清“语言/规范”以及“平台/实现”,以及跨平台.NET开 ...
分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发
[ 复制链接 ]
晦险忿
2025-5-29 15:33:13
在许多年前,“语言”就等同于“平台”,例如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开发》
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
如何优雅的使用RabbitMQ
分布式锁1 Java常用技术方案
浅谈我对DDD领域驱动设计的理解
游戏编程十年总结(下)
【前端性能】高性能滚动 scroll 及页面渲染优化
验证码对抗之路及现有验证机制介绍
从零开始入门 K8s | 手把手带你理解 etcd
中文写程序,何陋之有?
NHibernate之旅(2):第一个NHibernate程序
公司的中场
FFmpeg开发笔记(六十二)Windows给FFmpeg集成H.266编码器vvenc
Android 系统缺陷不完全点评
谈谈如何从本质上理解sql语句, 存储过程,ORM之间的联系和取舍。
.net环境下跨进程、高频率读写数据
[一步一步MVC]第一回:使用ActionSelector控制Action的选择
第二个iPhone应用程序:“Say Hello”
关于编程的胡扯
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
晦险忿
2025-5-29 15:33:13
关注
0
粉丝关注
15
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9986
里豳朝
9994
背竽
9994
4
森萌黠
9992
5
猷咎
9992
6
凶契帽
9992
7
柴古香
9992
8
黎瑞芝
9992
9
炀餮氢
9992
10
终秀敏
9990
查看更多