级别: 初级 M. Tim Jones, 独立撰稿人, Consultant
2009 年 8 月 27 日 语言是我们向计算机系统表达自身需求的方式,在我看来,语言种类多多益善。Blue 是一种独特的面向对象的开源语言,使用直观而且用途广泛。本文提供 Blue 基础知识,向您展示如何构建简单的网络应用程序。
身为一名软件工程师,我一直为编程语言着迷。不管是典型的命令式语言(例如 C 语言)、函数式语言(例如 Scheme)或者面向对象的语言(例如 Ruby),其语法、设计和实现中都有吸引人之处。和自然语言相似,编程语言是我们同机器进行交流、说明自身意图的方式。但并非所有语言都是相同的,每种语言都提供了独特而有趣的问题解决方法。
Blue 语言就提供了一种独特的问题解决方法。Blue 是一种动态类型的面向对象语言,还是多范型的 — 意指它支持多种语言风格的范型(例如混合了面向对象语言和函数式语言)。从解决问题的角度看,这很有用,因为这允许您混合风格,以最有效的方法解决单一问题。
 |
多范型语言
虽然多范型语言不一定是新出现的,但它们必定增添了现代编程语言的可表达性。常见的多范型语言包括 C++、Ruby、Ada、Python、Java™ 等众多编程语言。有些使用了两或三种范型样式,而有些使用了多达 8 种(例如 Mozart 编程系统的 Oz 语言)。
|
|
在深入地对 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 是一种有趣的语言,但仍然处于编程语言的幼年期。如需了解其他有用的面向对象脚本语言,请查看 Ruby、Python 和 Lua。
- 要收听针对软件开发人员的有趣访谈和讨论,请查看 developerWorks podcasts。
- 随时关注 developerWorks 技术活动和网络广播。
- 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他 活动。
-
访问 developerWorks 开放源码专区,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
-
查看免费的 developerWorks 演示中心,观看并了解 IBM 及开源技术和产品功能。
获得产品和技术
讨论
关于作者  | 
|  | M. Tim Jones 是一名嵌入式固件架构师,著作包括 Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming(现已发行第二版)、AI Application Programming(同样已发行第二版)以及 BSD Sockets Programming from a Multilanguage Perspective。他的工程背景包括从地球同步轨道航天器内核到嵌入式系统架构和网络协议的开发。Tim 是 Longmont, Colo 的 Emulex 公司高级架构师。 |
对本文的评价
|