分享
 
 
 

浅谈C# vs Java (1)

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

CLR vs JVM

1.概念

Microsoft一直在宣称CLR(公共语言运行环境)是所谓得虚拟机器而并非JVM虚拟

机的概念。这是由于CLR将支持一切遵循CTS(公共语言规则)的编程语言在其上运行并且互不干扰,从这个概念上说CLR相较JVM来说更像一个平台。

2.编译

Java将源码编译成为.class文件,通过java命令来运行。例如:

java test.class

而C#则将源码编译成为.exe文件。但这个exe文件不同于传统的exe文件,它是由一个清单和MSIL(Microsoft中间语言)代码组成。格式大致如下:

PE(Win32-Portable executable)头 --- exe文件头

清单 --- 文件中所包含的类型和类

跳转命令 --- 跳转到MSIL解释器

MSIL代码

从以上的结构可以看到,C#同Java一样能够轻松被反编译,不同的是,Microsoft还提供了用于读取编译后MSIL的工具ildasm。

另外,虽然Microsoft对这种结构提出了种种的好处,但是如果把MSIL看成是Java编译后的代码(即.class文件中的代码),那么C#的文件结构更象是把Java的运行命令和.class文件已exe文件的方式封装起来。如下表:

C#

Java

PE头

-

清单

关于这点将在部署一节中论述

跳转命令

java命令

MSIL代码

.class文件

分析了C#编译结果,就会发现C#并没有因为编译成了可执行文件,就依附于window平台。从理论上说,如果有一个Linux版的MSIL解释器(实际上它是CLR的一部分)和一个Linux版的C#的编译器,那么就可以将window下编写的C#的代码在Linux下重新编译,于是就实现了所谓“处处编译,处处运行”。而在这工程中,保持代码编译一致性的CTS(公共语言规则),难怪有自由软件组织曾提议使用Microsoft的CLR&CTS构架来统一当前自由软件界的编译环境。

3.运行

Java早期是一种解释性语言,后来为了提高效率采用了JIT(just-in-time)技术,还有一些工具可以将Java生成特定的CPU的二进制代码。

而C#也必不可少的选用了MSIL和JIT的机制。根据不同的情况可分为3类:

a) 安装时代码生成(Install-time code generation):将当前代码完全编译成特定的CPU的二进制代码。之所以叫做安装时代码生成,是因为这个编译过程是在安装时进行的。

b) JIT:与Java的JIT方式相似。

c) EconoJIT(经济性JIT):与JIT不同的是,它通过丢弃已产生出的,编译过的代码回收内存,比较适用于少量内存的手持设备。

4.部署

Java采用的是将包路径和目录相对应的方法,生成一层一层的目录。之后又推出使用jar文件封装的方式。

C#采用的是元数据纪录的方法。所谓元数据就是上文C#编译结果结构中提到的“清单”。C#通过元数据纪录类型和类的信息,相较Java的目录结构和jar文件方式,封装性提高

了不少。不过目录结构有一个好处是显而易见,就是当有部分代码需要修改的时候,只要重新编译需要修改的代码,并覆盖相应的类就可以了。

一切都是对象

C#和Java都宣称自己的一切都是对象,但是真正实现这一说法的恐怕只有SmallTalk。

这主要是因为将基本数据类型描述成对象所造成的代码性能方面的降低是很难让人接受的。于是C#和Java都提出了关于这一问题的解决方案。

Java保留了基本数据类型,并为每一种类型提供了一个对应的类,如int型对应Integer类, long型对应Long类。当需要用类来描述基本数据类型时,即可通过生成其对应的类,如下代码:

int n = 5;

Integer in = new Integer(n);

使用后,又可以将对应类的值赋给基本数据类型,如下代码:

Integer in = new Integer(5);

int n = in.intValue();

相对应的,C#也采用了为基本数据类型提供对应类的方式,但在使用上采用的是开箱(unboxing)和装箱(boxing)操作。所谓装箱就是将基本数据类型转换为对应类。而开箱的作用刚好相反。

当试图将基本数据类型以一种与System.Object基类接口相匹配的方式使用时,系统将自动将它装箱,使之能够像一般对象一样被使用。如下代码:

int n = 42;

Int32 in = n;

开箱的代码如下:

int n = 42;

Int32 in = n;

//注意:开箱时必须进行显示的类型转换

int n2 = (int)Int32;

有以上的例子可以看出,在一切都是对象的问题上,C#和Java的解决方式是很相似,

只是C#封装了更多的操作细节。但是是否有系统来做这些操作可以提高语言本身的效率呢?Microsoft的回答肯定是肯定的。

小结

以上对C#和Java在编译运行以及对象的设定等问题上作了比较,从中发现,C#在设计上大量模仿Java,但在具体实现上C#封装了更多的细节,相较Java来说应该更易于使用,这大概是Microsoft的风格吧。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有