zoukankan      html  css  js  c++  java
  • 一步一步打造自己的编译器 之虚拟机

                                                    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

  • 相关阅读:
    自然语言交流系统 phxnet团队 创新实训 项目博客 (十一)
    install ubuntu on Android mobile phone
    Mac OS, Mac OSX 与Darwin
    About darwin OS
    自然语言交流系统 phxnet团队 创新实训 项目博客 (十)
    Linux下编译安装qemu和libvirt
    libvirt(virsh命令总结)
    深入浅出 kvm qemu libvirt
    自然语言交流系统 phxnet团队 创新实训 项目博客 (九)
    自然语言交流系统 phxnet团队 创新实训 项目博客 (八)
  • 原文地址:https://www.cnblogs.com/sukyboor/p/629245.html
Copyright © 2011-2022 走看看