`
javasee
  • 浏览: 996952 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

QoBean的元语言系统(一)

阅读更多
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(<baseclass>, 'MyObject');

// sample
obj = new MyObject();
alert(obj instanceof MyObject);
<pre></pre></baseclass>
在元系统中,并没有对类系统做任何实现。实现的代码在Class.js中。

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

function MyObject() {
}
TMyObject = Class(<baseclass>, 'MyObject');

// sample
obj = TMyObject.Create();
alert(...)<pre></pre></baseclass>

在元系统中,并没有对类类系统做任何实现。实现的代码在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 <obj>,<obj1> no change.
obj2.data = 300;
alert([obj1.data, obj2.data]);
<pre></pre></obj1></obj>

分享到:
评论

相关推荐

    ELAB2.0系统有限元语言介绍及理念

    元计算技术人员为大家介绍ELAB2.0系统有限元语言介绍及理念

    Android切换系统语言

    本文将深入探讨如何实现“Android切换系统语言”这一特性,并提供一个简单的示例项目——SetlanguageDemo。 首先,理解Android系统语言切换的基本原理。Android系统通过资源的配置文件(res/values/strings.xml等)...

    为linux系统设计一个简单的二级文件系统

    通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 实验要求: 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条); login 用户登陆 ...

    操作系统课程设计——Linux二级文件系统设计

    使用文件来模拟外存,进行数据结构设计和操作算法的设计,实现一个文件系统并实现基本的文件操作(为了简便文件系统,不考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容)。要求: 1、对程序的每一部分...

    VB.NET实现多语言(根据操作系统自动选择语言)系统

    VB.NET实现多语言(根据操作系统自动选择语言)系统,可以实现中文,日文,英文界面,实现了多界面操作。 非常好用,曾在工作中遇到该问题,查了很多,都不全面,后来,总算是找到了。分享给大家。具体可以查看我的...

    南京邮电大学数据库系统实验报告一(SQL语言)

    南京邮电大学数据库系统实验报告一(SQL语言) 本实验报告旨在让学生熟悉 Oracle 的 SQL * Plus 环境及使用方法,掌握 SQL 语言,能熟练运用 SQL 语言进行数据定义和数据操纵,并加深对关系数据模型的数据结构和...

    Android开机向导设置系统语言,WiFi向导

    这个过程通常在设备首次启动或恢复出厂设置后出现,包括设置系统语言、连接WiFi网络等一系列初始化操作。本篇文章将深入探讨Android开机向导的设置系统语言和WiFi向导这两个核心环节。 一、设置系统语言 1. **语言...

    基于uml的网上订餐系统

    《基于UML的网上订餐系统》是一款利用统一建模语言(Unified Modeling Language,简称UML)进行设计和开发的在线餐饮预订平台。本系统旨在为用户提供便捷、高效的订餐服务,同时也为餐厅提供智能化的订单管理解决...

    基于UML 的小区物业管理系统

    UML是统一建模语言(Unified Modeling Language),是一种软件设计语言,可以用来描述软件系统的模型和架构。UML提供了一种标准化的方式来描述软件系统的结构和行为。 2. 面向对象设计 面向对象设计是一种软件设计...

    王能斌-数据库系统原理课件

    数据库系统是一个集合了相关数据的集合,包括一组程序来访问数据、一组应用程序和一组管理员来管理它。数据库系统的主要组件包括数据库(DB)、数据库管理系统(DBMS)和应用程序。数据库管理员(DBA)负责管理和...

    人工智能语言PROLOG 专家系统原理与设计

    综上所述,PROLOG作为人工智能语言,结合专家系统原理,提供了一种强大的工具来处理复杂问题。其逻辑基础和反向链推导机制使其在知识表示、推理和决策支持方面具有显著优势。通过深入理解PROLOG,开发者可以创建能够...

    从单片机编程到操作系统产生

    在学习单片机编程和操作系统时,需要掌握一些基本概念和技术,例如编程语言、数据结构、算法、计算机架构等。这些概念和技术都是计算机科学的基础,都是学习单片机编程和操作系统的必要条件。 本文将从单片机编程...

    黑莓手机系统中文语言包

    在这种情况下,安装中文语言包是解决办法之一。这个过程通常不会改变手机的其他设置,只是增加了中文显示的支持。 接下来,我们关注到压缩包中的两个文件:“Chinese.alx”和“Java”。在黑莓手机中,".alx" 文件是...

    HTML5漂亮的web系统一整套图标

    HTML5是一种先进的网页标记语言,它在Web开发领域扮演着重要的角色,特别是在创建现代、交互式的用户界面方面。本资源是一套专为HTML5 web系统设计的精美图标集,提供了丰富的图形元素,能够极大地提升网站的视觉...

    Windows xp简体中文语言包

    首先,语言包是一种软件组件,它允许用户将操作系统的主要界面、菜单、提示和帮助文档从默认语言转换为其他语言。对于安装了英文版Windows XP的用户来说,如果希望系统界面显示为简体中文,就需要安装“Windows XP...

    html做的简单的图书管理系统

    HTML(HyperText Markup Language)是一种用于创建网页的标准标记语言,其简洁的语法和强大的功能使得它成为构建网页的基础。在这个“html做的简单的图书管理系统”中,我们可以深入探讨HTML在创建交互式用户界面...

    html图书管理系统

    HTML图书管理系统是一种基于Web的、以HTML为主要开发语言的应用系统,主要用于管理和维护图书馆的书籍信息,实现对图书的借阅、归还、查询等功能。在这个系统中,HTML作为基础,结合CSS和JavaScript等技术,构建出...

    UML图 机票预订系统

    在软件工程领域,UML(统一建模语言)是一种标准化的建模工具,用于描述、可视化、构造和文档化软件系统的各个方面的结构和行为。在机票预订系统中,UML图扮演着至关重要的角色,帮助开发者理解系统的需求、流程以及...

    三甲医院管理系统HIS(C#版)源代码

    【标题】"三甲医院管理系统HIS(C#版)源代码"是一个关于医疗信息化系统的软件项目,主要针对大型医疗机构,如三级甲等医院。这个系统通常由专业的IT团队使用C#编程语言开发,旨在提高医院的运营效率和服务质量。 ...

    医院网上预约挂号管理系统的设计与实现

    本系统采用ASP(Active Server Pages)作为开发语言,结合前端和后台技术,构建了一个完整的预约流程,包括用户注册、登录、选择医生、预约时间、支付挂号费用等功能。 1. ASP技术详解:ASP是微软开发的一种服务器...

Global site tag (gtag.js) - Google Analytics