clr jvm_CLR vs JVM:.NET和Java之间的争斗如何扩展到VM级别

clr jvm

Java和.NET之间的战斗永无止境,了解VM级别的差异如何影响这场辩论

我们已经在C#和Java之间的差异方面进行了广泛的写作,涵盖了我们最喜欢的功能,而彼此之间没有相同的功能。 随着哪一种语言比另一种语言更好的激烈竞争,我们正在更深入地研究战场,以了解它们各自的虚拟机(VM)之间的差异和相似之处。

我们开始做吧。

TL; DR:CLR和JVM之间的前5个异同

CLR和JVM之间的主要相似之处包括:

  • 两个虚拟机(VM)
  • 两者都包括垃圾收集
  • 两者都采用基于堆栈的操作
  • 两者都包含运行时级别的安全性
  • 两者都有异常处理方法

CLR和JVM之间的主要区别包括:

  • CLR被设计为与语言无关,JVM被设计为特定于Java
  • CLR最初仅与Windows兼容,JVM可与所有主要操作系统一起使用
  • CLR使用JIT编译器,JVM使用称为Java HotSpot的专用JIT编译器
  • CLR包括用于闭包,协程和指针的声明/操纵的指令,而JVM不包括
  • JVM与更强大的错误解决方案和生产监视工具兼容

现在,我们已经确定了5个主要的相似点和不同点,让我们跳入所有这一切的含义。 从基础开始,然后深入研究所有这些含义。

什么是虚拟机?

不难猜测虚拟机(VM)是计算机操作系统的虚拟仿真。 除此之外,这种系统抽象有两种不同的实现。

系统虚拟机作为功​​能齐全的操作系统存在,通常创建为替代物理机的使用。 这样,多个环境可以同时在同一台计算机上运行。 但是,这听起来并不像我们钟爱的CLR和JVM。

通用语言运行时(CLR)和Java虚拟机(JVM)都是进程虚拟机 。 这意味着它们不是执行整个操作系统,而是专门设计为在不依赖平台环境的情况下运行进程或程序。

仔细研究CLR和JVM之间的相似性

CLR和JVM都是虚拟机,它们都执行与平台无关的操作,即执行编译的源代码。 本质上,这些虚拟机都充当程序员的源代码和系统的机器代码之间的中间步骤,从而允许各种类型的处理器提高可用性。 在下图中,您可以看到两者的高级功能实际上是相同的。

CLR与JVM高级功能

除了它们的基本功能之外,它们都还包括用于垃圾收集,运行时级安全性和异常处理的方法。 最后要提到的相似之处是,它们都使用基于堆栈的操作,这是存储和检索操作数及其结果的最常用方法。

但是,当然,对于这些VM共享的每个相似之处,都可以发现实现上的差异。 尽管如此,就像使用编程语言一样,这些VM的开发也以类似跳跃的方式发展。 一种实现类似于“ mark-sweep-compact”方法的垃圾回收,另一种很快就会采用。

现在有一些主要差异

语言和平台兼容性

CLR和JVM之间潜在的表面差异(尽管可能会影响它们的开发方式)是JVM被创建为专门用于Java,而CLR被设计为与语言无关。 相反,CLR最初仅设计为在Windows操作系统上运行,而JVM始终与操作系统无关。 众所周知,时代已经改变了,现在有可以在Linux和Mac上运行的CoreCLR,并且已经开发了许多与JVM一起使用的语言。

这导致这样一个事实,即在大多数情况下,CLR和JVM之间的差异也是使用它们的语言之间的差异的标志。 或者,您可以说,语言之间的一些最重要的区别(出于参数的缘故,假设C#和Java )实际上是在VM级别实现的。

JIT编译

我们在VM级别上看到的最大区别是,尽管两者都使用JIT(即时)编译,但不会调用编译器同时运行。 在运行时调用时,CLR将所有MSIL代码编译为机器代码。 JVM使用称为HotSpot的专用性能引擎将Java字节码的JIT编译为机器可读的代码。 此方法仅编译将实际使用的代码中的“热点”。

这些编译策略中的每一个在性能方面都有其自身的权衡。 由于CLR可以高级编译所有机器代码,因此从长远来看,可以缩短执行时间。 但是,另一方面,如果运行方法只需要一小部分代码,则Java的HotSpot编译器可以节省时间。

语言功能的实现

另一个较小的区别是,CLR是用指令来构建的,该指令用于处理泛型类型并在运行时在这些类型上应用参数专用化。 基本上,这意味着CLR可以识别例如List和List之间的差异,而JVM无法识别。 CLR还允许用户以Structs的形式定义新的值类型,而基于JVM的语言中的值类型是固定的(字节,短型,整型,长型,浮点型,双精度型,字符型,布尔型),尽管有计划在工作中改变这一点。

像这样的其他差异在语言层面上也表现为差异。 其中包括:CLR而不是JVM中可用的闭包,协程和指针。

生产监控和异常处理

尽管两者都包含用于异常处理的方法,但是两者之间的总体差异可能会影响与不同异常和错误监视工具的兼容性。 反过来,这会影响故障排除策略和工作流程。

例如,使用JVM语言的开发人员可以利用OverOps提供的完整根本原因分析,而.NET开发人员和其他CLR语言开发人员只有在发布.NET / CLR版本之后才能使用该工具。在不久的将来( 在此处注册.NET BETA )。

绩效与采用

剑桥大学的杰里米·辛格 ( Jeremy Singer)于2003年进行的一项研究对CLR和JVM之间的性能差异进行了研究,发现至少在那时,它们的性能实际上是相同的。

研究发现,Java编译器产生的字节码较小,这可能会对VM性能产生影响。 但是,在运行代码时,执行时间几乎是50/50,CLR和JVM的执行时间都快一半左右。 根据这项研究,当谈到Java和.NET用户之间的激烈竞争时,看起来VM本身在区分能力方面起着比直接影响应用程序效率更大的作用。

在考虑采用时,这也很有意义。 在企业公司中,开发人员可以同时使用基于CLR和JVM的语言。 在大型公司中,有许多不同部门从事各种项目和应用程序的大型公司尤其如此。 例如,埃森哲和Intuit都使用.NET和Java。

社区

说到竞争,我们知道.NET和Java都有强大的社区来支持它们。 在这些社区中,开发人员在诸如StackOverflow之类的网站上提出问题并进行深入的对话。 快速搜索每个VM的名称可以发现CLR被标记了3,250次,而JVM被标记了8,628次。

在StackOverflow之外,还有Microsoft和Oracle自己培养的广泛社区。 在这里,用户不仅可以找到与CLR和JVM相关的其他信息和资源。 那里的主题包括云中的实施,疑难解答等。

但是,除此之外,社区绝对更集中于单个语言,如.NET , Java ,C / C ++,Scala等。

最后的想法

从最高级别看待这些VM,CLR和JVM之间的差异似乎几乎可以忽略不计。 但是,在许多(如果不是大多数)情况下,VM级别的差异反映了使用它们的语言之间的主要差异。 由于这些VM及其对应语言的构建方式,每个功能的功能略有不同,以提供其创建者想要提供的功能。

您如何看待CLR和JVM之间的区别? 您会根据使用的VM选择下一种编程语言吗? 在下面的评论中让我们知道!

翻译自: https://www.javacodegeeks.com/2018/02/clr-vs-jvm-battle-net-java-extends-vm-level.html

clr jvm

你可能感兴趣的:(大数据,编程语言,python,linux,java)