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
百足之虫,死而不僵