用C语言来实现一个简单的虚拟机

2020-01-06 13:14:08丽君

易采站长站为您分析用C语言来实现一个简单的虚拟机,其中栈数组的部分非常值得学习,需要的朋友可以参考下

必要的准备工作及注意事项:

在开始之前需要做以下工作:

一个C编译器——我使用了 clang 3.4,也可以用其它支持 c99/c11 的编译器;

文本编辑器——我建议使用基于IDE的文本编辑器,我使用 Emacs;

基础编程知识——最基本的变量,流程控制,函数,数据结构等;

Make 脚本——能使程序更快一点。

为什么要写个虚拟机?

有以下原因:

想深入了解计算机工作原理。本文将帮助你了解计算机底层如何工作,虚拟机提供简洁的抽象层,这不就是一个最好的学习它们原理的方法吗?

更深入了解一些编程语言是如何工作。例如,当下多种经常使用那些语言的虚拟机。包括JVM,Lua VM,FaceBook 的 Hip—Hop VM(PHP/Hack) 等。

只是因为有兴趣学习虚拟机。

指令集

我们将要实现一种非常简单的自定义的指令集。我不会讲一些高级的如位移寄存器等,希望在读过这篇文章后掌握这些。

我们的虚拟机具有一组寄存器,A,B,C,D,E, 和F。这些是通用寄存器,也就是说,它们可以用于存储任何东西。一个程序将会是一个只读指令序列。这个虚拟机是一个基于堆栈的虚拟机,也就是说它有一个可以让我们压入和弹出值的堆栈,同时还有少量可用的寄存器。这要比实现一个基于寄存器的虚拟机简单的多。

言归正传,下面是我们将要实现的指令集:

 

 
  1. PSH 5 ; pushes 5 to the stack  PSH 10 ; pushes 10 to the stack 
  2. 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 
  3. SET A 0 ; sets register A to 0  HLT ; stop the program