Java有JVM,C有什么?


15

我知道C具有编译器,但是决定执行性能的是什么?

例如,在一个if else块中,如果代码仅包含所有ifs而不是if elses,怎么确定所有ifs将被运行?在Java中将是JVM,但在C中,执行编译器是什么?


16
一个有用的细微差别是语言只是语言。例如,您可以制作一个采用C代码并使其在JVM中运行的编译器。
Telastyn

10
+1。这个问题问得好。我不会为它的无知而投票-难怪更多的Java学生问这个。
djechlin

您还可以将Java编译为机器代码并避免使用JVM ...
AK_

2
另外:编程语言!=框架!=运行时库!=编译器!=即时编译器!=
插入

Answers:


17

在Java中,虚拟机执行您的代码,但是C编译器生成实际计算机执行的代码。确切地说,在两种情况下,您的程序最终都将转换为真实的机器代码,但是对于Java,则需要中间步骤才能编译为JVM字节码。

因此,Java程序在加载时会被JVM转换为实际指令,而C程序在运行前已被编译器转换为实际指令。


20
有些编译器采用Java并产生机器代码。例如Excelsior Jet。还有C(picoc)的问询者,它们永远不会生成真实机器执行的代码。语言是语言。实现是实现。混淆两者可能会使人感到困惑。

6

除了机器代码外,不存在直接在硬件上执行的编程语言,因为您无法将其提供给文字源文本。所有真实的实现都必须翻译源程序转换为“机器”的语言。

对于某些实现,它是静态翻译的。我们通常将这些实现称为“已编译”。对于其他人,它被翻译成某种中间形式,然后在程序运行时被动态翻译。我们通常将这些实现称为“已解释”。这些之间存在无限可能,甚至许多现代CPU都将动态转换作为其执行核心的一部分。

即使您的程序在执行之前很久就已经进行了静态编译,除非您要编写固件,否则很少有编译后的代码直接在裸机上运行而没有任何支持。操作系统提供了一个用于用户空间程序的虚拟机,通常会提供一些功能,例如您自己拥有一个CPU。平面内存空间可能比连接到计算机的物理RAM大的错觉甚至被称为“虚拟内存”。

最重要的是,即使您使用C进行编程,也有一个C虚拟机!传统上将其称为“ C运行时”或简称CRT。

由于C 大多会提前提前直接转换为汇编代码/机器代码(在某些平台上,可能还会有一些线程代码),并且可以将其视为虚拟机的一部分),因此虚拟机通常只需要处理启动和关掉。

启动通常涉及设置堆栈和堆。操作系统很少为您提供这些,而编程语言的工作就是将这些提供给程序员。在某些平台上,可能会进行一些信号处理的初始化,在多线程环境中设置“主”线程,在程序已链接到C ++代码的情况下运行全局构造函数,处理动态链接的库,或者可能是设置argc / argv和envp所需的一些处理。最后,CRT将控制权转移给main。

至于关闭,许多操作系统都可以恶意杀死进程,因此关闭并不需要做太多事情。最主要的是处理atexit()调用,以确保程序确实干净退出。


2
C运行时和JVM是完全不同的野兽。CRT只是一个图书馆。
DeadMG

我已经编辑了答案,使事情变得更加清楚。附带地,JVM和VirtualBox也是完全不同的野兽。
化名

@假名:不是真的。好吧,好的,VirtualBox是一个虚拟器,而典型的JVM是一个仿真器,但是如果用句子中的QEmu替换VirtualBox,则两者实际上是相同的。
约尔格W¯¯米塔格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.