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 ...
随机推荐
- ZOJ3822 ACM-ICPC 2014 亚洲杯赛事现场牡丹江司D称号Domination 可能性DP
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- HttpClient模拟客户端请求实例
HttpClient Get请求: /// <summary> /// Get请求模拟 /// </summary> /// < ...
- Tomcat剖析(五):Tomcat 容器
Tomcat剖析(五):Tomcat 容器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器(1 ...
- Asp.net MVC + EF + Spring.Net 项目实践3
Asp.net MVC + EF + Spring.Net 项目实践 这一篇要整合Model层和Repository层,提供一个统一的操作entity的接口层,代码下载地址(博客园上传不了10M以上的 ...
- Socket 学习(二)
1对1的发送和接收 Client 端 void ThreadReceive() { try { ...
- JS正则替换字符串
1.只替换第一次出现的字符: text.replace(/javascript/i, "JavaScript"); //正则用//来将正则包起来 i表示区分大小写 2.全局替换: ...
- ftk学习记录(IME文章)
[声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面说的是全屏设置,还是请大家看一下效果图. watermark/2/text/aHR0cDovL ...
- Linux 查看和删除进程
1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab).2. ps ...
- IOS开发中怎样验证邮箱的合法性
IOS开发中怎样验证邮箱的合法性 文章参考:http://www.codes51.com/article/detail_94157.html 代码: - (void)viewDidLoad { [su ...
- C语言第12轮:指针
C语言第12轮:指针 [学习目标] 1. 指针 2. 指针与数组 A: 指针的概念 内存存储单元按字节排序.每一个字节编有序号.我们称之为地址.因为能够通过地址就能够找到所 ...