QoBean是从元语言系统开始构建整个语言系统的,从本文开始,我开始讲述QoBean所理解的元语言。不过,不同的人、从不同的侧面所理解的“元语言”是不一样的,不必求同。

“QoBean的元语言系统”包括三篇,分别是:
  -元语言系统基础,以及程序的基础元素
  -元语言下的编程基本方法
  -元语言的应用:虚拟执行环境

QoBean的SVN地址:
https://qomo.svn.sourceforge.net/svnroot/qomo/qobean

//------------------------------------------------------------------------
// QoBean - Qomo's beans
//
// documents group(chs) - Aimingoo, Zhe
//------------------------------------------------------------------------

一、什么是元语言(Meta Language)
---------------------
“元(meta)”这个词到了中文里头,就非常难于说清楚。就好象当年蹦出来个“超类(super classes)”
就糊涂了一群人一样,“元类(meta classes)”以及类似的“meta xxx”也让人开心不起来。

有两个角度来看这个问题。一个是站在既有的知识上,例如你懂得了“类”,然后我就告诉你“所谓元
类,就是比类更高一级的、能产生类的类”。这种解释方法下,所谓“元语言”,就是“能产生语言的
一种语言”。

这第一种解释方法并没有错,例如最新的ECMAScript Ed4(也就是JavaScript 2)就是用元语言来定义
的。具体来说,ECMAScript Ed4规范就是用一种名为Ocaml的元语言来描述,该描述文档自身也就是一
份代码,可以被直接“编译”成为一种真实的、可直接使用的JavaScript 2的语言引擎。所以相对于JS2,
Ocaml就是一种元语言——当然,Ocaml是一种通用性元语言,不只是能“定义和生成”ECMAScript Ed4
那么简单。

第二种解释方法,则是站在纵深处,从一个领域的核心、本质出发进行说明。例如说,程序的本质是“算
法+数据结构”,所以对任意程序来说,所谓“元”,就是Algorithms和Data Structures,具体实现上,
在函数式语言中,Algorithms被统一成为Function;在面向对象语言中,数据结构被统一成Object。这些
所谓的“统一”,其实都不过是在两种元语言的“原子类型抽象”上的泛化或概括。

这又说得复杂了,什么是“原子类型抽象”呢?我杜撰了这个词,我希望说明,可能“数据类型”不是字
节、双字节这样的面向机器结构的,也不是“对象”、“类”这样面向抽象系统的。“数据类型”仅只是
“算法”所面对的“目标”。当数据是x时,算法就是那个f(x);当数据是m时,f()就不适用了,得是T(m)。
再反过来,当算法是Z()时,数据还会是x或m吗?不是。所以,数据与算法是伴生的,不同的算法、不同
的数据之间有机地结合时,才是好的程序。

所以第二种解释方法也是对的。我们可以说物质的“元”是分子、原子等等,也可以说物质的“元”是能
量。用这种方法来解释时,没有第一种解释法那样的“参考对象”,所以它的有效性或概念都取决于解释
者的“角度”,不同的角度有不同的说法,失去了“角度”的解释就没有意义——既不是对,也不是错。

那么QoBean如何定义“元语言”呢?QoBean对此有两项解释:
  - 元语言定义程序(program)的基础元素:算法与数据结构
  - 元语言说明编程(programming)的基本方法:代码的组织形式

二、QoBean中的基本系统约定
---------------------
  1. 数据类型
  ---------------------
基于JS的基本观念,QoBean提出(运算性的)值数据,和引用数据两类。引用数据仅有“对象”一种,从
数据的角度上来说,函数也是一类“对象”。值数据包括三种基本数据:数值、字符串和布尔值,和一种
特定的、表达无数据的数据:undefined。

对象具有双重性,作为对象时,它是关联数组。所谓关联数组,即是如下形式的表:

 tbl = {
name: 'table',
x: 100,
y: 100
}

对象可以描述一个一般形式的索引数组,形式如下:

 tbl = {
0: 100,
1: 100,
2: 100,
length: 3
}

或以直接量形式描述一个索引数组(普通含义上的JavaScript数组),也是一个对象,或对象的子类:

 tbl = [100, 100, 100];

2. 执行体
  ---------------------
QoBean在元语言级别上,所能理解的执行体只有“函数”。

函数作为执行体时,可以通过new运行“产生”数据——对象。其形式如下:
tbl = new f()

函数自身也可以产生函数:
foo = f();

foo = new f;

foo = new f();
上述三种形式在具体使用和f()的实现上略有不同。

函数具有双重性。当它作为执行体时——例如f(),表明执行函数;当它作为数据体时——例如f,表明
它是一个对象。二者的区别在于一个执行运算符“()”。

QoBean的元语言系统不理解其它的JavaScript语言元素,例如不理解语句,也不理解变量声明。但是理
解由上述“类型系统、执行体”延伸出来的概念,例如由函数延伸出来的闭包概念。

3. 动态执行能力
  ---------------------
QoBean要求基本系统具有动态执行能力,也就是动态分析(parse)和执行(execture)由基本语法特性(上
述“基本数据”和“执行体”)组成的代码文本的能力。在JavaScript中,也就是eval()这个方法。

由于QoBean理解函数中的闭包,因此也要求eval()理解这一特性。具体来说,QoBean要求:当eval()在
一个闭包中执行上述代码文本时,代码文本产生的闭包位于当前闭包链的未端。这里的闭包,包括JS中
的对象闭包与函数闭包两种。这意味着下面的代码,可能在打开的X对象的“对象闭包”的后面追加一
个新的闭包——这里的“可能”是指:这取决于eval()代码文本的内容:

with (X) eval(_CODE_CONTEXT);

4. 其它
  ---------------------
基本上来说,上面约定了JavaScript语言特性的一个非常小的集合。这个集合不包括Date、RegExp之类
的工具对象,也不包括语句或变量这些语法概念——不过QoBean理解“标识符”,没有标识符,元系统
是组建不起来的。

在这个最小的语言特性集合上,QoBean开始构建自己的语言系统——这也意味着,只需要拥有这些最小、
最简的语言特性,其它语言或其它的JavaScript实现版本、子集等,也可以按照同样的方式构建同等能
力的语言系统。这也就是“元语言”最诱人的地方。

三、元系统
---------------------
  0、QoBean的元语言系统基本的编程结构
  ---------------------
包括:

  function Atom(atom) { }
function Meta(func, baseMeta) { }
function Unique(f) { }
MetaObject = Function;
MetaClass = Function;

1. 原子-元函数、元数据、元继承关系
  ---------------------
所谓“元数据”,就是独立的、独一无二的一个数据体。简单的说,你可以“元化(使之变成元)”一
个数据,该过程通过Atom()来实现:

function Atom(atom) {
return atom || {};
}
// sample
tbl = {};
tbl = Atom(tbl);

我们可以通过函数来实现自身的元函数,也就是产生函数执行体(而不是对象数据)的函数,例如:

function Func() {
return Function.apply(this, arguments)
}
// sample
f = new Func();
alert(typeof f);

元继承关系通过Meta()和属性meta来实现,例如:

function Meta(func, baseMeta) {
func.meta = baseMeta || arguments.callee;
return func;
}
// sample:meta is meta for self.
Meta = Meta(Meta);

2. 友元
  ---------------------
表面上看,Atom()看起来象是一个多余的实现。但它是实现友元的一个非常好的途径。所谓友元,是
元A跟元B之间执有一种私有关系,二者之间可以互访数据。在QoBean的机制里,这通过Atom()来实现。
例如:

f1 = f2 = Atom();
f1 = function(atom) {
var data = {  ... };
return function() {
if (arguments[0] === atom) {
return data;
}
// ...
}
}(f1);
f2 = function(atom) {
var data;
return function() {
if (data === undefined) {
data = f1(atom);
}
// ...
}
}(f2);

在上述系统中,f1与f2之间都执有一个相互识别的凭证——一个通过Atom()得到的友元原子。通过该
凭证,f1可以向f2提供私有数据(反之也成立)。除此之外,系统之外的其它函数/对象都无法得到f1
中的数据。

3. 类系统
  ---------------------
元对象与元类是在元函数上的两个扩展。基本上来说,声明了一种“对象系统”的组织方式:类继承
模式。这种关系是可以识别的,例如obj是MyObject的一个实例、obj也同时是Object的一个实例。

function MyObject() {
}
// class register
Class(, 'MyObject');
// sample
obj = new MyObject();
alert(obj instanceof MyObject);

在元系统中,并没有对类系统做任何实现。实现的代码在Class.js中。

4. 类类型系统
  ---------------------
你可以在Class()做类注册时得到一个类类型(你也可以忽略它)。类类型是一种“类系统”的组织方
式。类系统中也可以进行继承关系的识别,例如TMyObject继承自TObject。QoBean约定的规则为:

function MyObject() {
}
TMyObject = Class(, 'MyObject');
// sample
obj = TMyObject.Create();
alert(...)

在元系统中,并没有对类类系统做任何实现。实现的代码在Class.js中。

5. 唯一化
  ---------------------
你可以用Unique()函数唯一化一个对象,唯一化的好处是新对象与旧对象完全一样,但是修改新的对象
时,旧的对象不会同时被修改。举例来说:

obj = {
data: 100
}
obj1 = obj;
obj2 = Unique(obj);
// init, same.
alert([obj1.data, obj2.data]);
// change the reference, the uniqued object was fixed.
obj1.data = 200;
alert([obj1.data, obj2.data]);
// change the niqued object, the ,no change.
obj2.data = 300;
alert([obj1.data, obj2.data]);

QoBean的元语言系统(一)相关推荐

  1. 前端要给力之:代码可以有多烂?

    1.烂代码是怎么定义的? !KissyUI是淘宝Kissy这个前端项目的一个群,龙藏同学在看完我在公司内网的"读烂代码系列"之后就在群里问呵:烂代码是怎么定义的? 是呵,到底什么才 ...

  2. c语言parse是什么意思英语,parse是什么意思_parse在线翻译_读音_用法_例句_含义-查字典网...

    1 . 解析 ...进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令).处理器作用是通过代入预定义等程序段将源程序补充完整.前端前端主要负责解析(parse)输入的源 ...

  3. linux系统中不存在 基本文件类型,Linux系统中不存在以下哪个基本文件类型( )

    [判断题]员工在工作不满意时会采取何种行为,主要受外界环境的影响. [单选题] [单选题]管理的本质是 ______ . [判断题]执行给药原则中,首要的是严格执行查对制度 [单选题]已知两点 ,则过 ...

  4. mes系统 mysql 开发_MES系统集成方式

    目前,MES系统之间实现数据集成的方法主要有中间文件转换,数据复制.数据聚合.API 接口.XML .数据集成平台等多种几种方式: 1)中间文件转换 将数据从源数据库中导出,形成一个中间文件,然后将这 ...

  5. 连入网络的所有计算机都必须使用,[判断题] 联入网络的所有计算机都必须使用同样的操作系统。...

    [判断题] 联入网络的所有计算机都必须使用同样的操作系统. 更多相关问题 [单选题]"近朱者赤,近墨者黑.".孟母三迁的故事说明( )对儿童的影响 [判断题]CPU不用必须支持硬件 ...

  6. 工赋开发者社区 | MES/MOM系统的几种主流系统集成方式

    MES系统集成方式主要有API函数调用.基于中间件技术以及基于XML的信息集成等,这些集成方式主要适用于MES与其他软件系统的集成.       一.封装调用集成模式  封装就是指对象的属性和操作方法 ...

  7. 【信息检索】信息检索系统实现

    实验内容与任务 数据爬虫 倒排索引的构建 布尔模型倒排索引构建 布尔运算实现 权值计算 权值计算 权值排序 支持bool查询及四种模型的自然语言检索 RSV计算 一元混合语言模型MLE和二元混合语言模 ...

  8. 为论文《xml数据库在移动系统中应用研究》所做的文献综述报告

    数据库技术在信息管理当中的地位不言而喻,它已经成为先进信息技术的重要组成部分,是现代计算机信息系统和计算机应用系统的基础和核心.数据库技术最初产生于20世纪60年代中期,根据数据模型的发展,可以划分为 ...

  9. 软件智能:aaas系统中AI众生的“世”和“界” 之9 一个主题(神经系统)及其两条线索

    昨天的"神经系统的假设"篇中对应三种计算复杂度的神经网络是aaas系统提出的AI原型,同时也是aaas系统提案的软件智能.神经网络是aaas的主体(实现目的),AI是aaas的主题 ...

  10. 系统遇到并发瓶颈时的优化方向

    1. 设计高质量代码优化Map 使用读写锁,读写锁 读多写少(存储用户连接信息) map不要太大. 2. 突破系统瓶颈 优化连接数 linux下的系统最大连接数 3. 降低对Cpu资源的使用 降低io ...

最新文章

  1. TortoiseGit入门(图文教程) Git,Github,puttygen,SSH
  2. Load-time relocation of shared libraries
  3. rails 放在 apache一个目录下面的配置方法
  4. Facebook 的大牛组长什么样?
  5. java学生成绩管理系统
  6. java common-lang_commons-lang.jar下载
  7. 5 步教你将 MRS 数据导入 DWS
  8. windows server 2008安装配置FTP服务器
  9. matlab的fprintf写不进文件,fprintf写不进文件
  10. yarn : 无法加载文件 C:\Users\L\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本
  11. 易飞erp系统服务器怎么启动,如何使用易飞ERP系统
  12. VS2013 如何创建应用程序图标
  13. Invalid Host/Origin header vue项目
  14. 专访 | 快手王仲远:技术创业不要拿着锤子找钉子
  15. php相册排版,照片拼图在线制作 自带多种照片拼图模板,自由排版将多张照片合成一张...
  16. Laravel OAuth2 (三) ---使用 services 和 facades
  17. mysql=mariadb
  18. could only be written to 0 of the 1 minReplication nodes. There are 0 datanode(s) running and 0 node
  19. 模式对象和用户权限管理
  20. 设计图形抽象类java_Java基础——抽象类

热门文章

  1. 高通modem启动过程_「msm8953」高通8953启动流程 - seo实验室
  2. 监听pda扫描_uniapp App监听PDA扫描工具数据
  3. win7触摸板怎么关闭_笔记本触控板怎么关闭 笔记本触控板关闭方法【详解】
  4. 使用pandas的dataframe清理excel里面空值
  5. php 依赖倒置原则,PHP:依赖注入,控制反转,依赖倒置原则
  6. 如何使用PTPX预估芯片功耗
  7. PostgreSQL 基于heap表引擎的事务 实现原理
  8. 计算机游戏屏幕中,电脑屏幕上的游戏怎么录制
  9. 快狗打车上市:市值超130亿港元 姚劲波与陈小华收获IPO
  10. python—wordcloud库绘制词云