Javascript多线程引擎(四)
Javascript多线程引擎(四)--之C语言单继承
因为使用C语言做为开发语言, 而C语言在类的支持方面几乎为零, 而Javascript语言的Object类型是一个非常明显的类支持对象,所以这里需要提出一个方案对Object类型的继承进行支持.
本章节介绍一个简单的基于C语言单继承结构的实现, 实现非常的简单, 但是体现了Java 的OO思想.
////Object.h
#ifndef _Object_
#define _Object_
/*******************
cls:
类似于Java的接口, 子类想对某个函数进行重载 ,
则只要在具体同名函数的位置替换掉原先的指针 .
而子类想访问被覆盖掉的父类同名函数, 则直接访问
父类的函数指针.
而私有函数, 则都在.c 文件中
pb:
公共数据结构, 数据结构在.h中
通过指针来访问自己的和父对象的公用数据
((struct Pb*)pb[0])->size ; 访问了跟对象的public block的size
sb:
私有的数据成员, 数据结构在.c中, 非本对象不可操作
((struct Sb*)sb[0])->size
FLOOR:
该对象处于继承链的第几个位置, Root 为 0
注: pb 和 sb的 数据槽 都由new Object的对象来申请空间
初始化的方向为先初始化父类
析构方向为先析构子类
********************/
struct Object;
//接口操作
typedef void (*PrintFn)(struct Object* self);
#define OBJECT_FLOOR 0
struct Class{
PrintFn p;
};
//公布的操作
struct Pb{
int size;
};
struct Object{
struct Class* cls;
void** pb;
void** sb;
};
void ObjectPrint(struct Object* self);
//申请基本的空间
//构建一个基本的空间, floor为子类所在的层, 根为第0层
struct Object* AllocObject(int floor);
//初始化对象
//如果o == NULL, 则Alloc一个空间
struct Object* CreateObject(struct Object* o);
#endif
通过Cls公布类似java接口操作, 而pb 和 sb 分别为公布数据结构和私有数据结构, 并且私有函数都写在 .c 文件中.
//Object.c
#include<stdlib.h>
#include<stdio.h>
#include"Object.h" struct Sb{
int num;
};
void ObjectPrint(struct Object* self){
struct Pb* p;
struct Sb* s;
p = (struct Pb*)self->pb[OBJECT_FLOOR];
s = (struct Sb*)self->sb[OBJECT_FLOOR];
printf("root Object Pb: %d\n root Object Sb: %d\n", p->size,s->num);
}
//申请基本的空间
//构建一个基本的空间, floor为子类所在的层, 根为第0层
struct Object* AllocObject(int floor){
if(floor <= ){
//error
}
floor ++;
struct Object* o;
o = (struct Object*)malloc(sizeof(struct Object));
o->cls = (struct Class* )malloc(sizeof(struct Class));
//数据槽
o->pb = (void**) malloc(sizeof(void*) * floor );
o->sb = (void**) malloc(sizeof(void*) * floor );
} //初始化对象
//如果o == NULL, 则Alloc一个空间
struct Object* CreateObject(struct Object* o){
if(o == NULL)
o = AllocObject(OBJECT_FLOOR);
//初始化pb数据块
o->pb[OBJECT_FLOOR] = (struct Pb*)malloc(sizeof(struct Pb));
//初始化sb数据块
o->sb[OBJECT_FLOOR] = (struct Sb*)malloc(sizeof(struct Sb));
o->cls->p = &ObjectPrint;
((struct Pb*)o->pb[OBJECT_FLOOR])->size = ;
((struct Sb*)o->sb[OBJECT_FLOOR])->num = ;
return o;
}
私有数据结构实现在.c 中, 私有函数也实现在.c 中
而下面就是一个简单的Object2.h 对象
///Object2.h
#ifndef _Object2_
#define _Object2_
#define OBJECT2_FLOOR 1
#include"Object.h"
//新子类的共享数据
struct Pb2{
int size;
};
void ObjectPrint2(struct Object* self);
struct Object* CreateObject2(struct Object* o);
#endif
Object2.h 实现了自己的数据结构 和公布了一个多态函数
///Object2.c
#include"Object.h"
#include"Object2.h"
#include<stdio.h>
#include<stdlib.h>
void ObjectPrint2(struct Object* self){
struct Pb2* p = (struct Pb2*)self->pb[];
printf("Object2 : %d \n",p->size);
ObjectPrint(self);
}
struct Object* CreateObject2(struct Object* o){
if(o == NULL)
//处于继承链第一个位置
o = AllocObject(OBJECT2_FLOOR);
//初始化父对象
CreateObject(o);
//初始化pb数据块
o->pb[OBJECT2_FLOOR] = malloc(sizeof(struct Pb2));
//初始化sb数据块
o->sb[OBJECT2_FLOOR] = NULL;
//重载
o->cls->p = &ObjectPrint2;
((struct Pb2*)o->pb[OBJECT2_FLOOR])->size =;
return o;
}
在第9行 , 调用了父类的该同名函数.
以下是一个基本的测试:
////main.c
#include"Object2.h"
#include<stdlib.h>
int main(){
struct Object* o = CreateObject2(NULL);
o->cls->p(o);
}
编译命令:
gcc -c Object.c
gcc -c Object2.c
gcc -c main.c Obejct.o Object2.o
./a.out

测试成功!
通过pb 的连续内存块, 在继承结构中, 对象只能看到它自己和父对象的内存结构, 而不能发现该对象的子对象内存结构, 而父对象则照常使用属于他自己的内存空间, 从而实现了信息隐藏.
并且每个对象的访问数据和操作都是统一的(主要是父对象):
1. 子对象指针和父对象指针都可以通过pb数据块进行操作自己的数据(从共享内存中找到自己的内存地址)
2. 子对象和父对象指针访问API都指向正确的实现(可以访问重载函数)
3. 私有数据都是从sb数据块获取
C语言的继承和多态主要的核心是内存结构和CPU访问数据和函数的方式(参考C++对象继承内存模型), 或者采用动态语言的机制进行查询访问.
源代码:
http://files.cnblogs.com/tickobject/src.zip
项目代码地址:
github.com/darkgem/js-engine
Javascript多线程引擎(四)的更多相关文章
- Javascript多线程引擎(七)
Javascript多线程引擎(七)--synchronized关键字 经过两天的努力, 今天synchronzied关键字终于支持了, 如下是测试代码 thread() 是一个开启新线程的API, ...
- Javascript多线程引擎(十)---Web服务器
Javascript多线程引擎(十)---Web服务器 经过一天的努力, 引擎可以支持web服务的功能了并且支持UTF-8的编码, 具有对HTTP参数的解析,状态码的配置, 响应报文的输出等. 提供 ...
- Javascript多线程引擎(九)
Javascript多线程引擎(九)--垃圾回收 垃圾回收这个话题对Programer来说是非常老旧的话题, 从手动的malloc/free 到半自动的 引用计数 再到全自动的 mark-sweep ...
- Javascript多线程引擎(八)
Javascript多线程引擎(八) Javascript 多线程项目, 做到现在已经快3个月了(加上前期准备编译原理和必要的文档), 该项目(js-engine)已经快进入尾声了, 现在该引擎 ...
- Javascript多线程引擎(六)
Javascript多线程引擎(六) 经过三个月的时间, Javascript 引擎已经完成beta版本(还不支持多线程特性, 预计下个星期就可以支持了, 现阶段还在进行测试基本JS单元功能), 并且 ...
- Javascript多线程引擎(五)
Javascript多线程引擎(五)之异常处理 C语言没有提供一个像Java一样的异常处理机制, 这就带来了一个问题, 对于一个子函数中发生异常后, 需要在父函数调用子函数的位置进行Check, 如果 ...
- Javascript多线程引擎(三)
Javascript多线程引擎(三) 完成对ECMAScript-262 3rd规范的阅读后, 列出了如下的限制条件 1. 去除正则表达式( 语法识别先不编写) 2. 去除对Function Decl ...
- Javascript多线程引擎(一)
Javascript多线程引擎(一) Javascript 天生是单线程的语言, 不支持synchronized等线程操作, 但是这便不妨碍Javascript作为web语言中最具有魅力语言之一. 虽 ...
- Javascript多线程引擎(二)
多线程Javascript解释器的大致架构 由于一个完整的解释器类似Google V8的解释器需要的工作量非常的大如需要实现如下的模块: 词法分析,语法分析器,AST转Byte模块,解释执行模块和JI ...
随机推荐
- SharePoint 2010 升级到2013时间 为了确保用户可以连接,但无法改变升级数据
SharePoint 2010 升级到2013时间 为了确保用户可以连接,但无法改变升级数据 我总结的步骤 红色请注意它们的含义. 步骤1:连接到SQL DBS 上的SharePoint 2010数据 ...
- TFS 2010 使安装更容易,让VSS历史
一转眼VS 2010 RC(Release Candidate)版本号已经公布一月多了,RTM(Release To Manufacturer)版本号也快妥了,已经进入了最后的倒计时,仅仅等4月12号 ...
- android 环境使用smack 必须注冊的组件
// Private Data Storage pm.addIQProvider("query", "jabber:iq:private",new Privat ...
- 学习日记之单例模式和Effective C++
单例模式(Singleton):保证一个类仅有一个实例,并提供一个訪问它的全局訪问点. (1),通常我们能够让一个全局变量使得一个对象被訪问,但它不能防止你实例化多个对象.一个最好的办法就是,让类自身 ...
- JS通用方法扩展
/* * 系统中JS的扩展函数 * * */ // 清除两边的空格 String.prototype.trim = function() { returnthis.replace(/(^\s*)|(\ ...
- Controller和View的交互
Controller和View的交互 目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI ...
- 通过SMTP协议来发送邮件
简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是事实上的在Internet传输email的标准. SMTP是一个相对简单的基于文本的协议.在其之上指定了 ...
- javascript系列之核心知识点(一)
JavaScript. The core. 1.对象 2.原型链 3.构造函数 4.执行上下文堆栈 5.执行上下文 6.变量对象 7.活动对象 8.作用域链 9.闭包 10.this值 11.总结 这 ...
- CSharp设计模式读书笔记(20):观察者模式(学习难度:★★★☆☆,使用频率:★★★★★)
观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式的别名包括发布-订阅(Publish/ ...
- 我在Github上的flare-spark项目
Flare-Spark 介绍 我在自己的github上建了个flare-spark项目,本身是Apache Spark项目Master分支的镜像.在Spark的基础上,添加了flare子项目. 估计大 ...