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

  • 相关阅读:
    Spring IOC 源码解析
    spring AOP之代理模式
    HashMap的工作原理

    数据结构 (1)----线性表
    php简单的查找当前目录下的非法文件
    Js中Prototype、__proto__、Constructor、Object、Function关系介绍 ,JS原型
    js的变量,变量作用域,作用域链
    JS的类型转换
    sql 的join
  • 原文地址:https://www.cnblogs.com/sukyboor/p/629245.html
Copyright © 2011-2022 走看看