问题

Java 平台中的 JVM 和 .Net 平台下的 CLR 分别是用什么语言写的?

回答
Java 平台中的 JVM (Java Virtual Machine) 和 .NET 平台下的 CLR (Common Language Runtime) 是各自平台的核心组件,负责托管和执行代码。它们都是复杂的软件系统,通常会使用多种编程语言来构建,以充分发挥不同语言的优势。

下面将详细介绍 JVM 和 CLR 的主要开发语言及其原因:



Java 平台中的 JVM

JVM 并不是完全用 Java 编写的。虽然 Java 语言本身在 JVM 的设计理念和概念中有重要影响,但 JVM 的核心实现,特别是那些需要与操作系统底层进行交互、或者对性能有极致要求的组件,主要使用 C++ 和 C 语言编写。

主要开发语言:

1. C++ (绝大部分核心实现):
原因:
性能和效率: JVM 的核心功能,如字节码解释器、即时编译器 (JIT)、垃圾回收器 (GC)、内存管理等,对性能要求极高。C++ 作为一种接近硬件的语言,提供了对内存的直接控制和高效的底层操作能力,能够实现高度优化的代码,以达到接近原生代码的执行速度。
系统级编程能力: JVM 需要与操作系统进行交互,例如线程管理、内存分配、文件 I/O、网络通信等。C++ 在这些系统级编程任务中表现出色,能够方便地调用操作系统的 API。
跨平台性 (通过 C++ 的抽象): 虽然 C++ 本身是平台相关的,但 JVM 的 C++ 代码通过精心的设计和抽象层,可以被编译成针对不同操作系统和硬件架构的原生代码。这使得 JVM 能够在各种平台上运行,实现“一次编写,到处运行”的承诺。
成熟的生态系统和工具: C++ 拥有成熟的编译器、调试器和性能分析工具,这些工具对于开发如此复杂的系统至关重要。

具体模块:
解释器: 负责逐条解释执行 Java 字节码。
即时编译器 (JIT): 将热点字节码编译成本地机器码,极大地提升执行效率。
垃圾回收器 (GC): 实现自动内存管理,释放不再使用的对象。不同的 GC 算法(如 Serial, Parallel, CMS, G1, ZGC, Shenandoah)都是用 C++ 实现的。
内存管理器: 管理 JVM 的堆、栈、方法区等内存区域。
JNI (Java Native Interface): 允许 Java 代码调用 C/C++ 代码,反之亦然。JVM 的许多底层功能是通过 JNI 与 C/C++ 实现的。
线程调度和管理: 底层线程的创建、同步和管理。

2. C (较少,主要用于低级接口):
原因:
兼容性: 有些非常底层的系统 API,特别是 C 语言编写的那些,直接调用 C 会更方便。
简洁性: 对于一些非常简单的接口和数据结构,C 的简洁性可能更有效。

具体模块:
一些遗留的接口或与某些特定库的交互。

3. Java (少量,用于特定功能或早期实现):
原因:
早期实现: 在 JVM 的早期阶段,部分管理和工具类可能使用 Java 编写。
某些高级特性: 一些非性能关键但逻辑复杂的管理功能,或者为 JIT 编译器提供的辅助功能,可能以 Java 的形式存在,然后通过 JNI 调用 C/C++ 实现。
自举 (Bootstrapping): 某些版本的 JVM 在启动过程中会加载一小部分 Java 类,这些类会被 JIT 编译成机器码,然后用于启动更复杂的 C++ 实现。

例子:
一些基础的类库,如 `java.lang.Object`, `java.lang.String` 等,虽然它们在 JVM 内部有 C++ 的实现来执行其核心逻辑,但其接口和部分行为是在 Java 类中定义的。
某些高级的诊断和监控工具。

总结 JVM:
JVM 的设计哲学是“由 C++ 构建,运行 Java 代码”。其核心功能,尤其是性能密集型部分,几乎全部由 C++ 编写,以确保高效和跨平台性。Java 在其中扮演的是被执行的代码角色,以及在某些管理和辅助层面的使用。



.Net 平台下的 CLR

CLR (Common Language Runtime) 是 .NET 平台的运行时环境,它也主要由 C++ 编写,因为其承担的任务与 JVM 非常相似:托管代码执行、内存管理、垃圾回收、安全性等,都需要高性能和底层的系统交互能力。

主要开发语言:

1. C++ (绝大部分核心实现):
原因:
性能和效率: 与 JVM 类似,CLR 的核心组件,如 JIT 编译器、垃圾回收器、类型系统、安全引擎等,都需要极高的性能。C++ 提供了必要的底层控制能力来优化这些关键部分。
系统级编程: CLR 需要与操作系统进行深度的交互,管理进程、线程、内存映射文件、文件系统等。C++ 是实现这些低级操作的理想选择。
跨平台性: .NET Core 和 .NET 5+ 的目标是跨平台运行。CLR 的 C++ 实现通过与 OS 抽象层交互,使得 CLR 本身可以在 Windows, macOS, Linux 等多个操作系统上编译和运行。
COM 互操作和遗留代码: .NET 最初在 Windows 上发布,需要与大量现有的 COM 组件进行交互。C++ 在这方面提供了强大的支持。
成熟的工具链: 同样,C++ 的成熟生态系统对于开发和维护 CLR 至关重要。

具体模块:
JIT 编译器: 将 CIL (Common Intermediate Language) 字节码编译成目标机器码。
垃圾回收器 (GC): 负责自动内存管理。
类型加载和验证: 加载程序集、验证类型安全性。
线程管理: 管理线程的创建、调度和生命周期。
安全引擎: 实施代码访问安全(CAS,虽然在较新版本中被其他安全模型取代,但底层实现仍是 C++)。
异常处理: 处理运行时异常。
与操作系统 API 的交互: 底层的进程间通信、文件系统访问等。
托管调试助手 (MDA): 诊断运行时问题的工具。

2. C (少量,用于特定模块或早期实验):
原因:
管理代码的开发: 某些对性能要求不那么极致的运行时服务或管理功能,可以使用 C 开发,因为这样可以更容易地利用其强大的抽象能力和生产力。
自举和模块化: CLR 内部也存在一些使用 C 编写的组件,它们作为托管代码在 CLR 内部运行。
Managed Debugging API: 调试器相关的部分可能会使用 C 来实现一些高级功能。

例子:
一些启动过程中的辅助类。
某些服务(如代码生成器)的实现。

3. 其他语言 (非常有限,可能用于测试或特定工具):
原因:
测试框架: CLR 的测试套件可能使用各种语言编写。
构建工具和脚本: 整个 .NET 平台的构建过程涉及到很多脚本语言和工具。

总结 CLR:
CLR 的设计目标是提供一个统一的运行环境,支持多种编程语言。其核心实现同样高度依赖 C++,以获得最佳的性能、系统控制能力和跨平台兼容性。C 在 CLR 的某些管理组件或辅助功能中扮演着角色,但关键的底层运行时引擎仍然是 C++ 的天下。



共同点与差异:

共同点:
核心实现语言:JVM 和 CLR 都主要使用 C++ 来构建其高性能的运行时引擎,包括 JIT 编译器、垃圾回收器、内存管理器等。
目的:两者都是为了提供一个托管的执行环境,实现内存管理、异常处理、安全性和跨平台性。
JIT 编译:两者都采用 JIT (JustInTime) 编译技术来提高代码执行效率。
垃圾回收:两者都实现了自动垃圾回收机制。

差异点:
目标语言: JVM 的主要目标是执行 Java 字节码 (Java bytecode),而 CLR 的目标是执行 CIL (Common Intermediate Language) 字节码,这使得 CLR 可以支持 C, VB.NET, F 等多种语言。
生态系统: Java 的 JVM 是为了 Java 语言生态服务的,而 CLR 是为了整个 .NET 生态服务的。
设计历史: Java 平台相对更早,其虚拟机设计理念已经非常成熟。而 .NET 是微软推出的平台,在设计上借鉴了 Java 的一些成功经验,并在此基础上进行了创新,特别是对多语言支持的强调。

总的来说,JVM 和 CLR 作为各自平台的“大脑”,它们复杂的底层实现和对性能的极致追求,自然而然地选择了 C++ 作为主要的开发语言。而 Java 和 C 等高级语言则是在这个强大的运行时之上构建应用程序的工具。

网友意见

user avatar

前面的回答基本上都覆盖到关键点了:Java Class文件与.NET的Assembly文件格式都是公开的标准,其中的Java字节码与CIL(Common Intermediate Language)也都有公开的标准定义。这便于容纳多种不同的兼容实现。每个平台上的VM实现不需要源自同一份源码,只要它能接受标准格式的输入并相应实现标准中的程序语义即可。

这边来补充点实际例子吧:

JVM

  • Oracle/Sun HotSpot VM - 整体都是用C++实现的,只有非常少量的内嵌汇编。其中包括一个用C++实现的动态汇编器,HotSpot VM需要用汇编的地方多数是用这个在运行时汇编器生成的。
  • Oracle/BEA JRockit - 基本上是用C实现的,有少量汇编,另外有部分本来是VM内部的功能用Java来实现。
  • IBM J9 VM - 核心VM用Smalltalk生成C来实现,一些外围组件例如JIT编译器和GC用“使用了类的C风格的C++”来实现。
  • Sun Classic VM - VM的主体用C实现,解释器循环用汇编实现。最早期(JDK 1.0.2)的时候这个VM还不叫Classic VM,那个时候整个VM基本上是用纯C实现的,包括解释器循环在内。
  • Oracle/Sun Maxine VM - VM自身是用纯Java实现的,包括VM核心、JIT编译器和GC等都是;有一小块启动程序用C实现。
  • Oracle/Sun Squawk VM - VM大部分是用Java实现的,少部分用C实现。部署时用Java实现的部分会被编译成C然后跟用C实现的部分一起编译成最后的二进制可执行文件。
  • Rava - 用纯Ruby实现。这是个超简单的功能还不完全完整的JVM,但足以运行一些简单的Java程序了。

还有用JavaScript实现的

Orto

、用

CoffeeScript

实现(现在用

TypeScript

实现)的

Doppio

之类的。JVM的实现实在太多了无法穷举。

然后跟JVM有深刻渊源的Android系VM中,

  • Dalvik VM主体是用C实现的,解释器有C版本也有各个平台上的汇编版本
  • Android Runtime(ART)主体是用C++实现的

Common Language Infrastructure (CLI)

  • Microsoft CLR (Common Language Runtime) - 主体是C++,少量汇编
  • Mono - 主体是C
  • Microsoft Research Bartok - VM核心是用C#实现的,包括GC在内

怎样,各种奇葩都有吧。可能性无限多。

之前我整理的一份列表里还有JVM与CLI的许多其它实现,楼主有兴趣的话可以参考:

hllvm.group.iteye.com/g

类似的话题

  • 回答
    Java 平台中的 JVM (Java Virtual Machine) 和 .NET 平台下的 CLR (Common Language Runtime) 是各自平台的核心组件,负责托管和执行代码。它们都是复杂的软件系统,通常会使用多种编程语言来构建,以充分发挥不同语言的优势。下面将详细介绍 JV.............
  • 回答
    话说这 Java 和 C 吧,除了大家常说的跨平台和平台成本这种显而易见的区别,Java 身上还有些 C 没那么容易直接看到,但细品之下又能感觉出来的独特之处。你得这么想,Java 就像一位在各种环境下都生活得游刃有余的老派绅士,它骨子里透着一种“走到哪都得习惯”的韧性。这种韧性最核心的表现,我觉得.............
  • 回答
    .......
  • 回答
    你好!看到你对 Qt 这么感兴趣,而且有 Java 的基础,这真是个绝佳的切入点。能理解你现在有点纠结,毕竟要踏入一个全新的技术领域,尤其还是像 Qt 这样功能强大又跨平台的框架,心里肯定有各种顾虑。咱们先聊聊 Qt,它其实是一个集成了开发工具、库和框架的“全家桶”。你可以把它想象成一个巨大的工具箱.............
  • 回答
    在 Java 中,当一个线程调用了 `Thread.interrupt()` 方法时,这并不是像直接终止线程那样强制停止它。相反,它是一个通知机制,用于向目标线程发出一个“中断请求”。这个请求会标记目标线程为“中断状态”,并根据目标线程当前所处的状态,可能会触发一些特定的行为。下面我将详细解释 `T.............
  • 回答
    Java 官方一直以来都坚持不在函数中提供直接的“传址调用”(Pass by Address)机制,这背后有深刻的设计哲学和技术考量。理解这一点,需要从Java的核心设计理念以及它所解决的问题出发。以下是对这个问题的详细阐述: 1. Java 的核心设计理念:简洁、安全、面向对象Java 在设计之初.............
  • 回答
    Java 的 `private` 关键字:隐藏的守护者想象一下,你在经营一家精心制作的糕点店。店里最美味的招牌蛋糕,其配方是成功的关键,你自然不会轻易公开给竞争对手,对吧?你只希望自己信任的糕点师知道如何制作,并且知道在什么时候、以什么样的方式使用这些食材。这就是 `private` 关键字在 Ja.............
  • 回答
    Java 在引入泛型时,虽然极大地提升了代码的类型安全和可读性,但严格来说,它并没有实现我们通常理解的“真正意义上的”泛型(相对于一些其他语言,比如 C++ 的模板)。这其中的核心原因可以追溯到 Java 的设计理念和对向后兼容性的考量,具体可以从以下几个方面来详细阐述:1. 类型擦除 (Type .............
  • 回答
    这个问题很有意思!“360 垃圾清理”这个概念,如果用在 Java 的世界里,就好像是问:“为什么 Java 的垃圾回收机制,不像我们电脑上安装的 360 软件那样,主动去到处扫描、删除那些我们认为‘没用’的文件?”要弄明白这个,咱们得先聊聊 Java 的垃圾回收,它其实是个非常聪明且有组织的过程,.............
  • 回答
    好的,咱们来聊聊 Java 内存模型(JMM)和 Java 内存区域(Java Memory Areas)这两个既熟悉又容易混淆的概念。别担心,我会尽量用大白话讲明白,就像跟朋友聊天一样,不搞那些虚头巴脑的术语。想象一下,咱们写 Java 代码,就像是在指挥一个庞大的工厂生产零件。这个工厂有很多车间.............
  • 回答
    在 Java 泛型中,`` 和 `` 语法看起来相似,但它们代表的是截然不同的类型关系和使用场景。理解它们之间的差异,关键在于把握 Java 泛型中的“生产者消费者模型”以及它们对类型参数的“协变性”和“逆变性”的支持。我们一步一步来拆解,让你彻底明白 `super` 的含义,以及它与 `exten.............
  • 回答
    想知道 Java 学到什么程度才算精通,这确实是个挺实在的问题,也挺难有个标准答案。不过,咱可以从几个维度来聊聊,看看什么样的人,在别人看来算是玩明白了 Java。首先,得承认,所谓的“精通”这词儿,多少有点玄乎。没人敢说自己是绝对的精通,毕竟技术发展那么快,总有新鲜玩意儿冒出来。但如果说你能把 J.............
  • 回答
    作为一名Java程序员,想要在职业生涯中走得更远,确实需要掌握那些真正核心、最常用的技术。这就像学武功,要先练好基本功,才能去钻研那些花哨的招式。我个人在多年的开发实践中,总结出了一套“二八定律”式的技术认知,下面我就把这些我认为最关键的20%技术,尽可能详实地分享给大家,力求让这篇文章充满实在的干.............
  • 回答
    想要转战 Android 开发,对于 Java 的掌握程度,我更倾向于从“能解决实际问题”的角度来看待,而不是一个死板的“级别”。你想啊,我们做开发最终目的都是为了产出有价值的东西,而不是为了考一个 Java 等级证书。所以,如果非要给一个大致的界定,我认为你可以开始准备转战 Android 了,当.............
  • 回答
    好,咱就掰扯掰扯java为啥对泛型数组这事儿这么“矫情”,不直接给你整明白。这事儿啊,说起来也算是一段公案,得从java这门语言设计之初,以及它如何处理类型安全这件大事儿上头说起。核心矛盾:类型擦除与运行时类型检查的冲突你得明白java的泛型,尤其是泛型数组这块儿,最大的“绊脚石”就是它的类型擦除(.............
  • 回答
    Java 分布式应用入门指南:从零开始构建稳健的系统想要踏入 Java 分布式应用开发的大门?别担心,这并非遥不可及的挑战。相反,它是一个充满机遇和成长的领域。本文将带你系统地梳理分布式应用的核心概念,并为你推荐一系列实用的学习资料,帮助你从新手蜕变为一名合格的分布式开发者。 一、 理解分布式应用的.............
  • 回答
    JavaBean,这个在Java开发中几乎无处不在的概念,听起来可能有点“高大上”,但实际上它描述的是一种非常规整、有用的Java类。说白了,JavaBean 就是一个遵循特定规范的Java类,这个规范让它更容易被JavaBeans组件架构所识别和使用,从而方便地在可视化开发工具中进行拖放、配置和交.............
  • 回答
    Java 和 C 都是功能强大、广泛使用的面向对象编程语言,它们在很多方面都有相似之处,都是 JVM (Java Virtual Machine) 和 CLR (Common Language Runtime) 的产物,并且都拥有垃圾回收机制、强大的类库和社区支持。然而,深入探究,它们在设计理念、语.............
  • 回答
    作为一名在Java世界里摸爬滚打多年的开发者,我总会时不时地被Java的某些设计巧思所折服,同时也曾浪费过不少时间在一些细枝末节上,今天就来和大家聊聊,哪些地方是真正值得我们深入钻研的“精华”,哪些地方可能只是“旁枝末节”,不必过于纠结。 Java的“精华”:值得你投入热情和时间去领悟的部分在我看来.............
  • 回答
    Java 到底有多难?这个问题,说实话,没有一个绝对的答案。就像问“学会游泳难不难?”一样,有人天生会游,有人呛水呛得厉害,有人还得请教练。Java 的难易程度,很大程度上取决于你自身的背景、学习方法、以及你期望达到的目标。不过,我可以给你一个相对详细的描绘,尽量不带“AI味儿”,就像一个有几年经验.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有