免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2503 | 回复: 9
打印 上一主题 下一主题

[C++] 偶然想到的,换个角度比较C++与其他OO语言 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-27 23:04 |只看该作者 |倒序浏览
大多数OO语言都跑在虚拟机上,基于此,我们从一个很特别的角度来看C++。
把vmware当作用来跑C++的虚拟机,x86指令就是类似java字节码的东西,我们不再比较语言的不同,而是比较虚拟机的不同
vmware相比java,python等语言的虚拟机,缺少以下机制:

  1. 强类型检查
  2. 抛出异常
  3. 运行时绑定类型
  4. ...
复制代码


我自己列不全,但是可以想象,如果x86有这些特性,C++还会是现在的样子吗。这样容易看出C++的哪些设计是真正强大的,而哪些是出于无奈的

[ 本帖最后由 reiase 于 2008-2-27 23:36 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-02-28 17:28 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2008-02-28 21:53 |只看该作者
C++当初是为了X86设计的?

论坛徽章:
0
4 [报告]
发表于 2008-02-28 22:49 |只看该作者
在任何平台上面的java bytecode都是一样的。 但是c++编译出来机器码不一样,这不是一回事儿。

论坛徽章:
0
5 [报告]
发表于 2008-02-29 00:34 |只看该作者
原帖由 agaric 于 2008-2-28 22:49 发表
在任何平台上面的java bytecode都是一样的。 但是c++编译出来机器码不一样,这不是一回事儿。

这个大家都知道

举个例子,为什么只有返回值不同不能做函数重载,比如

  1. int fun(int a);
  2. float fun(int a);
复制代码

在重载上,C++的实现与java等语言是不同的,不同的原因是C++编译成汇编代码,而java编译成字节码。于是C++就使用汇编下的方法实现了函数重载,java就使用虚拟机下的方法实现了函数重载。

另外一个例子,数组的越界访问
python能够抛出一个异常来,C++能吗?不能,一旦越界,基本就出段错误了。除非你自己写代码抛出异常,在程序越界访问之前。造成这一点的原因是什么?C++引发的段错误会交给操作系统处理,而不是交给C++的异常机制来处理;而python的的越界访问交给虚拟机处理。

这些问题确实是因为C++直接编译成汇编代码,而不是字节码造成的。直接编译成汇编代码的语言相比那些依赖运行时的语言来说,特性要少一点,或者特性实现得有很大局限。一种语言的语法特性是跟该语言编译器前端的词法分析和语法分析相关的,而语言的特性如何实现就跟要跑在什么东西上相关了,从这点上来说,vmware与java虚拟机的差异是很重要的。

[ 本帖最后由 reiase 于 2008-2-29 00:42 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-02-29 19:48 |只看该作者
支持楼主看问题的方式。

个人认为java虚拟机在实现砂箱模型(以及大部分其它特性)的时候,有一个最核心的要求:非直接内存访问,用通俗点的话来说就是禁止指针存在(其实不完全一样,呵呵)。

像cpu上的函数调用也好,全局变量访问也好,都是通过函数/变量的地址直接进行访问。
而虚拟机上面的函数引用,则是把跳转请求提交到虚拟机上(方法有很多种,不一一讨论),由虚拟机将其引导到正确的地址。这时虚拟机可以做很多扩展操作,例如权限检查(砂箱),自动变更跳转目标(透明的升级对象)等等。

非直接内存访问也是有代价的--速度。
一方面,虚拟机对外部内存访问的扩展操作需要消耗大量的时间。
另一方面,为了支持非直接内存访问,必须付出额外的代价。很多本来可以做成直接内存访问的代码(访问局部变量),为了避免被黑客利用,必须陪着少数的外部内存访问一起,采用非直接内存访问方式。

论坛徽章:
0
7 [报告]
发表于 2008-02-29 23:23 |只看该作者

回复 #6 dxcnjupt 的帖子

up...

论坛徽章:
0
8 [报告]
发表于 2008-03-01 02:06 |只看该作者
C++ 是 C++,虚拟机是虚拟机,面向对象程序设计语言是面向对象程序设计语言

论坛徽章:
0
9 [报告]
发表于 2008-03-01 10:59 |只看该作者
原帖由 langue 于 2008-3-1 02:06 发表
C++ 是 C++,虚拟机是虚拟机,面向对象程序设计语言是面向对象程序设计语言


C++ 是 C++,面向对象程序设计语言是面向对象程序设计语言 ,
so what?

论坛徽章:
0
10 [报告]
发表于 2008-03-01 17:08 |只看该作者

回复 #8 langue 的帖子

我也同意楼主的意见
我感觉,JAVA的“非直接内存访问”这个思想很不错的
微软的C#也基本上是这个思想。

的确,会降低一部分效率,但是在硬件体系发展的这么快的情况下,是有必要的
同样,对于一个普通软件,不应该对整个操作系统的稳定有影响。(当然,这与程序员本身写的程序有很大关系)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP