翻译: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例子:
print "Hello World!"
或者,把它作为一个邮件消息发送给一个朋友:
send luke@rebol.com "Hello World!"
要直接从一个网站运行一个脚本
do http://www.rebol.com/speed.r
这个叫本会显示你的计算机有多快。
如果要查看脚本的源代码:
print read http://www.rebol.com/speed.r
如果要保存源代码到一个文件:
write %speed.r read http://www.rebol.com/speed.r
要在本地运行代码,你可以输入:
do %speed.r
当然,你可以用同样的方法保存任何网页:
write %page.html read http://www.rebol.com
要给一个朋友通过邮件发送一个网页:
send luke@rebol.com read http://www.rebol.com
要下载一封REBOL的拷贝,你要指明它是二进制的。像这样:
write/binary %rebol.zip
read/binary [...]
翻译: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 [...]
翻译: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的最终的目标是要为一切连接在互联网上的设备之间信息的存储、交换和处理提供一种新的架构。不像其它的方法需要几十兆代码,一层又一层的复杂结构,又只能在单一平台上运行,需要特定的编程工具,REBOL很小巧、很轻便、可移植并且易于管理。
REBOL应用程序(称为“reblets”)的大小很重要。不仅仅因为可以让他们只要几秒钟就下载完(即使使用调制解调器或者是无线网络)还因为reblets很小,他们就很容易创建、修改和增强。大多数REBOL应用程序,即使是很重要的能做很多事情的应用程序像建立网站、处理信用卡或者共享一个日历等等,都仅仅只有10-30KB。
例如,我们用来展示REBOL的图形化幻灯片展示程序只有9KB,他的效果像这样:
这里还有另外一个例子。这个用户状态和活动监视器只有7KB:
还想看更多的例子么?这里有几个不同的例子,用REBOL/View写的,这里还有一些“reblets”为IOS写的。几乎所有这些加起来都不超过30KB,但他们效率仍然很高,而且是分布式应用程序。
By Carl Sassenrath REBOL Technologies
翻译:ShiningRay @ NirvanaStudio
目录
介绍
数据类型的世界
集成网络操作
创建脚本文件
1. 介绍
REBOL是针对互联网通讯设计的。REBOL是一种高级解释语言允许你访问和控制互联网的资源,而且他的便捷让你可以开始考虑把互联网当成你的个人操作系统。你已经熟悉了如何使用浏览器在网上冲浪。有了REBOL,你可以编写互联网。
在REBOL总部我们用REBOL建立手册和文档(比如当前这个),生成全部我们的网站、自动上传页面和图像到网络上、发送邮件通知、处理信用卡、远程共享文件、跟踪客户订单、进行即使通讯、主持电子会议、自动更新软件、运行技术支持、管理我们的错误数据库、删除垃圾邮件、备份服务器、遍历网络、过滤网页广告、还有——最重要的——在42种不同的系统上构建REBOL。
每天我们在几十台机器上用数百个REBOL脚本给我们带来了极大的便利。我们只要一种语言就能完成所有的事情。就像一个神奇的魔术师,REBOL使我们这个小小的小组事倍功半。
这篇指南提供了使用REBOL的简要的介绍。如果你正在慢慢得阅读那份720页的REBOL手册,我们也很理解,谁会有时间把它全部看下来呢?抱着这种想法,这篇文档的目标是在20分钟之内给你一个REBOL的大体概念并且给出一些可以找到更多资料的链接。
2. 数据类型的世界
语言是建立在一系列基本的数据类型的基础上的,他们被用来构建一切的其他东西。整数和字符串都是数据类型的例子。大多数语言有大约5种或者6种数据类型。相反,REBOL有45种数据类型。这种结果是很多任务下你可以关注于你的程序要做什么,而不是如何去做。
例如,所有的语言都可以让你对数字相加:
101 + 10
然而,在REBOL中,你可以一样很容易的加减时间、日期、货币、元组和坐标。这里有一些例子,还有他们的结果:
10:55 + 0:10
11:05
1-Jan-2001 + 100
11-Apr-2001
.55 + 0
0.55
100.30.5 + 100.5.5
200.35.10
100×200 + 100×40
200×240
注意你不需要包含(include)任何文件,使用引入(import)语句,或者进行函数声明。他们是语言中的基础部分。
同时注意你使用同一种记号来相加各种类型。大多数函数都可工作于多种数据类型上。他们是多态的;他们可以和多种数据类型一起工作。结果是什么?你将变得更高效,却无需让你的程序变得更复杂。简单的东西就应该让他简单。
这里是另一个例子,它搜索第一个字符串中出现的第二个字符串:
find “World Wide Reb” “wide”
同样的搜索操作也可以操作其他数据类型,比如电子邮件地址,URL,文件,标签,序列号,二进制和块:
find user@widetire.dom “wide”
widetire.dom
find http://www.rebol.com/wide/range.html “wide”
wide/range.html
find %/c/files/wide.txt “wide”
%wide.txt
find #ABC-WIDE-02120 “wide”
#WIDE-02120
find #{746865207769646520776F726C64} “wide”
#{7769646520776F726C64}
find [123 10:30 "wide" 1-Jan-2001] “wide”
["wide" 1-Jan-2001]
对REBOL的其他35种数据类型感到好奇了?在控制台下面输入这一行来把他们都列出来:
help datatype!
过着看一下REBOL指南的值附录。
3. 集成网络操作
作为“互联网操作系统”的脚本语言,你需要能访问互联网的协议就像操作文件一样简单。REBOL已经内置了14种标准协议,也不需要包含文件或者函数声明。你只要使用他们。
例如,要从你的硬盘上读取并显示一个文本文件,你可以写:(注意百分号在REBOL中表示他是一个文件名。这必须出现来防止REBOL把他认作是一个REBOL单词。)
print read %datafile.txt
你可以一样简单的使用各种不同的协议从网路上读取文本。下面几行例子展示了他做了什么:
read http://www.rebol.com/index.html
(从网上读取一个HTML页面)
read ftp://ftp.rebol.com/test.txt
(使用FTP下载文件)
read pop://fred:pass@example.com
(读取所有的邮件消息,但不删除它们)
read nntp://news.example.com/alt.test
(从一个新闻组读取所有的发帖)
read whois://example.com@rs.internic.net
(读取一个互联网域的信息)
read finger://username@example.com
(返回关于一个用户帐户的信息)
read daytime://everest.cclabs.missouri.edu
(从一个服务器上读取时间)
read dns://
(返回你本地机器的地址)
如果你自己要实验这些代码,只要在这些read的前面加上一个print并且给出一个有效的URL信息。注意如果你使用了一个防火墙,你需要设置你的REBOL代理设置来看到结果。当然,这些例子仅仅是一个开始。还有很多其他特性可以使用。例如,要从一个网站读取一个图像并且把他存到磁盘上的一个文件中:
write/binary %link.jpg [...]
JavaScript:世界上最被误解的语言
Douglas Crockford
www.crockford.com
原文地址:JavaScript: The Wrrrld’s Most Misunderstood Programming Language
翻译:ShiningRayhttp://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语言,也许几年前大家都没有听说过,他是巴西人开发的一个十分高效的动态语言,针对的就是嵌入在宿主程序中做扩展应用。
说他高效,是和很多其他动态语言相比,如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:简洁的威力
- 克隆的反攻
“动态语言”现在是一个很时髦的术语,常用来表示那些编程语言十分地具有弹性而且很合适“敏捷”开发环境。在这种趋势背后有一些很有趣和很强大的语言,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社群的不断壮大,更多的代码被制作共享,这个“青少年问题”会最终消失。
范例程序
BaseObject := Object clone do(
demo := method(“Inheritance Demo”))
Parser := BaseObject clone do(
parse := method(line,
words := line split(” “)
words foreach(word, writeln(word))
words count
))
filename := args at(0)
if (args count < 1) then (
writeln(“Enter a filename: “)
filename := File standardInput readLine
)
file := File clone openForReading(filename)
while (line := file readLine, Parser parse(line))
file close
参考
Io语言主页
基于原型编程
解释型语言性能比较
Io语言中文站
译者:本文其实非常老,大约是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. 不一致的函数命名规则
有些函数名称是有多个单词组成的。一般有三种单词组合的习惯:
直接拼接:getnumberoffiles
用下划线分开:get_number_of_files
骆驼法则: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同样是一个更好的选择。
在我写了这篇文章之后,一些人告诉我一些其他的类似文章:
Experiences of Using PHP in Large Websites
“PHP in contrast to Perl”
I hate PHP
PHP Annoyances