浅谈C# vs Java (1)

原创 2002年04月04日 09:23:00

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(公共语言规则),难怪有自由软件组织曾提议使用MicrosoftCLR&CTS构架来统一当前自由软件界的编译环境。



 



3.运行



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



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



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



b)              JIT:与JavaJIT方式相似。



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的风格吧。

浅谈java及应用

给初学者之一:浅谈java及应用   学java不知不觉也已经三年了, 从不知java为何物到现在一个小小的j2ee项目经理,虽说不上此道高手,大概也算有点斤两了吧。每次上网,泡bbs逛论坛,没少去...
  • u012402926
  • u012402926
  • 2016年05月04日 17:54
  • 143

浅谈java(一)

一.java的历史和发展前景       java从产生到现在已经有20多年的历史了。自其出现以来就以惊人的速度发展,使用java开发的人数不胜数。       Java 语 言 有 着 广 泛 ...
  • windy_03271
  • windy_03271
  • 2013年03月27日 17:45
  • 342

java与C#的比较

一、C#和java哪个更好?        几天前,我的北理工研究生面试,老师问了我这样一个问题,你认为C#和java哪个更好?那么,作为读者的你,会怎么回答这道题呢?        其实,在我看来,...
  • lu930124
  • lu930124
  • 2016年01月16日 10:34
  • 18438

浅谈代码的执行效率(1):算法是关键

前一段时间在博客园里看到这样一篇文章,那位兄弟谈到程序效率的关键是“简短”。他说,“程序越简短,其可执行代码就越少,就越有效率”,而在编写程序的时候,“要尽量改进我们的算法,而改进算法中最重要的一条,...
  • GarfieldEr007
  • GarfieldEr007
  • 2015年12月20日 13:04
  • 421

TCP-IP学习笔记-- 浅析TCP(1)

TCP的特点 TCP报文格式 TCP可靠数据传输机制数据序号和确认号机制 特点 TCP连接的建立与终止 建立连接三次握手 终止连接四次挥手 TCP的状态转换图 TCP的流量控制 工作原理 TCP拥塞控...
  • Yvonne8_5
  • Yvonne8_5
  • 2016年02月20日 23:27
  • 922

浅谈Java并发编程

浅谈Java并发编程(一)作为一个工作经验还不是很足的小程序员,第一次写博客,不足之处还希望业内前辈多多指点。以前接触并发编程的机会还是挺少的,但是进入了一个大平台,用户量很可观,所以在程序处理是并发...
  • missY_H
  • missY_H
  • 2017年05月01日 23:03
  • 160

浅谈C语言与JAVA语言

C语言是我第一门编程语言。java是我的第二门编程语言。
  • java_M_du
  • java_M_du
  • 2017年06月19日 00:45
  • 163

在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试

在VS2015中用C++创建DLL并用C++或C#调用且同时实现对DLL的调试
  • songyi160
  • songyi160
  • 2016年04月06日 17:59
  • 13033

VS编写代码的四种注释(C#),让编程轻而易举

随着开发的不断深入,随着开发人员的增加,随着开发人员的各种编码风格,如果没有注释,则不同编码人员就很难进行沟通和交流。 注释就像一本书中的前言,这本书对自己有没有帮助,看完前言就知道,这段代码对自己有...
  • u012354475
  • u012354475
  • 2015年05月13日 17:46
  • 1993

01. C#和.net框架介绍

C#编程语言是为开发微软公司的 .Net框架上的程序而
  • manofstyle1
  • manofstyle1
  • 2014年09月07日 22:05
  • 515
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈C# vs Java (1)
举报原因:
原因补充:

(最多只允许输入30个字)