内容


Blue 编程语言

简单性和极简主义

Comments

身为一名软件工程师,我一直为编程语言着迷。不管是典型的命令式语言(例如 C 语言)、函数式语言(例如 Scheme)或者面向对象的语言(例如 Ruby),其语法、设计和实现中都有吸引人之处。和自然语言相似,编程语言是我们同机器进行交流、说明自身意图的方式。但并非所有语言都是相同的,每种语言都提供了独特而有趣的问题解决方法。

Blue 语言就提供了一种独特的问题解决方法。Blue 是一种动态类型的面向对象语言,还是多范型的 — 意指它支持多种语言风格的范型(例如混合了面向对象语言和函数式语言)。从解决问题的角度看,这很有用,因为这允许您混合风格,以最有效的方法解决单一问题。

在深入地对 Blue 进行更技术性的介绍之前,要注意本文研究的是 Erik Lechak 开发的 Blue 编程语言,而不是 Monash University 开发的 Blue 编程语言。

使用 Blue 的动机

Blue 是一种具有独特功能的动态编程语言。它设计为跨平台、多范型的语言,具有简单而一致的语法。Blue 是解释型的,但也可编译为字节码以实现更高性能。但最引人注目的是,Blue 遵循极简主义。它是一种具备最简单特性的丰富、可表达的语言。例如,许多语言有大量方法来实现迭代。而在 Blue 中,忽略了递归或映射(函数迭代器),只有一种方法来实现循环结构。

语言特性

本文不可能完整地介绍 Blue,但查看一些较为值得注意的特性将帮助您更好地理解此语言。本节研究了类型、条件、迭代、错误捕获和类,然后有两个略大型的 Blue 应用程序将这些元素结合起来。

类型

Blue 包含许多内置类型,包括数字(包含整型和浮点型)、字符串、数组、函数等等。Blue 的调用是动态分类的,这意味着您可以简单地将一个变量与一个值关联(不要求定义变量)。清单 1 中的示例说明了如何创建多种类型的变量(整型、浮点、字符串、数组和函数)。

清单 1. 创建多种类型的变量
x = 9;
y = 3.14159;
s = "this is a string";
a = [1, 2, 3, 5, 8];
f = func{ arg name; sys.print( "Hello ", name, "\n" ); };

sys.print( f("Marc") );

sys.attribs( &s ).print();

最后一行给出了特定字符串类型的属性。这些属性是该类型的本地类型属性(或成分)。当针对变量类型执行 attribs 函数时 — 该变量使用 typeof 运算符 (&) 进行检索,结果为:

[replace,repeat,num,ltrim,length,import,endsWith,compile,find,eval,load,print,
substr,rtrim,save,startsWith,split,trim]

这些方法看上去与典型的字符串对象方法应该很相似。您还能使用 attribs 方法来处理对象本身(而不是类型),这可提供对象本身的属性。

条件

在 Blue 中,条件 这种表达式取代了语句。这意味着您能使用条件来代替值,可使代码更简单、更干净。在 Blue 中,条件的形式为:

condition ? true-expression ;
condition ? true-expression : false-expression ;

如是,您以表达式开头,并提供一或两个选项(真或伪路径)。清单 2 提供了两个例子。这些简单的案例中提供了表达式,但它们也可以是规定多条语句的代码块(使用花括号)。

清单 2. 条件示例
foo = 2;

(foo == 2) ? sys.print("foo is 2\n");

(foo == 1) ? sys.print("foo is 1\n") : sys.print("foo is not 1\n");

迭代

Blue 提供单一的循环机制,包含于代码块之内。代码块就是将返回一个值的一组代码,如果没有返回值,那么会返回一个 NULL 对象。对象块定义如下所示。

清单 3. 如何定义代码块
z = {
  x = 1;
  y = x+3;
  return y;
};

sys.print( z );

清单 4 显示了以这种模式构建的迭代(从 10 到 1 计数):

清单 4. 迭代示例
sum = 0;
value = 10;

ret = loop {
  sum = sum + value;
  value = value - 1;
  (value == 0) ? return sum;
};

sys.print( ret );

在此示例中,代码块迭代,直至循环根据条件而中断。然而仅仅使用简单的循环结构,您也能构建任意复杂的循环。

捕获错误

Blue 实现的一种异常系统与 Java 编程语言有几分相似,但经过了简化。在 Blue 中,您 “提出(raise)” 异常(而 Java 是 “抛出(throwing)” 异常)。您还能 “捕捉(catch)” 异常,以便使用错误捕获运算符(|)来管理 Blue 中的错误。本节提供了一些实例来展示其工作方式。

异常处理的最常见用法是中断一个函数,将异常提交给调用程序(可能是该调用程序,或者是堆栈中上级调用程序)。在清单 5 所示设计示例中,我验证所传递的参数,如果它是无效的,我就提出异常。Blue 的独特之处在于您能将任何对象提出为异常。在调用程序上,我使用错误捕获运算符来捕获异常。我发出错误信息,将返回值替换为 0(请记住:每个内联代码块都返回一个对象)。

清单 5. 异常处理示例
z = func {
  arg my_arg;

  (my_arg == 0) ? raise -1;

  return 10 / my_arg;
};

x = z( 0 ) | { sys.print("error\n"); return 0; };

这种方法的另一个更简单的有趣用例是,为参数提供默认值。您能够使用清单 6 中所示代码行来为缺失的参数指定默认值。在这个用例中,如果用户调用没有参数的函数 z,则 1 被用作默认值。

清单 6. 为缺失的参数指定默认值
z = func {
  arg my_arg | 1;

  ...

};

最后如清单 7 所示,您能实现对代码块进行异常处理的传统用例。这个典型用例涵盖了要管理异常的整个块。

清单 7. 对代码块的异常处理
{
  first_func();
  second_func();
  ...
} | {

  # Manage errors for the block

}

Blue 也采用了明确的极简方法来进行面向对象编程。在 Blue 中,您可创建新类、类的继承,或扩展类。为创建新类,我首先使用 sys.class() 函数。它返回一个新的空类,我能向此空类添加属性。清单 8 研究了角色类的创建,此类可用于简单的角色扮演游戏。我现在能向这新的空类填充属性,诸如字符串和数字类型(代表了角色的成分),以及这个类中常用的函数。注意我提供了 3 个函数:构造器、销毁器和状态函数(状态函数发出对象实例所代表的角色的信息)。

清单 8. 角色类
#
# Character Class
#
Character = sys.class();

Character.name = "";
Character.weapon = "";
Character.hp = 0;

# Constructor
Character._ = func {
    arg name | { name = "anonymous"; };
    arg weapon | { weapon = "stick"; };
    arg hp | { hp = 10; };

    this.name = name;
    this.weapon = weapon;
    this.hp = hp;
};

# Destructor
Character.__ = func {
    sys.print( this.name, " is dead.\n" );
};

# Class method
Character.status = func {
    sys.print( this.name, " (HP ", this.hp, ") wields a ", this.weapon, ".\n" );
};

完成这个角色类之后,我现在可创建角色对象,如清单 9 所示。对第一个案例,我创建了一个对象 char1,并提供所有参数。对第二个案例,我不提供任何参数,所以它使用默认值。最后,我为每个对象调用状态函数。

清单 9. 角色对象
char1 = Character( "Ralph", "whip", 5 );
char2 = Character();

char1.status();
char2.status();

但 Blue 是高度动态的,所以您能在创建对象之后再修改对象。在清单 10 所示例子中,我为 char1 对象添加了一个 greet 函数。这个函数专用于 char1,不会显示在 Character 类的其他实例中。

清单 10. 将一个 greet 函数添加到 char1 对象
char1.greet = func { 
    sys.print( this.name, " says hi.\n" ); 
};

char1.greet();

del char1.greet();

此应用程序的输出(包括 3 个主要清单)如下所示。

清单 11. 包含清单 8-10 的应用程序的输出
$ blue char.bl
Ralph (HP 5) wields a whip.
anonymous (HP 10) wields a stick.
Ralph says hi.

虽然这些示例中没有显示,但 Blue 确实允许继承。Blue 甚至允许您动态地扩展类并收缩类(即移除已扩展的类的属性)。

网络示例

本节以网络应用程序的形式提供了一个 Blue 示例。大多数面向对象的脚本语言令人感兴趣的一个方面就是,它们能够快速而容易地生成网络应用程序原型。Blue 也不例外。Blue 可实现有益的行为模块,例如套接字、线程、(各种)流,甚至是简单的 XML 分析器。

最后这个示例演示了一个简单的动态 Web 服务器。动态 意味着页面是运行时构建的,而不是从文件系统中读取内容。简单的 Blue Web 服务器如下所示。

清单 12. 简单的动态 Web 服务器
#
# Dynamic Web Server Class
#
WebServerClass = sys.class();

WebServerClass.name = "";
WebServerClass.port = 0;

# Constructor
WebServerClass._ = func {

  arg name | { name = "SimpleWebServer"; };
  arg port | { port = 80; };

  this.name = name;
  this.port = port;

  global Stream = sys.library("streams.dll");

};


# Server
WebServerClass.server = func {

  server = Stream.listen(this.port);

  loop {

    client = server.accept();

    request = client.read().substr("/", " ");

    sys.print("Request: ", request, "\n");

    {

      client.write("<html><head><title>");
      client.write( this.name );
      client.write( "</title></head><body>" );

      ( request.find("status") != 0 ) ? {

          client.write("<h1>Server is up.</h1>" );

      };

    } | {

      # Exception Handler

      client.write("<h1>Page not found.</h1>" );

    };

    client.write("</body></html>");

    client = ();

  };

};


myWebServer = WebServerClass( "MyWebServer", 80 );
myWebServer.server();

这个示例首先创建一个称为 WebServerClass 的新类。我添加了一个字符串名称、一个端口类变量,还有两个函数:构造器和服务器。我使用构造器来初始化参数,并执行任意必要的设置(例如载入流库)。然后服务器函数实现 Web 服务器循环。此函数在已定义的端口上创建了一个监听套接字,等待服务器通过接受函数而连接。

客户端连接之后,HTTP 服务器通过客户端套接字读取 HTTP 请求并提供一个响应。该请求指示所请求的文件,该文件使用 find 函数进行了测试。如果 status 文件被请求,则发出一条简单的消息。否则,发生中断以 find(查找),并且异常处理程序发出标准的 file not found(文件未找到)错误。输出完成后,通过向客户端流写入一个 NULL 对象,而且循环等待下一个客户端,从而刷新流。清单的末尾显示了如何创建和启动一个 WebServerClass 对象。

语言状态

Blue 正在积极开发中,其最新版本 (V1.75) 已于 2009 年 4 月面世。您能在 Linux® 和 Microsoft® Windows® 上使用 Blue,而且不久它将支持 OS X。Blue Web 站点提供了一个论坛,其中包含当前和过去的安装 tarball,以及关于语言特性的教程(见 参考资料)。

结束语

Blue 是一种有趣的语言,具有许多引人注目的概念。和许多面向对象的脚本语言(Ruby 和 Python 等)相似,它容易学习而且使用起来富有乐趣。这类语言很适合快速生成原型和测试新想法。Blue 仍然在开发中,还不是很稳定,但它十分值得您花时间尝试。


相关主题

  • 访问 Blue Web 站点,了解更多信息,下载资源。您将发现许多关于该语言的出色教程、该语言的当前版本和过去版本,以及您可咨询问题或索取特性的论坛。您还能了解关于 Blue 幕后团队的信息,并找到提供帮助的方式。
  • 查看 Wikipedia 以了解 多范型编程语言面向对象编程 以及 动态编程语言
  • Blue 也结合了函数式语言的一些方面。在 “用 Guile 编写脚本” 中了解 Scheme,它是最重要的函数式语言之一。
  • Blue 是一种有趣的语言,但仍然处于编程语言的幼年期。如需了解其他有用的面向对象脚本语言,请查看 RubyPythonLua
  • 随时关注 developerWorks 技术活动网络广播
  • 访问 developerWorks 开放源码专区,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
  • 下载 IBM 产品评估试用版软件IBM SOA Sandbox for Reuse,并开始使用来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source
ArticleID=423642
ArticleTitle=Blue 编程语言
publish-date=08272009