Answers:
在Java中,虚拟机执行您的代码,但是C编译器生成实际计算机执行的代码。确切地说,在两种情况下,您的程序最终都将转换为真实的机器代码,但是对于Java,则需要中间步骤才能编译为JVM字节码。
因此,Java程序在加载时会被JVM转换为实际指令,而C程序在运行前已被编译器转换为实际指令。
除了机器代码外,不存在直接在硬件上执行的编程语言,因为您无法将其提供给文字源文本。所有真实的实现都必须翻译源程序转换为“机器”的语言。
对于某些实现,它是静态翻译的。我们通常将这些实现称为“已编译”。对于其他人,它被翻译成某种中间形式,然后在程序运行时被动态翻译。我们通常将这些实现称为“已解释”。这些之间存在无限可能,甚至许多现代CPU都将动态转换作为其执行核心的一部分。
即使您的程序在执行之前很久就已经进行了静态编译,除非您要编写固件,否则很少有编译后的代码直接在裸机上运行而没有任何支持。操作系统提供了一个用于用户空间程序的虚拟机,通常会提供一些功能,例如您自己拥有一个CPU。平面内存空间可能比连接到计算机的物理RAM大的错觉甚至被称为“虚拟内存”。
最重要的是,即使您使用C进行编程,也有一个C虚拟机!传统上将其称为“ C运行时”或简称CRT。
由于C 大多会提前提前直接转换为汇编代码/机器代码(在某些平台上,可能还会有一些线程代码),并且可以将其视为虚拟机的一部分),因此虚拟机通常只需要处理启动和关掉。
启动通常涉及设置堆栈和堆。操作系统很少为您提供这些,而编程语言的工作就是将这些提供给程序员。在某些平台上,可能会进行一些信号处理的初始化,在多线程环境中设置“主”线程,在程序已链接到C ++代码的情况下运行全局构造函数,处理动态链接的库,或者可能是设置argc / argv和envp所需的一些处理。最后,CRT将控制权转移给main。
至于关闭,许多操作系统都可以恶意杀死进程,因此关闭并不需要做太多事情。最主要的是处理atexit()调用,以确保程序确实干净退出。