MSIL和Java字节码之间的区别?
我是.Net的新手,我想首先了解基础知识。 MSIL和Java字节码有什么区别?
解决方案
没有太大的差异。两者都是我们编写的代码的中间格式。在执行时,虚拟机将执行托管的中间语言,这意味着虚拟机控制变量和调用。甚至还有我现在不记得的一种语言,可以以相同的方式在.Net和Java上运行。
基本上,这只是同一件事的另一种格式
编辑:找到了语言(除了Scala):是FAN(http://www.fandev.org/),看起来很有趣,但是还没有时间评估
CIL(又称MSIL)旨在为人类可读。 Java字节码不是。
可以将Java字节码视为不存在的硬件(但可以模拟JVM)的机器代码。
CIL更像是汇编语言,距机器代码仅一步之遥,同时仍然是人类可读的。
同意,差异足够细微,可以初学者学习。如果我们想从基础开始学习.Net,建议我们查看一下公共语言基础结构和公共类型系统。
Serge Lidin撰写了一本关于MSIL详细信息的体面的书:Expert .NET 2.0 IL汇编器。通过使用.NET Reflector和Ildasm(教程)的简单方法,我还能够快速掌握MSIL。
MSIL和Java字节码之间的概念非常相似。
他们本质上是在做同样的事情,MSIL是Microsoft的Java字节码版本。
内部的主要区别是:
- 字节码是为编译和解释开发的,而MSIL是为JIT编译明确开发的
- MSIL是为了支持多种语言(C#和VB.NET等)而开发的,而字节码仅是为Java编写的,因此字节码在语法上比Java更像Java,而IL在任何特定的.NET语言上都更类似于Java。
- MSIL在值和引用类型之间有更明确的划分
K John Gough在本文中可以找到更多的信息和详细的比较(后记文档)
首先,我要说的是,我不认为Java字节码和MSIL之间的细微差别不会使.NET开发人员感到困扰。它们都具有定义抽象目标机器的相同目的,该目标机器是最终使用的物理机器之上的一层。
MSIL和Java字节码非常相似,实际上有一个名为Grasshopper的工具可以将MSIL转换为Java字节码。
请注意,.NET Framework 2.0发布后,我停止了这一工作,因此其中某些事情可能不再适用(如果这样,请发表评论,我会予以纠正)。
- .NET允许用户定义的类型具有与常规引用语义(" struct")相对应的值语义的值。
- .NET支持无符号类型,这使指令集更加丰富。
- Java在字节码中包括方法的异常规范。尽管异常规范通常仅由编译器强制执行,但是如果使用非默认的类加载器,则可以由JVM强制执行。
- .NET泛型用IL表示,而Java泛型仅使用类型擦除。
- .NET属性在Java中没有等效项(是否仍然如此?)。
- .NET
enums'只不过是整数类型的包装器,而Java
enums`则是完全成熟的类(感谢Internet Friend发表评论)。 - .NET具有
out
和ref
参数。
还有其他语言差异,但是大多数差异不是在字节码级别表达的,例如,如果内存提供Java的非"静态"内部类(.NET中不存在)不是字节码功能,则编译器将生成内部类的构造函数的添加参数,并传递外部对象。 .NET lambda表达式也是如此。
我认为MSIL不应与Java字节码进行比较,而应与"组成Java字节码的指令"进行比较。
没有反汇编的Java字节码的名称。 " Java字节码"应该是一个非正式的别名,因为我在官方文档中找不到它的名称。
Java类文件反汇编器说
Prints out disassembled code, i.e., the instructions that comprise the Java bytecodes, for each of the methods in the class. These are documented in the Java Virtual Machine Specification.
" Java VM指令"和" MSIL"都被组装为.NET字节码和Java代码,它们是人类不可读的。