一步一步打造自己的编译器 之虚拟机

                                                oo虚拟机
 1 为什么要使用虚拟机
    一开始我想做的是一颗cpu,跑起来自己的程序,但如果从通用cpu做起那也太浪费时间了,所以,我决定开发一个自己的语言,编译出中间代码,跑在虚拟机上,等技术和指令集成熟后用VHDL写FPGA做真实cpu来支持它。
  oo虚拟机是可运行oo代码的假想计算机。只要将解释器移到特定的计算机上环境上,就能保证经过编译生成的oo中间代码运行起来。oo虚拟机有自己的cpu,运行逻辑,io等等。这个有点像JAVA虚拟机(JVM)但又不完全相同.与JVM,最大区别是没有它具体的指令集。这样有一个很大的缺点,浪费空间。所以你是甭指望在8051上跑oo程序的,但这种方式又有其优点:简单。
 2 oo虚拟机支持的数据类型
      bool:布尔值
      numrice:数值
      string:字符串
      这3种数据类型会在编译的时候自动生成。string将会自动编译成numrice数组。
 3 oo虚拟机垃圾回收 
      运行时oo类实例所需的存储空间由虚拟机统一分配。编译时在一个对象使用完毕后增加一条语句将它插入垃圾堆。垃圾回收采用后台线程的方式运行。一旦发现垃圾堆中有可回收垃圾时候,就对做空间释放操作。这样呢,开发人员就从内存操作的郁闷中解脱出来。
 4 oo虚拟机体系结构
   同JVM一样,每个oo虚拟机有两种机制,一个是装载子系统;另外的一个负责执行包含在已装载的类,叫做执行引擎。
 
4.1 装载子系统
oo运行的时候首先会用装载子系统把程序集文件装载进来。程序集文件里定义好了类的变量,方法。
4.2执行引擎 
执行引擎会根据程序集所定义的类,在实际运行过程中动态创建类的实例RunTimeObject.,每一个RunTimeObject都会有自己的变量集合和方法集合。
5运行过程
namespace System
{
 public external class Console
 {

  public System.void WriteLine(System.string str)
  {
  }

  public System.string ReadLine()
  {
  }
 }
 public external class numeric
 {
 }
 public external class bool
 {
 }
 public external class string
 {
 }
 public external class void
 {
 }
}

namespace Test.Run
{
 import System;
 public class Demo
 {

  public System.void say()
  {
   System.numeric i = 0;
   while( i < 10){
    i = i + 1;
    System.Console.WriteLine("hello world");
    System.Console.WriteLine(i);
   }
   System.string str = "abc";
   System.Console.WriteLine("请输入姓名:");
   str = System.Console.ReadLine();
   System.Console.WriteLine("欢迎你,");
   System.Console.WriteLine(str);
  }
 }
}
我们把上述代码编译后,配置run的config文件。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="RunProgram"  value="test.xml" />
    <add key="MainNameSpace"  value="Test.Run" />
    <add key="MainClass"  value="Demo" />
    <add key="MainMethod"  value="say" />
  </appSettings>
</configuration>
装载子系统系统会把程序集装入载进来。然后调用执行引擎执行。执行引擎首先会初始化类Test.Run.Demo 返一个RunTimeObject,然后查找 say方法运行。

发一个最新的,有兴趣的朋友个下载试一下:
https://files.cnblogs.com/sukyboor/OO_0.000210.rar

原文地址:https://www.cnblogs.com/sukyboor/p/629245.html