Javascript多线程引擎(四)

时间:2021-08-18 09:54:41

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

Javascript多线程引擎(四)

测试成功!

  通过pb 的连续内存块, 在继承结构中, 对象只能看到它自己和父对象的内存结构, 而不能发现该对象的子对象内存结构, 而父对象则照常使用属于他自己的内存空间, 从而实现了信息隐藏.

并且每个对象的访问数据和操作都是统一的(主要是父对象):

1. 子对象指针和父对象指针都可以通过pb数据块进行操作自己的数据(从共享内存中找到自己的内存地址)

2. 子对象和父对象指针访问API都指向正确的实现(可以访问重载函数)

3. 私有数据都是从sb数据块获取

  C语言的继承和多态主要的核心是内存结构和CPU访问数据和函数的方式(参考C++对象继承内存模型), 或者采用动态语言的机制进行查询访问.

源代码:

  http://files.cnblogs.com/tickobject/src.zip

项目代码地址:

github.com/darkgem/js-engine

Javascript多线程引擎(四)的更多相关文章

  1. Javascript多线程引擎&lpar;七&rpar;

    Javascript多线程引擎(七)--synchronized关键字 经过两天的努力, 今天synchronzied关键字终于支持了, 如下是测试代码 thread() 是一个开启新线程的API, ...

  2. Javascript多线程引擎&lpar;十&rpar;---Web服务器

     Javascript多线程引擎(十)---Web服务器 经过一天的努力, 引擎可以支持web服务的功能了并且支持UTF-8的编码, 具有对HTTP参数的解析,状态码的配置, 响应报文的输出等. 提供 ...

  3. Javascript多线程引擎&lpar;九&rpar;

    Javascript多线程引擎(九)--垃圾回收 垃圾回收这个话题对Programer来说是非常老旧的话题, 从手动的malloc/free 到半自动的 引用计数 再到全自动的 mark-sweep ...

  4. Javascript多线程引擎&lpar;八&rpar;

    Javascript多线程引擎(八)    Javascript 多线程项目, 做到现在已经快3个月了(加上前期准备编译原理和必要的文档), 该项目(js-engine)已经快进入尾声了, 现在该引擎 ...

  5. Javascript多线程引擎&lpar;六&rpar;

    Javascript多线程引擎(六) 经过三个月的时间, Javascript 引擎已经完成beta版本(还不支持多线程特性, 预计下个星期就可以支持了, 现阶段还在进行测试基本JS单元功能), 并且 ...

  6. Javascript多线程引擎&lpar;五&rpar;

    Javascript多线程引擎(五)之异常处理 C语言没有提供一个像Java一样的异常处理机制, 这就带来了一个问题, 对于一个子函数中发生异常后, 需要在父函数调用子函数的位置进行Check, 如果 ...

  7. Javascript多线程引擎&lpar;三&rpar;

    Javascript多线程引擎(三) 完成对ECMAScript-262 3rd规范的阅读后, 列出了如下的限制条件 1. 去除正则表达式( 语法识别先不编写) 2. 去除对Function Decl ...

  8. Javascript多线程引擎&lpar;一&rpar;

    Javascript多线程引擎(一) Javascript 天生是单线程的语言, 不支持synchronized等线程操作, 但是这便不妨碍Javascript作为web语言中最具有魅力语言之一. 虽 ...

  9. Javascript多线程引擎&lpar;二&rpar;

    多线程Javascript解释器的大致架构 由于一个完整的解释器类似Google V8的解释器需要的工作量非常的大如需要实现如下的模块: 词法分析,语法分析器,AST转Byte模块,解释执行模块和JI ...

随机推荐

  1. javascript中重要概念-闭包-深入理解

    在上次的分享中javascript--函数参数与闭包--详解,对闭包的解释不够深入.本人经过一段时间的学习,对闭包的概念又有了新的理解.于是便把学习的过程整理成文章,一是为了加深自己闭包的理解,二是给 ...

  2. Greenplum源码编译安装(单机及集群模式)完全攻略

    公司有个项目需要安装greenplum数据库,让我这个gp小白很是受伤,在网上各种搜,结果找到的都是TMD坑货帖子,但是经过4日苦战,总算是把greenplum的安装弄了个明白,单机及集群模式都部署成 ...

  3. 递推DP URAL 1119 Metro

    题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好 ...

  4. java获取获得Timestamp类型的当前系统时间

    java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...

  5. &lbrack;HDOJ1043&rsqb;Eight(康托展开 BFS 打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 八数码问题,因为固定了位置所以以目标位置开始搜索,把所有情况(相当于一个排列)都记录下来,用康托 ...

  6. CString——Left、Right、Find、ReverseFind

    CString--Left.Right.Find.ReverseFind http://hi.baidu.com/shawmar/item/08b30afb0f32d46f3c1485ec CStri ...

  7. &lbrack;转载&rsqb;&lbrack;NAS&rsqb; 使用win8的&OpenCurlyDoubleQuote;存储池”功能~

    之前自己用DQ77KB搭建一个小存储系统(帖子链接:http://www.chiphell.com/thread-567753-1-1.html),一直使用intel主板带的软RAID功能构建RAID ...

  8. C&sol;C&plus;&plus; 语言中的表达式求值&lpar;原文作者:裘宗燕&rpar;

    经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...

  9. 2019工作计划idea

    2019.2.24 工作需求: 汇总 2008-2018年 销售订单数据; 分类历史订单数据, 并可能采取方法进行预测(预测只是一种行为不代表结果) 目前已知条件: 订单生产周期; 45天(标准天数) ...

  10. Beta 冲刺(4&sol;7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(4/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 ppt模板 接下来的计划 做好机动. ...