【C/C++】虚拟机实现:用C语言来写Java虚拟机

前言:本篇文章除了能够让你了解到虚拟机的工作原理外,还可以让你了解到较低级别的编程过程。

【C/C++】虚拟机实现:用C语言来写Java虚拟机_第1张图片

由于我喜欢在较低级别(Low-level)的应用中(编译器,解释器,解析器,虚拟机等等)工作,所以我觉得写一篇关于用C编程语言构建虚拟机的文章,是非常有必要的。我认为这篇文章除了能够让你了解到虚拟机的工作原理外,还可以让你了解到较低级别的编程过程。

准备内容

·使用的编译器类型:我正在使用的是clang,它是轻量级编译器,但你可以使用任何现代编译器;

·文本编辑器:我建议当编写C语言时,通过IDE编辑文本编辑器,我将使用Emacs;

·基本的编程知识:比如什么是变量,流量控制,函数,结构等;

· GNU Make:GNU Make主要用于自动化构建可执行程序(库文件),这样我们就不需要在终端中一遍又一遍地编写相同的命令来编译代码。Make的功能包括:自动化构建和安装;增量编译及自动更新;适用于多语言,比如c/c++、java、php等;支持自定义功能扩展(只要有意义,都是可以放到makefile中)。

为什么你应该写一个虚拟机?

【C/C++】虚拟机实现:用C语言来写Java虚拟机_第2张图片

以下是你应该编写虚拟机的一些原因:

1.你需要更深入地了解计算机的工作方式,本文将帮助你了解你的计算机在较低级别的环境中是如何运行工作的?而虚拟机则提供了一个非常简单的抽象层;

2.顺便了解一些虚拟机的知识;

3.深入了解一下编程语言的工作原理,现在的各种语言都针对虚拟机,比如JVM,Lua VM,FaceBook 的 Hip—Hop VM(PHP/Hack)等。

指令集

指令集会相对简单,我将简要介绍一下,例如如何从寄存器中移动值或跳转到其他指令。

假设我们的虚拟机有一组寄存器:A,B,C,D,E和F,且这些都是通用寄存器,这意味着它们可以用于存储任何东西。这与专用寄存器不同,例如在x86上,ip,

flag, ds,

…程序是只读指令集。如果虚拟机是一个基于栈的虚拟机,这意味着它有一个我们可以压栈和弹出值的栈,另外,该虚拟机还有一些我们也可以使用的寄存器。基于栈的虚拟机比基于寄存器的虚拟机实现起来要简单得多。

下面是我将要实施的一个指令集的示例:

PSH 5       ; pushes 5 to the stack

PSH 10      ; pushes 10 to the stack

ADD         ; pops two values on top of the stack, adds them pushes to stack

POP         ; pops the value on the stack, will also print it for debugging

SET A 0     ; sets register A to 0

HLT         ; stop the program

【C/C++】虚拟机实现:用C语言来写Java虚拟机_第3张图片

以上就是我的指令集,请注意,POP指令将打印我们弹出的指令,其中很多是调试用的。ADD会将结果压栈到栈,所以我们可以从栈中的弹出值来验证它是否存在。我还在其中包含了一条SET指令,这样你就可以了解如何访问和写入寄存器了。你也可以尝试执行像MOV

A,B(将值A移至B)的指令, HLT是显示我已经完成程序执行的指令。

虚拟机如何工作?

其实虚拟机比你想象的要简单,它的工作模式遵循一个简单的规律,即“指令周期(instruction cycle)”,整个过程包括读取、解码、执行三大块。首先,你要读取指令集,然后才能解码指令并执行解码后的指令。

项目结构

在我开始编程之前,需要做一些准备工作。我需要一个文件夹来放置项目,我喜欢将项目放置于~/Dev下。另外,我需要一个C编译器(我使用的是

clang 3.4)。以下是我在终端中设置我的项目的过程,假设你已经拥有一个〜/ dev /目录&#x

你可能感兴趣的:(C,Java,C语言,Java虚拟机,虚拟机,大神)