java 底层有两点注定其无法写出高效率的native编译器
....... images/back.gif
堆栈机只不过是Hotspot实现技术,dalvik就是用的寄存器机,IL都不同了,要做java语言的原生编译并非不可能
内存回收这个不争了,争下去又要战10版
补充一点
java(.net,各种动态脚本, 甚至objc)对象的内存模型里面包含的过多元信息(附带的动态函数表之类都是影响性能的大头,不过objc ruby之类有模块mixin这个概念很少会用到多层继承结构)
C++的做法是把元这类魔法特性丢到预处理阶段,后果是编译慢的蛋疼
个人观点是脚本有其存在的价值,胶水性质的代码,冗杂的业务逻辑用脚本来描述能节约人生,更specific的领域需要专用的DSL
编程语言越通用那么他解决特定问题的能力也就越弱,混合编程才能达到机器和人的平衡点
有句话叫做“提前优化是万恶之源” 还得加一条强类型安全检查,总之就是编译器添加的代码拖慢了速度。但更多的还是因为细节过分隐藏让程序员用了错误的算法
比如
string a = "233";
foreach( 10000000 次 )
{
a += "253874.........一段很长的字符串";
}
没有c和c++ 背景的人可能认为这段代码没问题,但其实每次循环都有内存申请,拷贝和释放。这样不明所以得代码多了,速度自然就慢了 引用第81楼精钢魔像于2011-07-17 17:23发表的:
还得加一条强类型安全检查,总之就是编译器添加的代码拖慢了速度。但更多的还是因为细节过分隐藏让程序员用了错误的算法
比如
string a = "233";
....... images/back.gif
常用脚本都会自动优化成mutable string,用java能写出这种代码的.....那也不能怪语言啊 额,人家只是举例,楼上有点钻牛角尖了……
在不同的领域选择不同的工具反正不会有错的 安卓扩张得太快,结果负面的东西全让消费者买单
我很怀疑google 是借安卓把手机市场的水搞浑,自己置身事外看热闹 引用第81楼精钢魔像于2011-07-17 17:23发表的:
还得加一条强类型安全检查,总之就是编译器添加的代码拖慢了速度。但更多的还是因为细节过分隐藏让程序员用了错误的算法
比如
string a = "233";
....... images/back.gif
就算用JAVA
也不能这样写
那就是教学的问题了 c++ 未来也会有GC的吧?
关键垃圾回收不是万能
有也能内存泄露的 引用第3楼精钢魔像于2011-07-17 17:23发表的:
还得加一条强类型安全检查,总之就是编译器添加的代码拖慢了速度。但更多的还是因为细节过分隐藏让程序员用了错误的算法
比如
string a = "233";
....... images/back.gif
有像你这样黑的么,就算是自学,稍微好点的教科书都会提到字符串的这种特性吧。
难道说在学习java时学不到的情况下,你还指望那人能学好c++之类呢。 引用第89楼HyperIris于2011-07-17 18:33发表的:
把stack模型映射为register模型,这不是一般的蛋疼,对于jit来说就是脱裤子放屁
....... images/back.gif
JSR定义的java是堆栈机模型没错(其实load store跟显式参数也不算严格的堆栈机了),但既然把amdroid也算上那显然这里所说的java只是java的语法,dalvik就是使用java语法的寄存器机,跟真实的处理器区别只是全局寄存器和实例寄存器了 引用第90楼茶叶于2011-07-17 18:54发表的:
初学者强烈不推荐C++,语法太过复杂及累赘,还不如Obj-C简练。
C#也眼看着往C++大而全的路上走了,又是个被微软带坏的东西。 images/back.gif
但学会动态语言后,还有心情来啃C++吗 引用第87楼ov_efly于2011-07-17 17:58发表的:
c++ 未来也会有GC的吧?
关键垃圾回收不是万能
有也能内存泄露的
....... images/back.gif
已入C++11标准
但我觉得C++11的努力方向有点歪,把元编程好好加强下能做到编译期生成代码岂不更给力……
引用第90楼茶叶于2011-07-17 18:54发表的:
初学者强烈不推荐C++,语法太过复杂及累赘,还不如Obj-C简练。
C#也眼看着往C++大而全的路上走了,又是个被微软带坏的东西。 images/back.gif
这扯的
C++有的东西你就都要学都要用么?
能干点事情的东西都简单不了(没有银弹),当初的GWBASIC我都不敢说自己全都掌握了。 问题是,C++本身就鼓励大而庞杂的用法。我很怀疑,有哪一门其他编程语言里面的奇技淫巧有C++这么多。
c和c++确实性能有优势,问题是从c诞生到现在,计算机的运算能力和内存大小提升了至少上百上千倍了吧,而对老板来说,程序员的生产力显然没有提升这么多倍。
比如内存,从最初不到1MB到现在一台2万美金的NT服务器满配的1TB(dell R910好像就能配到这个数目),增长了一百万倍;60年代,ibm360的操作系统花了5000人年(记不太清了),按前面的1百万倍来算,现在一个人就应该能在2,3天写完……
结论很明显,对大部分程序来说,人的时间相比机器的时间要值钱多了,除了一部分利基市场外,用c++的性价比实在不怎么样。 我考,java在droid上那个吊样干php什么事情,躺着也中枪 问题就是别人一行能搞定的,你要写一堆。这算不算大而复杂?
或者应该说大而繁琐? 引用第95楼fctt2008于2011-07-17 22:20发表的:
问题是,C++本身就鼓励大而庞杂的用法。我很怀疑,有哪一门其他编程语言里面的奇技淫巧有C++这么多。
images/back.gif
你一定不知道Perl的设计哲学
另外我还真不知道你哪里来的“庞大复杂”、“奇技淫巧”的印象
自己啥复杂用啥就怪语言提供了这么多功能么?
引用第97楼newfaceryo于2011-07-17 22:31发表的:
问题就是别人一行能搞定的,你要写一堆。这算不算大而复杂?
或者应该说大而繁琐? images/back.gif
例子? JAVA=主流可以卖钱的市场
效率有毛用,能吃饭吗??? C++这东西,用不好带来的危害比带来的好处更多,安全的做法只有忽略一切奇技淫巧。
先不说容易出错的内存指针问题,运算符重载,拷贝构造,自动指针之类的语法便利只会使代码变得复杂难懂。
Obj-C上的autorelease这么简单的内存延迟释放功能带来的便利比C++方便多了。 引用第92楼拜拜于2011-07-17 19:30发表的 :
但学会动态语言后,还有心情来啃C++吗
images/back.gif
初学者,视不同的方向的话。
底层或要打基础的从C开始,
OO的话,从Java开始,因为语法比C#简单,异常强制声明的语法可以养成好习惯。
动态语言现在太多了,挑不出典型的,不过个人倾向ruby 一贴拖出一堆死程。
非要较真执行效率的话,自然JAVA在C/C++面前死的确实比较惨,不过这也就是复杂运算时会这样。对于语言的运用范围,得从实际需求出发,我在前面的那个例子,至少可以证明一点,I/O和简单处理方面,JAVA和C/C++的差距并不会体现出来。考虑到成本以及开发风险,快速简单的JAVA比C/C++靠谱多了。 我觉得GC这种东西,对于C++而言只会带来更多麻烦 引用第91楼venusvsvirus于2011-07-17 19:05发表的:
JSR定义的java是堆栈机模型没错(其实load store跟显式参数也不算严格的堆栈机了),但既然把amdroid也算上那显然这里所说的java只是java的语法,dalvik就是使用java语法的寄存器机,跟真实的处理器区别只是全局寄存器和实例寄存器了 images/back.gif
+1
1.android使用java作为开发语言只是为了吸引原本使用java的developer
2.CLR绝逼算虚拟机
3.各种语言有各自的使用场景,单纯“运行效率”的比较没有意义
4.新版本的Hotspot JVM在GC和JIT上已经优化得很好了,至少服务器端使用C2编译的话性能相当不错
回 94楼(鸡蛋灌饼) 的帖子
C++11有GC?这楼已经歪了,新开个语言大战贴吧 引用第98楼鸡蛋灌饼于2011-07-17 22:42发表的:
你一定不知道Perl的设计哲学
另外我还真不知道你哪里来的“庞大复杂”、“奇技淫巧”的印象
自己啥复杂用啥就怪语言提供了这么多功能么?
知道啊,所以我写小程序也不用perl,而用python
至于“庞大复杂”“奇技淫巧”,只需要看看诸如effective c++和more effective c++这一类书有多少就知道了。作为通用语言,内存操作细节之类的东西根本就不应该暴露出来。
其实仔细一想,作为强调前向兼容,流行了20年以上的东西,C++历史沉淀太重了,或者换句话说,架构腐化已经很严重了。流行了15年的JAVA也有同样的问题,不知道下一个根本不考虑现有程序员的,纯粹的新语言会是什么,会在什么时候出现。这样一种语言,估计才能真正带来一些目眩的本质改变,才能摆脱很多已经过时了10年以上的争论。 c++有gc了?它还需要gc么?不是有智能指针了么…
Re:回 94楼(鸡蛋灌饼) 的帖子
引用第105楼ts1egats于2011-07-18 00:02发表的 回 94楼(鸡蛋灌饼) 的帖子 :C++11有GC?
这楼已经歪了,新开个语言大战贴吧 images/back.gif
http://en.wikipedia.org/wiki/C%2B%2B0x#Allow_garbage_collected_implementations
0x的编译器支持还是各种..
C++用不好就是悲剧..
引用第107楼uroko于2011-07-18 08:33发表的 :
c++有gc了?它还需要gc么?不是有智能指针了么… http://bbs.saraba1st.com/2b/images/back.gif
你要所谓的智能指针是什么东西....
>>你要所谓的智能指针是什么东西....
scoped_ptr
shared_ptr
weak_ptr
前面和stl那个一样
后两个是带引用计数的,垃圾回收就是引用计数吧? 引用第75楼darklight于2011-07-17 15:57发表的:
JAVA也好,C也好,C++也好,甚至JavaScript也好,写出来不过是源代码而已,有什么执行效率不效率的说法.
机器执行的只能是机器码。至于将源代码转化成机器码,那是编译器的事情,就C来说,不同的编译器编译出来的机器码执行效率都不一样。
java的编译器的目标只是JVM,经过了一道中间层,比不过直接的机器码那是当然的。如果有兴趣,有人写一个对特定平台的JAVA直接编译成该平台机器码的编译器,编译出的机器码执行效率高于其它语言的编译器也很正常。
语言是没有什么高下的。 images/back.gif
问题是编译器没那么智能,优化能力还没有比人强,一般而言表达能力更强的语言能有更好的效率。因为表达能力强大,所以可以做更多的手工优化。 C/C++的执行效率目前还没有高级语言能达到的,在需要从语言层面上挖掘性能的时候,不得不用C/C++,而且历史积累的这么多代码库,也不是说抛弃就能抛弃的。
从VLC for android这个项目来看,NDK在开发多媒体应用上还是没啥问题的 引用第100楼茶叶于2011-07-17 22:50发表的:
C++这东西,用不好带来的危害比带来的好处更多,安全的做法只有忽略一切奇技淫巧。
先不说容易出错的内存指针问题,运算符重载,拷贝构造,自动指针之类的语法便利只会使代码变得复杂难懂。
Obj-C上的autorelease这么简单的内存延迟释放功能带来的便利比C++方便多了。 images/back.gif
⋯⋯RAII要比autorelease优雅多了好不好。
scope_ptr,auto_ptr,shared_ptr哪个不比autorelease强?
就语法来说,objc实在是一个error-prone的语言,连父类的析构都要显式调用,有这么麻烦么?
Re:回 94楼(鸡蛋灌饼) 的帖子
引用第105楼ts1egats于2011-07-18 00:02发表的 回 94楼(鸡蛋灌饼) 的帖子 :C++11有GC?
这楼已经歪了,新开个语言大战贴吧 images/back.gif
optional的吧我记得。
不过0x里面没有varadic template实在太不爽了。 引用第106楼fctt2008于2011-07-18 07:02发表的 :
知道啊,所以我写小程序也不用perl,而用python
至于“庞大复杂”“奇技淫巧”,只需要看看诸如effective c++和more effective c++这一类书有多少就知道了。作为通用语言,内存操作细节之类的东西根本就不应该暴露出来。
....... images/back.gif
正是因为通用,所以才应该暴露。各种细节的隐藏是各种库应该干的事情。如果不支持在语法中表达这些细节,那么很多需要精细操作的领域就无法使用c++了。c++的问题不是繁杂,相反,c++里面到处是各种“统一”的概念。比如用操作符重载支持原生类和class的统一,支持function object,这些都是“统一”的概念。理解了这点以后我觉得c++反而是一门相对简单的语言,至少需要理解的核心概念比其他语言,不说少,至少一点也不多。
至于各种语言细节,其实养成少数良好的习惯以后基本上可以不考虑了。只有库的作者才需要费尽心思考虑各种奇技淫巧。 JAVA设计之初就不是把性能放第一位的,和这样的对手比性能你们害臊么……
JAVA的侧重点是跨平台,一次编译到处运行,免去日后移植来移植去的重复劳动…… 引用第115楼cxn于2011-07-18 09:18发表的:
JAVA设计之初就不是把性能放第一位的,和这样的对手比性能你们害臊么……
JAVA的侧重点是跨平台,一次编译到处运行,免去日后移植来移植去的重复劳动…… images/back.gif
结果呢?