本地代码?托管代码?

(还有4天过年,我要回家我要回家--!)

 

昨天还有个家伙来问我一些问题,还问了工资,这让我尴尬得…

首先,我觉得问问题是个艺术吧。我比较反感那些人把问问题当成勤奋好学的依据,因为一些问题确实很蠢,一些问题你可以自己找到答案,当然也有些问题是确实得问。当然我也不排除你是看我不爽,存心来糊弄我的,不怕,这个我也喜欢。至于工资的事嘛,我这个确实不好说,觉得高了,你心理不平衡,觉得低了,你瞧不起人。我只能跟你说,在广州这个地方,1-2W是正常的,2K-3K也是正常的。

 

本来想写下linux的启动过程,initramfs,文件系统挂载和system init的东西,发现还是不熟悉,勉强写下来,不流畅也可能错露百出,就先写一篇杂谈吧,回头我知识验证一遍,再发文。好奇的人,可以去Linux From Scratch粗略看一下怎么从零编译一个linux操作系统,不是内核哟!

 

为什么要写本地代码和托管代码之争呢?现时,一方面java泛滥成灾,一些初学者甚至认为本地代码(C/C++)已经过时了,另一方面固步自守的一些老兵,又垢病托管代码的效率问题。说来说去,大家都似乎在抱着自己的优点,攻击别人的缺点。(中国人的劣根性?哈哈)

 

托管代码的优点,第一个是面向对象。时下,可能还有不少人在用C++和java在写过程性函数或者说方法。但是掌握设计模式的一些方法,你会发现面向对象竟是如此美好。翻看android源代码,你会发现各种各样的设计模式被使用,你看得眼花缭乱。是的,使用设计模式的代码让你阅读代码一时间很难习惯,你需要在一个类跳到另一个类,然后发现两个类或几个类有不同程度的引用和继承,过程性代码一步读到底就清楚干嘛做啥。但是当你改写一个模块的时候,你会发现如此方便(看android源代码那些回调函数),连编译的时间都节约了很多。不只java,C#等托管语言,C++也能做到,只不过用的是指针,而不是引用,这里有个代价问题,下面会解释。

 

第二个是平面迁移问题。本地代码做平台迁移是个很痛苦的时候,有时候平台相关的源代码处理得好,这当然不是个问题,例如用宏把平台相关的API重新定义一下。但是如果你这边一个函数指针,那边一段内联汇编,事情可能就不容易了。托管代码的优势是,它们运行在虚拟机上,无论平台如何变更,它们的运行环境不会改变。虚拟机的机制这里就不讨论了。说到平台移植,基于C++的QT框架又像一个畸形儿一样,那么耀眼。

 

第三个是容错率问题。托管代码有严格的类型检查,你不可能破坏堆栈,破坏内存(你能不能hack虚拟机,不是我要强调的重点),但是在本地代码中,你很容易会有这样的想法,那就是做一些自以为聪明的技巧。把一个short的指针转成int类型,再把int类型指针取值切成两半,一半给他,一半给另一个他。编译环境改变,大小端改变了,他变成另一个他,另一个他变成他,或者说另一个他不见,访问越界了有没有?你可能完全不知道我在说什么,这只是个极端的例子。这些事情,我读大学的时候觉得很酷!我在hack内存里想要的东西,别人看得一头雾水,我有点暗爽的感觉。但工作中,这是不允许的,除非为了解决一些语言缺陷或设计缺陷而不得不这样做,这就导致了容错问题,也就是我为什么觉得C++能做些面向对象的事,但似乎风险比较大。

 

本地代码真的那么差吗?不是。效率上,本地代码是占优的。尽管CLR VIA C#说得天花乱坠,什么本地代码是CPU指令的最小子集,而CLR会根据CPU选择最优的指令集,但是C#的桌面程序就是那么慢,模块越多程序越大越明显。我们可能缺少一些优化?是的,我把时间用来改善本地代码的算法了。另一方面,托管访问硬件,你怎么玩?你拿不到映射地址,I/O端口。Open GL怎么办?网络的掉包率太高了,诊错、重传、缓冲、优化处理怎么办?虚拟机能帮你做到吗?托管代码妥协了,所以JNI之类的与本地代码通信的接口出现了。

 

说到Qt,哥真是淡淡的忧伤。我说它像个畸形儿,估计很多人要拿砖头拍我了。可能源于我不喜欢做UI方面的工作,或者我觉得androidframework比它优秀,对它产生了成见。Qt就是针对C++平台迁移的弱点搞出来的。托管语言一次编译到处运行,它的目的则是一次编写到处编译。初次接触这狗屁东西,我还是比较兴奋。想自己SB地用MFC、windows api写了半天的窗口那么丑。这东西利用一句类似CSS的话,就把窗口搞得花样百出。东西投产了,发现效率不行了!贴图多了,渲染效率差了,信号槽慢了,bug多了,windows正常运行,到了linux下就莫名地段错误了,有木有!反过来思考一些问题,发现QT太多划蛇添足了,信号槽很方便,但背后其实是一堆的switch…case,这不是线性查找?当然有些编译器会优化成查表操作,这就没有问题了。那句类似CSS的话,最终还是得解释执行,那不就是说每份本地代码内置了一个语言解释器这么个做法而已?基于开源背景,版本更新那么慢,以及一些看起来那么弱智的bug,让人觉得QT只是NOKIA的一个弃婴,毕竟爸爸也难。

 

云计算越来越流行,一些函数式语言基于并发的优势,也崭露头角了。这可能又是一个新的发展趋势。我还苦于,如何在工作中引入架构的概念,语言各司其职的概念,SDK的概念,而惶惶终日。我不得不每天告诉他们,TI,谷歌的这些做法,不是为了复杂而复杂。就像一个不成熟的激进派分子,一句你经验不足,不懂业务,就把我打得遍体鳞伤了。

 

我还是希望自己能飞出去,看得更远些。这是我写这篇文章的原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值