REBOL 语言简介

翻译:ShiningRay @ NirvanaStudio

本文是一篇针对新用户的技术文档。他给出了一个REBOL的简明概述和一个例子。

Quick Facts

  • REBOL 代表基于相关表达式的对象语言(Relative Expression Based Object Language).
  • REBOL 发音为"reb-ol" ,和“rebel with a cause”中的一样。
  • REBOL 是一种消息式的语言。他的主要目的是提供一种轻量级的分步计算和通讯的方法。
  • REBOL Carl Sassenrath设计, 是Amiga OS——世界上第一个个人电脑的多任务操作系统——的系统架构师。
  • REBOL 不仅仅只是一个编程语言。他还是一种用于表示数据和元数据的语言。他给计算、存储和信息交换提供了同一种方法。
  • REBOL 有十分丰富的软件包。初学者可以从REBOL/Core和REBOL/View开始。专业人士会发现REBOL/Command和REBOL/SDK十分有用。公司和组织会发现REBOL/IOS是一个强大的协作交流平台。
  • REBOL 代码和数据跨越了40多种平台。在Windows上写的脚本和在Linux, UNIX和其他平台上运行得都一样,根本无须任何改动。
  • REBOL 引入了方言化的概念。方言是一个小巧有效专门针对特殊领域的子语言。
  • REBOL 本意就是要保持小巧——即使他已经包含了数百条函数,几十种数据类型,内置帮助,多种Internet协议、压缩、错误处理、调试控制台、加密和更多。
  • REBOL 程序很容易书写。你所需要的仅仅是一个文本编辑器。一个程序可以只有一行也可以是一整个应用程序包含了几十个文件。。同时,你的程序不需要对库和包含做声明。

上手例子

在REBOL中,简单的任务有简单的做法。这里有一些例子:

如果你想尝试这些例子,只要下载REBOL。他确实很小,下载得很快。它不需要任何复杂的安装也不需要任何特殊的类库。他很简单。要运行REBOL,只要点击他的图标。(如果你在使用REBOL/View,在他启动之后点击console图标来打开控制台窗口。)

先尝试一下经典的Hello World例子:

或者,把它作为一个邮件消息发送给一个朋友:

要直接从一个网站运行一个脚本

这个叫本会显示你的计算机有多快。

如果要查看脚本的源代码:

如果要保存源代码到一个文件:

要在本地运行代码,你可以输入:

当然,你可以用同样的方法保存任何网页:

要给一个朋友通过邮件发送一个网页:

要下载一封REBOL的拷贝,你要指明它是二进制的。像这样:

同时,你可以看见REBOL并不关心你代码中的换行。

如果你要把一个目录中的所有文件作为邮件发送(假设他们都是文本文件):

但是,也许你只想发送包含单词REBOL的文件:

如果你想把那些文件连成一个单独的消息并发送出去:

进阶例子

如果要查看你所有的email消息但是不把他们从服务器上删除,这样:

当然,你也许想一次性都读出他们:

要删掉所有包含单词“spam”的邮件:

当你准备发送一个信息到你的经纪人,信息可以被她的基于REBOL的股票交易程序自动处理:

以上的例子用到了REBOL的dialecting(方言化)概念——一种在网络上收发消息的极其有用的技术。

如果你的老板要求你每小时自动发送几个网页作为邮件:

如果你需要摘录并打印网页的标题,你可以这样解析:

生成脚本文件

你可以把上述任何例子输入文本编辑器(如Windows上的Notepad)然后保存为一个文件。你可以把这个文件拖至REBOL图标的上方来启动它。

你需要添加一个简短的REBOL头到你的文件的顶端:

这个标头表示这个文件是一个REBOL的代码同时可以提供一些有用的文档说明和其他的选项。

你的程序应该看起来像这样:

如果你正在使用REBOL/View,你也许想在你的脚本的底部添加一行这样你可以看到结果(在窗口关闭之前)。只要在结尾添加一个halt,这样控制台窗口就会开着:

内嵌帮助

如果要在REBOL中获得帮助,输入:

你可以查询某个特殊字的信息:

或者,查找符合一个字符串模式的帮助:

或者,察看REBOL所有的数据类型:

然后你可以查看REBOL中所有的高级函数用:

当然,还有本地代码、动作和其他类型的函数。

如果你想看高级函数的代码:

通过查看内嵌函数的代码,你可以了解很多有用的REBOL的编程方法。

仅仅是一个开始

我们希望以上的例子能给你一个好的REBOL的概念。我们在保持REBOL简洁上作了相当多的工作。当然,REBOL远不止这些东西。在,REBOL是一个高级编程语言,它在很多地方都很独特。常常有人说REBOL就像一片湖水,你看到了表面,同时你可以在湖面上尽情欢乐,但这不是湖水的全部。仍然有很多东西需要去深入了解。当然,作为初学者你不需要去了解那些东西。当你学到更多的东西,我们希望你能发现REBOL到底能做多少事情。请看一下我们的文档索引如果你想“游”得更深一些。

REBOL十步

翻译:ShiningRay @ NirvanaStudio

这是REBOL的一个简短概要。他在十步之内展示了REBOL的基本概念,仅仅需要阅读几分钟而已。更多的详细信息可以在 REBOL/Core Manual中找到。

1. 值(Value)

是REBOL的未处理的数据。不同的值可以在REBOL中直接书写。你已经对他们很熟悉了。这里有一些例子:

数字:
1234
-432 3.1415 1.23E12
0,01 1,2E12

时间:

12:34 20:05:32 0:25.34

日期:

20-Apr-1998 20/Apr/1998 (US)
20-4-1998 1998-4-20 (国际通用)

1980-4-20/12:32 (有时间的日期)
1998-3-20/8:32-8:00
(带着一个时区)

货币:

.34 USD.34 CAD3.45 DEM34,56

元组:

3.1.5 (版本号)
255.255.0 (颜色值)
199.4.80.7
(IP地址)

字符串:

"Here is a string"
{Here is another way to write
a string that
spans many lines
and contains "quoted"
strings.}

标签:

<title> </body>
<font size="2"
color="blue">

Email:

info@rebol.com

pres-bill@oval.whitehouse.gov

URLs:

http://www.rebol.com (网页)
ftp://ftp.rebol.com/sendmail.r (文件传输协议)

mailto:info@rebol.com (email)

文件:

%data.txt
%images/photo.jpg

%../scripts/*.r

号码:
#707-467-8000
(电话号码)
#0000-1234-5678-9999 (信用卡)
#MFG-932-741-A
(模型数字)

二进制:

#{0A6B14728C4DBEF5} (十六进制编码)
64#{45kLKJOIU8439LKJklj}
(base-64
编码)

只要可能,REBOL允许国际通用格式的使用,像十进制数、货币和日期。更多关于值得信息可以在 REBOL/Core Manual 中找到。

2. 词(Word)

词Words
是REBOL的符号。他们用来直接表示某个东西为一个词,或者间接表示为一个变量(稍后会解释)。你写词就和写英文一样的(或者和其他一些自然语言一样)。

破折号和一些其他的特殊字符也可以使用。他们会被认为是词的一部分。

单词的末尾被标记为一个空格,或者以下某个字符:

同样,这些字符不能出现在单词中:

更多关于单词的内容可以在 REBOL/Core Manual.中找到

3. 块(Block)

值和词都是在块中组合。一个块由一个'[‘开始,以’]’结束。你可以以任何顺序组织值和词,用任意多行代码。REBOL允许在块中以一种自由体来创建数据库、目录、表格、集合、序列、代码、函数,等等。

块通常用来组织代码和数据:

关于块的更多信息可以查阅 REBOL/Core Manual.

 

4. 计算(Evaluation)

块可以被计算得到他们的值。块中的值和词都按照从左到右的顺序计算。下面的例子展示了他如何工作的,假设你是输到之REBOL的命令行。Blocks
can be evaluated to compute their results. The values and words of
the block are computed from left to right. The examples below show how this
works as if you typed into REBOL at the prompt. (Lines typed at the prompt
create a block, even though the brackets [ ] are not shown):.

当计算块时,它的结果以一个值返回:

括号可以用来决定计算顺序:

更多关于计算的内容可以看 REBOL/Core Manual.

 

5. 变量(Variable)

词可以用作变量。一个词后面更上冒号就可以设置它的值:

出现一个没有使用冒号的词,他就会被计算:

一个变量可以用来保存任何类型的值。在上面的例子中,词print,if,> third
都是存了函数的变量。他们刚好已经被REBOL预定义了,但他们在其他方面和其他词没什么区别。

变量只有在定义他们的上下文中才有意义。一个上下文可以跨越整个程序或者被严格限定在某个特定的块、对象、函数中。在下面的例子中,use函数声明一个词age。Age是一个局部变量,在这个块外面,他可能就含有别的值,但是这不会影响age在块中的值。

局部变量同时是由函数创建的,下一节就会叙述他。

更多关于变量的内容可以查阅 REBOL/Core Manual.

6. 函数(Function)

一个函数就是一个块,这种块可以有局部变量,当每次计算这个块的时候,局部变量都会被给与新的值。局部变量是函数的参数。函数可以用多种方法来创建。这里是最常见的:

他会新建一个函数并设置为一个词sum。第一个块描述了函数的参数,第二个块便是当调用函数的时候所计算的块(这里,他把两个值相加并返回结果)。如果要使用这个函数:

当调用sum函数时,a的值设为2同时b的值为3。他们被相加,结果被返回,同时结果被作为参数传给了print函数。

对于某些函数,你也许需要局部变量但不要把他们作为参数。你可以使用function代替以上情况中出现的func

这个series是参数,total是一个局部变量用来进行计算的。注意在两个地方用到了return,将结果作为函数结果返回。如果没有要返回的结果,可以使用exit

当然,还有更多关于函数的东西可讲,请参看 REBOL/Core Manual.

7. 路径(Path)

路径指明了一个精化。他提供了一种简便的方法来指出需要更多的信息。你可能已经对他们作为文件和URL中的一部分很熟悉了。斜杠(/)是用来分隔路径中的词的。

在REBOL中,路经也可以对块、函数、对象和字符串使用:

下面的例子演示了使用块作为小数据库并通过路径访问的简便之处:

更多关于路径的信息可以查阅 REBOL/Core Manual.

8. 对象(Object)

一个对象是一组在特定上下文中含有值的变量。对象可以用来管理有更复杂行为的数据结构。例如,一个银行帐户可以从使用对象指定属性和方法中受益:

name, balancess-number, deposit,以及withdraw 都是account 对象的局部变量。deposit和withdraw变量是在对象中定义的局部函数。account的变量可以通过路径来访问:

要生成其他的account,并设置一个新的balance但是其他的值保持不变:

你也可以通过添加一个银行名称和最后活动日期扩展已有的account对象来新建一个account:

对象还有一些别的特性,包括隐藏变量。想要发现更多内容,请看 REBOL/Core
Manual
.

9. Messages消息

一个REBOL消息,简单的说,是一个从一个地方发送到另一个地方的文本文件。不管消息时在计算机之间、进程之间、还是人之间发送的——消息的形式都是一样的。他们由REBOL头开始,标示了内容、日期和其他属性:

头可以包含其他信息,由消息的目的和重要性决定。头接下来跟着的是消息的内容本身。就像上一节所显示的,他可以包含数据、代码或者两者的混合。

消息和在已有的互联网协议如http, mail
(SMTP & POP), new 和
ftp上传送。消息也可以被嵌在别的内容形式中,例如网页或者文档文件。在下面的例子,REBOL从一个网站读取一个消息并且计算它:

这个例子通过EMAIL发送一个简短的REBOL消息:

这个例子会检查每一个发送到你邮箱的消息是否从其他的REBOL程序中发出的:

import 函数把EMAIL消息转换成REBOL对象以便访问。如果email包含一个x-rebol行,那么它就是从REBOL发出的。

 

10. 方言(Dialect)

方言是携带了以不同的值和词的语法(顺序)的使用方式产生的精炼了的含义。方言一般是唯一的并且针对他们所设计解决的问题是十分合适的。

其实你已经看到了一写简单的方言。例如,一个函数的参数列表就是一种方言,除了那些已经在这里显示了的还包含很多种变体。其他的方言也可以用来分析表达式和格式化输出。

这里有一些其他方言的例子,可以用来解决特殊的问题。第一个是影像工作室控制脚本::

一个图形用户界面:

足球赛程:

安装脚本:

这有无穷无尽的可能性。更多关于方言的介绍将会在REBOL继续开发之前几个月提供给大家。

REBOL到底哪里不同?

翻译:ShiningRay @ NirvanaStudio

REBOL并非一个传统的计算机语言像C、BASIC或者Java。相反,REBOL是设计为解决在计算中的一个根本问题:在分布的计算机系统之间的信息的交换和解释

REBOL并不是通过综合一种编程语言和一种元数据语言的概念来解决这个问题的。就好像你也可以直接在C/C++中表达和处理元数据或者在XML中书写代码算法一样。解决这个问题是通过相关表达式relative expression)的概念(这也是REBOL名称的由来——Relative
Expression Based Object Language)。按照技术术语来说,REBOL是一种元循环语言meta-circular language)。也就是,REBOL扮演了自身的元语言。

相关表达式,也叫做“方言”,给代码和数据的表示提供了极高的效率,同时,他们也是REBOL最强大的力量。比如,REBOL可以不仅仅可以只用一行代码就建立一个图形用户界面,还能把这一行作为数据发送出去在世界上的另一台网络计算机系统上进行处理和显示。

REBOL的一致的架构提供了广泛而且强大的能力,从他小巧的解释器(称为REBOL/Core)到一整套互联网操作系统(Internet Operating System ,称之为REBOL/IOS)。

rebol_layers.gif

REBOL的最终的目标是要为一切连接在互联网上的设备之间信息的存储、交换和处理提供一种新的架构。不像其它的方法需要几十兆代码,一层又一层的复杂结构,又只能在单一平台上运行,需要特定的编程工具,REBOL很小巧、很轻便、可移植并且易于管理。

REBOL应用程序(称为“reblets”)的大小很重要。不仅仅因为可以让他们只要几秒钟就下载完(即使使用调制解调器或者是无线网络)还因为reblets很小,他们就很容易创建、修改和增强。大多数REBOL应用程序,即使是很重要的能做很多事情的应用程序像建立网站、处理信用卡或者共享一个日历等等,都仅仅只有10-30KB。

例如,我们用来展示REBOL的图形化幻灯片展示程序只有9KB,他的效果像这样:

REBOL的图形化幻灯片

这里还有另外一个例子。这个用户状态和活动监视器只有7KB:

用户状态和活动监视器

还想看更多的例子么?这里有几个不同的例子,用REBOL/View写的,这里还有一些“reblets”为IOS写的。几乎所有这些加起来都不超过30KB,但他们效率仍然很高,而且是分布式应用程序。

REBOL脚本快速入门

By Carl Sassenrath REBOL Technologies

翻译:ShiningRay @ NirvanaStudio


目录

  1. 介绍
  2. 数据类型的世界
  3. 集成网络操作
  4. 创建脚本文件

1. 介绍

REBOL是针对互联网通讯设计的。REBOL是一种高级解释语言允许你访问和控制互联网的资源,而且他的便捷让你可以开始考虑把互联网当成你的个人操作系统。你已经熟悉了如何使用浏览器在网上冲浪。有了REBOL,你可以编写互联网。

在REBOL总部我们用REBOL建立手册和文档(比如当前这个),生成全部我们的网站、自动上传页面和图像到网络上、发送邮件通知、处理信用卡、远程共享文件、跟踪客户订单、进行即使通讯、主持电子会议、自动更新软件、运行技术支持、管理我们的错误数据库、删除垃圾邮件、备份服务器、遍历网络、过滤网页广告、还有——最重要的——在42种不同的系统上构建REBOL。

每天我们在几十台机器上用数百个REBOL脚本给我们带来了极大的便利。我们只要一种语言就能完成所有的事情。就像一个神奇的魔术师,REBOL使我们这个小小的小组事倍功半。

这篇指南提供了使用REBOL的简要的介绍。如果你正在慢慢得阅读那份720页的REBOL手册,我们也很理解,谁会有时间把它全部看下来呢?抱着这种想法,这篇文档的目标是在20分钟之内给你一个REBOL的大体概念并且给出一些可以找到更多资料的链接。


2. 数据类型的世界

语言是建立在一系列基本的数据类型的基础上的,他们被用来构建一切的其他东西。整数和字符串都是数据类型的例子。大多数语言有大约5种或者6种数据类型。相反,REBOL有45种数据类型。这种结果是很多任务下你可以关注于你的程序要做什么,而不是如何去做。

例如,所有的语言都可以让你对数字相加:

然而,在REBOL中,你可以一样很容易的加减时间、日期、货币、元组和坐标。这里有一些例子,还有他们的结果:

注意你不需要包含(include)任何文件,使用引入(import)语句,或者进行函数声明。他们是语言中的基础部分。

同时注意你使用同一种记号来相加各种类型。大多数函数都可工作于多种数据类型上。他们是多态的;他们可以和多种数据类型一起工作。结果是什么?你将变得更高效,却无需让你的程序变得更复杂。简单的东西就应该让他简单。

这里是另一个例子,它搜索第一个字符串中出现的第二个字符串:

同样的搜索操作也可以操作其他数据类型,比如电子邮件地址,URL,文件,标签,序列号,二进制和块:

对REBOL的其他35种数据类型感到好奇了?在控制台下面输入这一行来把他们都列出来:

过着看一下REBOL指南的值附录


3. 集成网络操作

作为“互联网操作系统”的脚本语言,你需要能访问互联网的协议就像操作文件一样简单。REBOL已经内置了14种标准协议,也不需要包含文件或者函数声明。你只要使用他们。

例如,要从你的硬盘上读取并显示一个文本文件,你可以写:(注意百分号在REBOL中表示他是一个文件名。这必须出现来防止REBOL把他认作是一个REBOL单词。)

你可以一样简单的使用各种不同的协议从网路上读取文本。下面几行例子展示了他做了什么:

如果你自己要实验这些代码,只要在这些read的前面加上一个print并且给出一个有效的URL信息。注意如果你使用了一个防火墙,你需要设置你的REBOL代理设置来看到结果。当然,这些例子仅仅是一个开始。还有很多其他特性可以使用。例如,要从一个网站读取一个图像并且把他存到磁盘上的一个文件中:

write函数使用了一个/binary精化来指明这是一个二进制文件,不是一个文本文件。

什么是“精化”(Refinement)?
一个“精化”(refinement)指定了一个函数的变体。精化以一个斜杠(/)开始同时一个函数可以包含多个精化。要了解一个函数有哪些可用的精化,在命令行下输入help并在后面加上函数名称。例如:

将会给出write函数的描述和他的参数以及精化。

如果你想将一个文本文件作为邮件内容发送出去,你可以写:

而且甚至,你可以一样简单的发送一个网页:

当然,如果你要做的只是发送一个文本消息,你可以写:

要写一行可以读取一个图像文件并且上传到一个Internet服务器的代码,你可以这样写:

注意你必须给出用户名和密码作为URL的一部分。

你是不是想上传一整个目录的文件?这个脚本可以完成这个工作:

注意这里用到了site单词的另一个精化。当一个精化是用在URL上的,他会把这个URL和他提供的文件名组合在一起。file前面的冒号是在说“获取文件名”。添加一个print到循环中来看看结果:

也许你只想要上传目录中的JPEG文件。用find检查文件名就像前面一节演示的那样:

如果要上传所有的GIF和JPEG文件,你可以写成:

现在,让我们设想你只想上传那些在两天内修改过的文件:

变量date被设置为当前的日期和时间减去两天。再用他和文件和文件的日期——通过modified?函数来获取——相比较。

你可以很简单地写出只传输小于一定大小的文件将比较的一行代码换成:

或者,你可以避开子目录:

这些函数也可以和URL一起工作。你可以检查远程文件的大小:

你也可以检查文件的修改日期and you can check the file modification date with:

这一层次上的互联网集成让你可以在你的程序中十分简单的操作网络资源。例如,在REBOL/View中如果你想建立一个窗口并使用一个来自互联网上的图像文件,你可以写成:

这个的结果是产生了一个窗口显示图像像这样:

intro1.png

如果你想改变窗口的颜色并且把图像放到一个按钮中,点击之后浏览一个网站,这里是扩展的例子:

他会看起来像:

intro2.png

类似的,你可以把前面的网络函数添加到这个脚本中。例如,这个按钮可以进行FTP上传或者下载、接收邮件、发送邮件,监测新闻组,获取一个用户的信息,和任何其他的事情。

最后,要展示REBOL和互联网的完整的集成,你可以直接从网络上运行其它的REBOL程序。他们可以从以上任何一种返回一个有效的脚本的协议中运行。例如,这里是一个他如何从一个网站上运行一个脚本:

do函数下载脚本并运行它。要从FTP运行它,你可以写成:

你现在可以对REBOL如何“编写互联网”有一个更好的概念。作为最后一个例子,我们结合了图像按钮和do例子:

当你点击图像的时候,他会启动RIM,REBOL即时通讯软件。你对RIM好奇吗?试试这个:

这个即时通讯软件怎么这么小呢?看看代码:

你就知道了。

要了解网络编程的更多内容,请阅读REBOL指南的网络编程一章。


4. 创建脚本文件

REBOL文件可以用作代码、数据或者是两者的结合。这些文件可以用任何文本编辑器建立,或者他们可以作为其他程序的运行结果创建。例如,我们公司使用REBOL文件来储存很多我们每日使用的数据库。

每个REBOL文件以一个标识他的内容、作者、版本、历史和各种其他可选的字段的头部。这个信息十分有用,我们也鼓励你在你的每个脚本中给出他。他将帮助大家了解:

  • 这个脚本做什么
  • 谁写的
  • 他现在什么版本
  • 他最后什么时候修改的
  • 谁拥有它
  • 他应该使用什么文件名

这个脚本头总是用REBOL自身来描述。他们是REBOL可以读取的元数据。这允许基于REBOL的搜索引擎和存档服务更方便得建立有用的文件索引。另外,智能的文本编辑器和代码版本软件可以自动跟踪版本。

这里有一个最小化头的范例,你可以用于上面演示的任何脚本中:

注意日期和版本并没有加引号。他们是按照REBOL的数据类型来写的。前者是date类型,后者是一个元组tuple(注意它必须要有三个部分)。

从前一节中拿出最后一个例子,这里是完整的例子脚本文件:

要了解跟多REBOL脚本和头信息的资料,请参考REBOL指南的脚本一章。

JavaScript:世界上最被误解的语言

JavaScript:
世界上最被误解的语言

Douglas Crockford
www.crockford.com

原文地址:JavaScript: The Wrrrld’s Most Misunderstood Programming Language  

翻译:ShiningRay
http://www.nirvanastudio.org/

JavaScript,亦称为 Mocha、LiveScript,也叫做JScript、ECMAScript,是世界上流行的编程语言之一。事实上世界上差不多每台个人电脑都至少安装了一个JavaScript解释器。JavaScript的流行完全在于它作为WWW的脚本语言的角色。

不管它有多么流行,极少有人了解JavaScript是一个十分动态的通用面向对象编程语言。这怎能成为一个秘密呢?为什么这个语言如此被误解?

关于名字

这个Java-前缀暗示了JavaScript和Java的关系,也就是JavaScipt是Java的一个子集也就是不如Java强大。看上去这个名称就故意制造混乱,然后随之而来的是误解。JavaScript并不是解释型的Java语言。Java是解释型的Java,JavaScript是另一种语言。

JavaScript和Java的语法很相似,就象Java和C的语法相似一样。但它也不是Java的子集就像Java也不是C的子集一样。在应用上,Java要远比原先设想的好得多(Java原称Oak)。

JavaScript并不是由Sun公司——Java的老家——开发的。JavaScript是由Netscape公司开发。它本来叫做LiveScript,这个名字并不是那样容易混淆。

这个-Script 后缀暗示了它不是一个真正的编程语言——脚本语言好象不是真正的编程语言。但其实这是一个专长的问题。相对C而言,JavaScript牺牲性能但带来更强的表达力和动态性。

披着C外衣的Lisp

JavaScript的C风格的语法,包括大括号和复杂的for语句,让它看起来好象是一个普通的过程式语言。这是一个误导因为JavaScript和函数式语言如Lisp和Scheme有更多的共同之处。它用数组代替了列表,用对象代替了属性列表。函数是第一型的。而且有闭包。你不需要平衡那些括号就可以用lambda算子。

思维定势

JavaScript是原被设计在Netscape Navigator 中运行的。它的成功让它成为几乎所有浏览器的标准配置。这导致了思维定势。JavaScript简直就是程序语言中的George Reeves (一位曾扮演超人的演员,但后来死于枪杀,被官方认为自杀,细节不详——译注)。其实,JavaScript也适合很多和Web无关的应用程序。

不断改变的目标

JavaScript的第一个版本功能十分弱。它缺少异常处理、内部函数和继承。而它的现在的形态,它已经是一套完整的面向对象语言。但很多看法都是基于认为它的形式不成熟。

管理这个语言的ECMA委员正在开发扩展 ,原意是很好,而这样却会加剧这个语言最严重的问题:版本太多了。这也造成了混淆。

设计错误

没有什么编程语言是完美的,JavaScript也有它的设计上的错误,如的重载同时表示加和带类型转换的串连接,和有错误倾向的with语句应该避免使用。保留字策略过于严格。分号的加入是一个很大的错误,正则表达式的记号也是。这些错误会导致编程错误,并把语言的设计作为整个叫做问题。幸运的是,这些问题可以用一个很好的lint程序来避免。

这个语言的设计从整体上看还是十分健全的。但很令人惊讶的是,ECMAScript委员会好象根本不想修正这些错误。也许他们对重新制作一个更感兴趣。

肮脏的实现

JavaScript早期实现错误百出。这对该语言带来了很恶劣的影响。更糟糕的是,这些实现还被嵌入的更错误百出的浏览器中。

拙劣的书籍

几乎所有的书籍都十分恐怖。里面到处是错误、蹩脚的例子还自创一套拙劣的惯例。语言中重要的特性却常常解释不好,或者干脆完全不写。我翻阅了几十本JavaScript的书,我只推荐两本:David Flanagan的JavaScript: The Definitive Guide (4th Edition)和Danny Goodman的Dynamic HTML (2nd Edition),二者都来自于O’Reilly

不够标准的标准

该语言的官方标准规格说明书由ECMA发布。该规格书也是质量奇差。它难以阅读也难以理解。它也对拙劣书籍的问题作出了自己的一份“贡献”,因为作者无法使用这个标准文档来增加他们对语言的认识。ECMA和TC39委员会应该为此感到深深的羞愧。

业余爱好者

大部分写JavaScript的人都不是程序员。他们缺乏训练写好程序的修养。JavaScript有如此丰富的表达能力,他们可以任意用它来写代码,以任何形式。这给JavaScript带来了一个名声——它是专门为外行设计的,不适合专业的程序员。这显然不是事实。

面向对象

JavaScript是不是面向对象的?它拥有对象,可以包含数据和处理数据的方法。对象可以包含其它对象。它没有类,但它却有构造器可以做类能做的事,包括扮演类变量和方法的容器的角色。它没有基于类的继承,但它有基于原型的继承。

两个建立对象系统的方法是通过继承(是一个……)和通过聚合(有一个……)。JavaScript两个都有,但它的动态性质让它可以在聚合上超越。

一些批评说JavaScript不是真正面向对象的因为它不能提供信息的隐藏。也就是,对象不能有私有变量和私有方法:所有的成员都是公共的。

但又有证明了JavaScript对象可以拥有私有变量和私有方法。当然,极少有人认识到,因为JavaScript是世界是最受误解的程序嘛!

另外还有批评说JavaScript不能提供继承,这里证明了JavaScript不仅能支持传统的继承还能应用其它的代码复用模式

Copyright 2001 Douglas Crockford. All Rights Reserved Wrrrldwide.

你知道Lua语言吗?

Lua语言,也许几年前大家都没有听说过,他是巴西人开发的一个十分高效的动态语言,针对的就是嵌入在宿主程序中做扩展应用。

说他高效,是和很多其他动态语言相比,如JavaScript(Spidermonkey实现或JScript实现)、Python、Ruby等等,无论在执行速度还是内存占用上,都体现出很大优势。(见测评

而今天也许很多人都听说了,因为暴雪公司开发魔兽世界旗帜鲜明地应用了Lua语言来运行扩展脚本。

听朋友说,WOW的扩展开发社区,乍一看,就以为是Lua社区。而Lua也有一个十分活跃的社区,并不比Python、Perl的差。(http://lua-users.org/)

我在2002年的时候,也是因为研究游戏编程才了解了Lua语言,当时看到介绍说他的高效,适合做游戏开发的Scripting,然后我就十分喜欢这个语言。之后我和Nicholas翻译了他的Reference Manual,不过一直没翻译完。剩下的转交给luachina去完成了。

本来我很想推广一下这门语言,即使拿来做研究也很好。Lua使用了一个Clean C来实现他的所有功能,所谓Clean C,就是一个十分精简的C语言,比ANSI还精简,这样可以达到很好的兼容性,Lua可以很方便的在各种C/C++语言编译器上完成编译,虽然他本身源代 码只包含了Unix的Makefile。而脚本的执行性能更是值得去好好研究。不过似乎大家都不感兴趣,不过好在WOW的成功,也把Lua带给了中国的开 发人员。

Lua本身并不支持基于类的面向对象,和JavaScript一样是基于原型的,有一些人实现了Lua的扩展可以模拟基于类的编程,不过我并不赞成这样,原因可以看我前面介绍Self的Blog

Self 语言

不知道各位是否研究过Self语言,我研究了一下,虽然连Self都没有能够运行起来,但是从中已经学习到了很多新的概念,而且对面向对象的精髓有了更进一步的领悟。

我希望和大家分享我学习到的内容,所以我翻译了两篇文章,大家可以看:
Self:简洁的威力
克隆的反攻

Io语言

“动态语言”现在是一个很时髦的术语,常用来表示那些编程语言十分地具有弹性而且很合适“敏捷”开发环境。在这种趋势背后有一些很有趣和很强大的语言,Io就是其中一个十分重要的语言。

Io最早发布在2002年,它混合了Lua、Lisp、Smalltalk和其他一些语言的某些方面的一个小语言。而起初的大想法是要把Io作为一个完整的可视化编程语言的基础,就像Self一样。

概览

Io属于“解释型”语言家族(像Perl、Python等等),这种语言的代码并不是通过编译而至直接解释并运行的。和很多“解释型”语言一样,Io也是高度动态的:一个程序可以迅速地生成并解释新的代码。同时,Io通过采用了Lisp的“代码即数据”的模型让这个特性向前迈进了一步,它可以让任何Io程序访问和处理它自身在内存中的对象模型。毫无疑问,这也让Io成为一个自省的语言。

并发编程在很多应用中都是一个新兴的被关注的方面,尤其是大多数用户界面和Web应用。Io从Act1中获得了灵感并使用了“参与者”(Actor)的概念。参与者介于线程和延续之间,它可以让你更容易编写你的并发应用,而原有的基于线程或者是进程编程的负担则不复存在。

简介清晰在Io的语法和他的对象模型中是显而易见的。语法可读性很好,而且看上去很好地结合了Lisp和Smalltalk。Io的对象模型是基于原型的。一个基于原型的对象模型不使用类来表示泛化和特化,取代的是创建特定的对象来用作“模型”或是“原型”并通过他们来创建新的对象。在这种编程范型中,对象是从原型中克隆出来的而不是从一个类实例化得来的。

对象模型是基于消息的,这表示方法调用甚至是变量访问都是通过发送动态的消息来完成的,而不是“硬布线”的(像C++和Java那样)。同时,Io对象响应消息的方式可以在运行时进行改变,这也是一个很典型的“动态”特性。

Io的足迹很小可以很方便地嵌入C或者是C++应用中。这方面它最有趣的特点之一是他的Objective-C的桥接器,这在集成上达到了一个令人惊奇的程度,在Io中使用你的Objective-C对象几乎不要写任何粘合代码。

Io分析

长处

Io的主要的优点来自他简洁的设计:它是一个可以很快学会的语言因为他有一个简单而且一致的语法、语义和API。由于Io的足迹小,所以它十分合适嵌入式编程。Io的另一个长处是它的速度。它能在性能上胜过很多其他解释型语言,这让他成为密集工作的一个理想选择。

Io的另一个长处——从一个嵌入的角度来看是很有意思的——是你可以重新定义几乎任何运行机制。Io语法中的任何东西都已经转化成了消息,而消息是可以在运行时重新定义的。从这方面来看,实际上你就可以改变里面任何东西来满足你的需求。

同时,Io对于并发编程的解决方案对于Web应用和GUI脚本编程也极具吸引力。

弱点

尽管Io有很多有趣和先进的特性,然而它还是十分年轻。到目前为止它还没有什么值得称赞的开发工具诸如文档生成器或者是代码检查器等等,而且在解释其上面仍然有一些问题。尽管如此,随着Io社群的不断壮大,更多的代码被制作共享,这个“青少年问题”会最终消失。

范例程序

参考

为什么PHP令人不爽(对于大型系统)

译者:本文其实非常老,大约是2002年的文章,主要针对的是PHP4的版本,其实文中很多问题都随着PHP的不断发展而解决了。有批评才有进步嘛。

Edwin Martin <edwin@bitstorm.org>.

翻译:ShiningRay @ Nirvana Studio

我在过去的四年里一直致力于PHP应用的开发。PHP确实十分容易编写。但是PHP也有一些十分严重的缺陷。

下面我会给出我的理由,为什么PHP不适合于比小型业余网站更大的网站。

1. 对递归的不良支持

递归是一种函数调用自身的机制。这是一种强大的特性可以把某些复杂的东西变得很简单。有一个使用递归的例子是快速排序(quicksort)。不幸的是,PHP并不擅长递归。Zeev,一个PHP开发人员,说道:“PHP
4.0(Zend)对密集数据使用了栈方式,而不是使用堆方式。也就是说它能容忍的递归函数的数量限制和其他语言比起来明显少。”见bug
1901
。这是一个很不好的借口。每一个编程语言都应该提供良好的递归支持。

2. 许多PHP模块都不是线程安全的

在几年前,Apache发布了Web服务器的2.0版。这个版本支持多线程模式,在这个模式下,软件一个一部分可以同时运行多个。PHP的发明者说PHP的核心是线程安全的,但是非核心模块不一定是。但是十次有九次,你想要在PHP脚本中使用这种模块,但这又使你的脚本不能合适Apache的多线程模式。这也是为什么PHP小组不推荐在Apache
2 的多线程模式下运行PHP
。不良的多线程模式支持使PHP常被认为是Apache 2依然不流行的原因之一。

请阅读这篇讨论: Slashdot: Sites Rejecting Apache 2?.

3. PHP 由于商业原因而不健全

通过使用缓存,PHP的性能可以陡增500%[见基准测试]。那么为什么缓存没有被构建在PHP中呢?因为Zend——PHP的制造者,它在销售自己的Zend
Accelerator
,所以当然,他们不想抛弃自己的商业产品这块肥肉。

但是有另一个可选择的: APC.
(Zend后来推出Zend Optimizer,免费的加速器——译者)

4. 没有命名空间

设想某个人制作了一个PHP模块用来阅读文件。模块中一个函数叫做read。然后另一个人的模块可以读取网页的,同样包含一个函数read。然后我们就无法同时使用这两个模块了,因为PHP不知道你要用哪个函数。

但是有一个很简单的解决方法,那就是命名空间。曾经有人建议PHP5加入这个特性,但不幸得是他没有这么做。现在,没有命名空间,每个函数都必须加上模块名作为前缀,来避免名称冲突。这导致了函数名恐怖得长,例如xsl_xsltprocessor_transform_to_xml让代码难于书写和理解。

5. 不标准的日期格式字符

很多程序员对 日期格式字符
都很熟悉,它是从UNIX和C语言中来的。其他一些编程语言采用了这个标准,但是很奇怪的,PHP有它自己的一套完全不兼容的日期格式字符。在C中,“%j”表示一年中的当天,在PHP中他表示一个月中的当天。然而使事情更混乱的是:Smarty
(一个很流行的PHP模版引擎)的 strftime
函数和 date_format
函数,却使用了C/UNIX的格式化字符。

6. 混乱的许可证

你也许认为PHP是免费的,所有的在手册中提到的PHP模块也是免费的。错了!例如,如果你想在PHP中生成PDF文件,你会在手册中发现两个模块:PDF
ClibPDF。但是这两个都是有商业许可证的。所以,你所使用的每个模块,你都要确保你同意他的许可证。

7. 不一致的函数命名规则

有些函数名称是有多个单词组成的。一般有三种单词组合的习惯:

  1. 直接拼接:getnumberoffiles
  2. 用下划线分开:get_number_of_files
  3. 骆驼法则:getNumberOfFiles

大部分语言选择其中一中。但是PHP都用到了。

例如,你想要把一些特殊字符转换成HTML实体,你会使用函数htmlentities
(直接拼接单词)。如果你要使用相反的功能,你要用到它的小弟弟html_entity_decode。由于某些特殊的原因,这个函数名是由下划线分隔单词。怎么能这样呢?你知道有一个函数叫strpad。或者他是str_pad?每次你都要查看一下到底这个符号是什么或者直接等他出现一个错误。函数是不分大小写的,所以对于PHP来说rawurldecode
RawUrlDecode之间没有什么区别。这也很糟糕,因为两个都使用到了同时他们看上去还不一样,混淆了阅读者。

8. 魔法引用的地狱

魔法引用(Magic quote)可以保护PHP脚本免受SQL注入攻击。这很好。但是出于某些原因,你可以在php.ini中关闭这个配置。所以你如果要写出一个有弹性的脚本,你总要检查魔法引用是开启还是关闭。这样一个“特性”应该让编程更简单,而事实上变得更复杂了。

9. 缺少标准框架

一个成长中的网站没有一个整体框架,最终会变成维护的噩梦。一个框架可以让很多工作变得简单。现在最流行的框架模型时MVC-模型,在其中表现层、业务逻辑和数据库访问都分离开了。

很多PHP网站不使用MVC-模型。他们甚至没有一个框架。甚至现在有一些PHP框架同时你都可以自己写一个,关于PHP的文章和手册没有提高框架的一个字。同时JSP-开发人员使用像Struts的框架、ASP开发人员使用.Net,看起来好像这些概念都广泛被PHP开发人员所了解。这就说明了PHP实际上到底是多专业。

总结

超载的汽车什么问题?

对于非常小的项目,它可以是一个十分符合人意的编程语言。但是对于较大的和更为复杂的项目,PHP就显出他的薄弱了。当你不断地摸索之后,你会发现我提到的某些问题的解决方案。所以,当解决方案已知之后,为什么不能修正他呢?另外为什么这些修补不在手册中提到呢?

一个开源的语言十分流行是一件好事。但不幸得是,它不是一个伟大的语言。我希望所有的问题能有一天得到解决(也许在PHP6?),然后我们就将拥有一个开源语言,他既开源,又好用。

到现在,当你要启动一个多于5个脚本页面的项目的时候,你最好考虑C#/ASP.Net 或者 Java/JSP或者也许Python同样是一个更好的选择。

在我写了这篇文章之后,一些人告诉我一些其他的类似文章: