zoukankan      html  css  js  c++  java
  • 转 全面向对象,矩阵操作系统

    在人类的认知世界中,我们总是习惯于把事物按照个体对象来感知和总结,例如,一辆汽车,一座房子,一个人,一棵树等等。同时,一个对象又可以分解成多个小的对象,例如,一辆汽车由发动机,轮胎,方向盘等各种组件组成;再进一步,又可以分解成更加微小的对象,例如,发动机可以分解成若干个小零件构成;更进一步,每个微小的汽车零件,又可以分解成极小的分子、原子组成。这是人类对现实世界的认知模式,我们可以总结如下几个基本概念:

    1、对象,个体是组成客观世界的基本单位。

    2、对象,个体的定义可以宏观,也可以微观,主要根据我们认知的层次需求。

    3、对象之间可能有相互作用和依赖的关系。

    4、对象可能会随着时间的流失,其本身发生变化。

    5、大多数对象存在于有限的空间和时间中。

    6、任何一个对象个体都是唯一的,世界上没有完全相同的两片树叶。

    7、有生命对象,和无生命对象。

    8、…………

    人们已经证实,对象概念符合人类认知的思维习惯,有利于软件开发和应用,传统的面向对象设计语言如c++,java等正被主流与用于各种软件系统的开发。但是目前,这些传统的面向对象程序设计并没有做到完全的面向对象理念。例如:当我们用c++开发应用程序时,在源代码中设计定义类:

    Class classXxx{,,,,,,};

    再根据类去定义对象:

    classXxx  objXxx;

    然后调用对象的函数或访问对象的变量:

    objXxx.Function(,,,);

    xxx = objXxx.Variable;

    源代码是这样写的,它具备面向对象的特性,但是,当编译链接后生成可执行文件(例如.exe)运行起来后,我们不能再看见和接触这个对象objXxx。也就是说,在传统的面向对象程序设计中,我们仅仅只能在源代码开发阶段使用有面向对象特性,一旦源代码被编译链接运行,所有对象的特性完全丢失,这是一种不完全的面向对象软件设计方法,不符合人类的思维习惯,必然会给应用和开发带来诸多的不方便。

    我们下面将要讨论的技术,就是要实现最彻底的面向对象系统,我们暂时称之为:矩阵系统matrix

    matrix是一种完全面向对象化管理的操作系统,其基本概念是:一切皆对象。一个文件,一个程序,一个驱动,都是一个对象个体,从他们的设计、创建开始到编译运行,自始自终都具备对象的一切属性。无论是开发的源代码,还是编译过后产生的二进制体,我们在matrix中所看到的,都是对象模型。举个例:

    当我们设计一个串口驱动程序时,在开发阶段,是这样描述的:(假如这个驱动的名字为objUart)

    Object objUart

    {

    定义对象自身变量:

    ……

    对象接口函数:

    int   GetBaudRate();

    void  SendData();

    …………

    …….

    }

    在编译阶段,编译器以每个对象为基础,编译生成对应的二进制对象实体,objUart.o, (注意:这并不是传统系统中的二进制对象文件),objUart.o拥有一切对象信息,包括自身的数据以及对外公共接口等,以便当这个对象被装载进入matrix系统后,其他装入的对象可以进行访问。

    运行阶段,objUart.o会被装载进入matrix系统内存,其它的应用软件(确切地说应该是其他对象),便可以在matrix系统中直接访问这个串口对象公共接口。

    例如我们接下来开发另一个应用程序对象objA,将要调用上面串口对象接口,

    源代码开发这样写:

    object objA

    {

    ……

    objUart.GetBaudRate();   获得其串口波特率。

    objUart.SendData(,,,);     向串口发送数据。

    ……

    }

    编译生成二进制对象objA.o,然后装载进入matrix系统运行。

    需要注意的是,对象objUart和objA是两个完全独立的对象个体,他们在开发和编译阶段完全可以互不相干,只有在运行时,并且两个对象都已经装载进入matrix系统,才发生相互作用关系。当其中一个对象并不存在时,系统也不会发生崩溃。例如,当objUart对象不在系统时,objA在调用串口对象接口时,会收到一个来自系统的消息,表明串口对象缺席,进而做出相应处理。

    通过上面的实例体验,我们大概了解这种全面向对象程序设计的基本概念,没错,一切皆对象,从设计、编程,编译到装载运行,所有的一切都是基于对象以及互动的概念,我们设计一个软件系统,将主要集中考虑的是各个对象功能,以及对象之间的互动关系,这正好类似于我们现实世界环境,不同的是,现实世界的对象由分子原子组成,而matrix系统里的对象,则是由代码和数据组成。

    Matrix核心是实现这一切技术的基石,下面我们来看看matrix系统的架构。

    如图所示,matrix的核心由下面几部分组成:

    1、基本的多线程、处理机调度内核。 为适应matrix系统设计需求,我们开发了一款名为e-kernel的基本多任务调度内核,有64个任务优先级,其中32个优先级用于实时调度,另外32个优先级用于一般任务调度。E-kernel支持单处理机,对称多处理机、非对称混合多处理机。非对称混合多处理机MMP是matrix系统引进的一种新的概念,基本目的是允许不同类型的处理机共同存在系统中,以满足各种不同的数据处理需要。例如,一个系统中可以有通用处理机,用于一般程序运行,也需要数字信号处理机,用于数学运算,也可为图形专用的处理机等,这些不同类型处理机共同存在于系统中,统一由e-kernel进行管理和调度。需要注明的是,在matrix系统中,我们会以函数为单位,为每一个函数标记一个匹配的处理机类型,以便调度到合适的目标处理机上运行。

    2、基本的存储管理单元。 包括内存管理和外存管理,为对象运行时提供内存空间,也可为对象数据永久存储提供外部磁盘空间。在matrix系统里,各个对象按照一定的层次关系组织起来,当一个对象载入matrix系统后,这个对象就永久的存在于matrix系统中,而不管系统是否掉电上电,或重新启动。由此可见,对象体首先是存在于外部永久存储空间上,然后再根据需要,部分载入内存进行运行。存储管理单元也为对象开发屏蔽了大量细节技术,当我们开发设计一个对象时,根本不再需要考虑内外存访问使用等问题,就可以直接在对象中引用,例如,在对象中定义两个变量Va,Vb:

    object objXxx

    {

    ……

    int Va;           一般程序变量,放在内存,系统掉电、重启将不能保存。

    int saved Vb;     可存储变量,系统掉电、重启将保留当前值。关键字saved表示这个变量放在外存空间。

    ……

    }

    3、对象管理器。 对象管理器是matrix系统对象存在的基础,管理对象的载入、移出,组织对象在matrix系统中的层次关系,以及实现对象之间的互动。

    4、根对象mx。 根对象mx有两个作用,第一,是一切对象载入到matrix系统的基点,类似于传统文件系统里的根目录;第二,为其他对象提供基本的内核服务,例如:我们可以调用mx.CreateThread(,,,,,)来创建一个线程。根对象mx是与matrix核心一起开发并紧密的绑定在一起的。

    5、接入/接出单元。 这是matrix系统对象跟外界交互的基本接口,主要包括:调试接口,本机或交叉调试;操作显示接口,简单的控制台shell,复杂的图形界面操作等,实现人与对象互动;各种网络通信接口,互联网,移动通信网等,方便在各种网络中对象之间互动。

    注意:以上并不是构成matrix系统的必须部分,在一个功能更加简单的matrix系统中,可能只存在一个控制对象和网络通信接口,例如一个网络温度传感器,放在珠穆朗玛峰山顶,我们可以在非常遥远的北京某一matrix系统设备上,方便地获得当前山顶温度,使用下面句法:

    (IP:128.123.113.2)mx .TemSensor . GetTempreture();

    (IP:128.123.113.2)表示这个温度传感器对象所在matrix系统的网络IP接入/接出地址。

    举这样例子或许并无多大实用意义,这里主要是想说明matrix系统的简易方便使用的特性。同理,我们可以再举个例子,获取某辆汽车轮胎气压,语法如下:

    (Cell: 13312345678)mx.MyCar.GetTierPressure();

    (Cell: 13312345678)表示这辆汽车对象是通过移动网接入到matrix系统网络。

    matrix系统的对象模型定义和互动:

    在传统的面向对象基础上,我们扩展了对象结构,定义了一种更加符合人类思维习惯,功能更加强大的对象模型。

    类的定义:

    class className  <类继承列表>

    {

    head:   这个段是对象的基本信息特征之数据结构(有待具体标准化定义)

    private: 这是私有段

    int data;

    protect: 这是受保护的段,跟传统的定义有所区别,这个段的数据外部只能读

    char *ss;

    struct store xxxx;  int const abc;

    public: 这是公共段

    float abc;

    int Function();

    interrupt: 这是中断服务程序挂接段

    INT_16    : status intUartSend(int, void *);

    INT_27    : status intTimer(int void *);

    message: 这是消息函数段

    MX_CLICK : status onClick(int, int, int, int);

    WM_DOUBLECLICK  : status onDoubleClick(int, int, int, int);

    event: 这是响应事件的函数段

    EV_MOVE<parameters>    : status move (int, void *);

    EV_HIT <parameters>      : status Hit(int, void *);

    space: 这是存储空间定义段,定义对象运行所需动态内存空间。

    heap <store=memory, unit=8, total=4096>;

    pool <store=memory, unit=4KB, total=16MB>;

    };

    对象的定义:

    className objName

    {

    和类定义相同,需要重定义的变量,函数,直接在对象中进行重定义,例如,如下重定义内存空间段:

    space: 这是存储空间定义段,定义对象运行所需动态空间。

    heap <store=memory, unit=4, total=8KB>;

    pool <store=memory, unit=2KB, total=32MB>;

    };

    跟传统面向对象不同的是,matrix系统也可以不需要类的支持,直接定义对象:

    object objXxx

    {

    head

    private:

    int Function();

    ………..

    …..

    space:

    };

    定义上面对象的私有成员函数:

    objXxx :: int Function();

    matrix系统可以在运行时刻复制已有的对象:

    object objCopy;                    首先,定义一个空对象。

    objCopy  =  ObjectCopy(objXxx);      复制已有对象到空对象

    objCopy.Function();                   调用复制对象的成员函数。

    matrix对象描述语言,对象编译器,对象处理机,对象接口总线:

    实现matix系统,我们还需要一个基本的工具链,那就是描述matrix对象的一种新型高级语言和他的编译器,这个对象描述语言基于c/c++,并作了相当大的扩展,我们暂时定义为e语言。e语言应该是一个比较灵活的语言,代码设计以对象(或类)为基本单位,及所有的代码都是包含(属于)在某个对象里面的。e语言支持高级语言和低级语言的混合编程、编译。生成的输出结果以每个对象为单位的2进制的对象体,用于装载、连接进入matrix系统。为方便开发,也可以支持多个对象体融入一个对象文件,一次性连接载入matrix系统。

    对象处理机的开发,是为了更加很好的适应matrix对象这种工作模型,主要有两点考虑:对象互动的安全性和对象装载的灵活性。

    matrix系统对象装载可以在任何时刻,任何内存地址,这就要求二进制对象具备可重定位特点。常规的处理机架构下,比如ARM处理机,需要进行动态连接,对象内部所使用的相对地址必须根据载入内存的地址进行变动,这会消耗大量的时间。对象处理机可以解决这一问题,对象处理机有一组基址寄存器,分别用于代码段,数据段,堆栈段,扩展数据段访问,以及对象互动访问。代码、数据的寻址都是基于这些基址寄存器,并有着访问权限,越界检查的功能,可以非常灵活的进行对象重定位,以及相对安全的对象互动。这种技术跟x86系列处理机段寻址结构类似,但相对简单高效,并且在现有的处理机基础上很容易实现。不可否认,就要被遗弃的段访问技术,在matrix系统里将会派上很大用场。

    对象接口总线,前面讲到,对象体二进制文件装载进入matrix系统,成为可运行的一个对象,这是一种对象入住matrix系统的方式,还有另一种方式,那就是通过对象总线的连接进入matrix系统。比如说一个智能家庭的中心控制器,是一个matrix系统,我们可以通过对象总线,把各种按照对象规范设计的家电设备连接到中心控制器,于是就可以通过这个中心控制器,以对象方式访问各种家电设备对象。例如:打开电视机,mx.TV.PowerOn();

    对象运行时连接技术:

    matrix系统中每个对象都是独立的代码、数据空间,对象之间的互动访问必须保证高效率,如下两个对象objA和objB,相互调用对方的公共接口函数实现互动。

    object objA                              object objB

    {                                        {

    objB Function(,,,);                           objA Function(,,,);

    }                                        }

    两个对象独立设计和编译,它们只需要知道对方公共函数的调用方式即可,当两个对象编译后载入到matrix系统时,它们并不知道对方具体存在于什么内存位置,更不可能知道对方的公共函数的地址,同时为了保证效率问题,它们之间也不可能通过系统调用的方式来实现互动,这就需要一种新的技术实现直接对象间调用,我们称之为运行时连接技术,例如:当objA第一次运行到调用objB的函数时,会发送一个对象连接请求信号到matrix核心,matrix核心进行各种权限检查,如果符合要求,就直接把这个函数地址连接到objA内部,当下一次调用该函数时,objA就不必要再次向系统发送请求,直接可以调用这个函数。这就是所谓运行时连接技术,它跟人们之间相互交流,从生疏到熟悉的认识过程非常相识。

    matrix系统的优势:

    一个新颖的系统,可能并不是很容易地列举出来一大堆优点缺点,也许只有往后的运用,才能逐渐的体现其各种优势所在,对创作者来说,往往就是一个不经意的信息,导致整个想法的产生,总结归纳如下几点:

    1、简单、高效的程序设计:完全的对象化,更加符合人类思维习惯的代码设计,让程序设计更加注重对象功能的实现,而不用再去学习复杂的系统方面知识或架构、工具方面等技术。

    2、统一的程序设计:一切皆对象,程序设计就是对象设计,不再像传统系统那样,分为各种各样的软件类型,协议,开发等等。对象之间耦合也是统一的格式,更加方便分工合作开发、以及重复使用其他人的智慧成果。

    3、灵活开放的系统组成:以对象为基础构建的系统,可以根据实际运用需要,增加、裁减、或选择不同的对象个体。

    4、便利的网络互动:以对象为基础网络通信或编程,完全不需要了解各种复杂的网络知识和技术,网络对象之间和本地对象之间的互动通信,除了速度有差别以外,其他完全没有区别。

    5、数字地球:各种仪器仪表互连提供统一标准。

    6、虚拟现实世界。

    matrix是一个巨大的工程:

    1)首先是matrix系统本身的实现,包括matrix 核心,e语言编译器,开发工具等(如果要想获得更好的对象运行性能,对象处理机架构也必须被实现。)

    2)matrix系统各种技术规格、对象规范的定义和文档撰写,需要一个专门组织机构来负责,并且是免费开放的。

    3)矩阵网络的实现,多网合一,各种中间层设备和通信软件,需要各个厂商合作。

    matrix系统开发现状:

    matrix系统思想来自电影《黑客帝国》,作者经过多年的努力,利用业余时间,致力于开发并实现了matrix核心里面的多任务调度e-kernel第一版,接下来会继续开发第二版内核的同时,将定义完备的matrix对象模型和e语言语法。往后的任务会更加艰巨,希望新的力量加入,一起来实现这个有趣的工程。

    联系邮箱:mx65536@gmail.com

  • 相关阅读:
    Java中的集合类-详解
    wargames-Leviathan
    词霸阿涛的英语学习经历
    《小王子》阅读笔记
    linux的mysql密码忘了怎么办
    redis事务实现
    缓存穿透、缓存击穿、缓存雪崩
    单线程redis为什么快?
    redis和么memcached的区别
    如何解决缓存污染
  • 原文地址:https://www.cnblogs.com/Chrome/p/2383387.html
Copyright © 2011-2022 走看看