一些语法十分"烂"的语言现在嫣紫嫣红,但一些语法明了的语言却无人问津……
一些效率十分"低"的语言现在叱咤风云,但一些效率较高的语言却一跌千丈……
*以下均以ECMAScript语法为基准来说明
语言名称 |
语言的"烂" |
Ruby |
-
变量的命名规则:
-
以小写字母、"_"(下滑线)开头:变量(Variable)。
-
"$"开头:全局变量(Global variable)。
-
"@"开头:实例变量(Instance variable)。
-
"@@"开头:类变量(相当于类的属性,Class variable)。
-
大写字母开头:常量(Constant)
这样的规则会遇到一些问题:
-
有些固有名词是必须大写的,但根据命名规则却不得不小写,使程序难以阅读。
-
不能使用非字母、 "_"(下滑线)的字符,这对有些e文不好的人来说是灾难。(虽然本人一贯用e文)
-
类型的转换
在Ruby里
-
Instance.toString()是Instance.to_s。
-
Instance.toArray()是Instance.to_a或Instance.to_ary。
-
Instance.toInteger()是Instance.to_i。
按照这种命名规则,就可以推出:
-
Instance.toSource() => Instance .to_s
-
Instance.toStream() => Instance .to_s
问,谁能读懂?
-
块(block)
Ruby有以下多种块
-
then...end
-
begin...end
-
{...}
问同样是块,何必需要分多种形式?
-
还有多重赋值、类的定义等不胜枚举。
-
效率就不必说了,慢中的慢。
-
难以Debug
-
它会使Java灭亡?白日梦!取代PHP、Perl就不错了
|
PHP |
-
语法比Ruby好一点,但还是不明了。
-
HP没有原生支援Unicode或是多位元字集(例如中文、日文、韩文等需要用两个以上ASCII字符来表示的字集),导致用PHP写的软件在国际语言化上遇到相当多的困难。
-
PHP没有名字空间(Namespace)的设计,降低了PHP语言设计上的弹性,也导致函数名称过长的问题。
-
PHP的函数命名规则非常的混乱,许多函数功能类似,但是却使用不同的函数名称和参数顺序,例如strpos($haystack, needle) 和 in_array($needle, $haystack)、strcasecmp 和 stristr,导致编写PHP程序时需要做相当多的手册查询工作,初学者也往往不知不觉重新编写已经内建的函数,降低了开发的效率。
-
PHP的魔术引号(magic quotes)功能可以自动处理使用者输入字串中的跳脱字符,有效避免SQL隐码攻击(SQL injection),但是因为不是每个使用者的输入都会写入到数据库,处理这些没有写入数据库的字串便浪费了效能。此外不是每个PHP环境都会开启魔术引号,程序设计时需要便需要对不同的服务器环境做因应,造成程序设计上的麻烦。
-
有些PHP的延伸函式库不是执行绪安全(threadsafe),导致PHP安装在多执行绪的服务器例如Apache 2上会发生不稳定的状况。
|
VB |
-
=运算符
在if里是表示判断是否相等;在其他地方却是赋值。
同一个运算符却又两个意思!
-
VB并不是非常简便,它开发的程序只能运行在Microsoft Windows中。
-
档案太大了。Visual Studio要用好几张盘才能装下。VB程序在运行时候还需要一个1.4M大小的运行库。
-
IDE中有错误。
-
VB不能很好的综合Windows的基础API,很多时候要使用低级运算的“小伎俩”来进行编程。而C语言的低级内存运算比VB的要简单得多。
-
很多程序员对VB程序的品质有强烈的反感。很多人认为VB不配他们使用,认为它是一种给儿童和菜鸟程序员的语言。它自从设计开始就是一种简单的语言。一些C++和Java中的特性在VB中并没有出现。在感受开发的方便和快速的同时,一些类似于编译时进行类型和声明检查的功能在默认情况下是关闭的。这样一些程序员一边感叹VB-的易用性,一边沮丧地地看着一些类似于“未定义类型”错误的发生。
-
一些批评家认为VB的简单特性使得其在未来具有伤害性。很多人自学了VB,但是并没有学到好的编程习惯。当VB进入课堂的时候,学生们不会学到很多 基础的程序技术和结构,因为很多技术已经包含在那些对用户可见的组件里面了。不用学习标准的编程习惯,因为VB具有可视化的特性,所以导致了一些莫名其妙的代码的产生。而且很多错误和警告的检查默认情况下都是关闭的,程序员很难找到隐藏的错误。有经验的程序员在用VB编程的时候都会把这些选项打开。
-
很多批评家批评微软简单地拷贝了BASIC的思想到VB中。著名的计算机科学家Edsger Dijkstra说过一句名言:“如果一个学生最早学过BASIC,那么几乎不可能让他学会优秀的编程:因为这些人已经放弃了涅磐的希望。另外一个笑话是:“真正的程序员不用BASIC。12岁以下的孩子才用。”
|
Python |
说实话,我并不对它特反感,反而认为它的语法漂亮。但一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言是用一对花括号{ }来明确的定出模块的边界的,与字符的位置毫无关系)。
但代码经常会拷贝/粘贴,但缩进有可能出错(比如网上的代码)。但因为没有明确的块语句,使得程序员难以知道那里是结束等。 |
Java |
Java的多层结构
以前只有1层,后来Struts出来後有了MVC(Model View Controler),接着又出来了一个O/R Mapping的持久层。表面上看来这样很好,但其实不然:
比如现在画面上有一个有名字、密码的From。现在要求添加一个邮件地址的输入框。改动的结果是:View层要添加一个输入框;Controler层要添加一个邮件地址的处理;Model层要添加邮件地址的空间(Bean等);持久层要添加邮件地址的O/R Mapping;数据库要添加邮件地址存放空间。结果一个小小的改动五个层全改了。
Java的Bean
一个Java程序里大约1/4的类是Bean。Bean的结构实在是太简单了。几个private的变量,以及相应的getter/setter。要写它的工程量不小。为怎么不用动态?
其他
Java试图通过新的方式解决软件编写的复杂性。很多人认为Java语言做到了它承诺的一切。但是Java并不是一门完美的语言,在编程风格、编程环境和需求方面并没有获得全球性的认可。
-
-
并不是所有的工程和环境需要企业级别的复杂性,比如一个简单的个人网站或者独自编程的程序员所写的程序。这些程序员会发现Java的复杂管理对于自己要做的程序来说过于强大了。
-
Java经常让那些并不是对面向对象编程很热心的程序员感到不满。
-
一些人觉得Java在面向对象上面做的没有Ruby和Smalltalk纯粹。但是最新出现的用Java实现的语言Groovy解决了这些问题。
-
作为一种已经建立的新技术,Java显然综合了很多语言的特性,比如C++、C语言、Python等等。一些对于Java的评论认为Java的不变性在动摇,有些人认为Java只是一种“新的COBOL"语言。
-
-
有些程序员不喜欢原始类型和类的分离,尤其是那些曾经使用过Smalltalk和Ruby的程序员。他们会问:“这就是一切皆对象?”
-
事实上,JAVA语言本身只是Smalltalk的一个不完整的代替品。JAVA的流行与SUN背后的支持分不开。
-
Java的代码相对于其他的代码来说过于冗长,这与它的轻便化声明相违背。
-
Java语言在单范例程序方面非常出色。历史上的Java则在这方面做的不好。
-
Java是一种单层继承的语言。这也导致了程序员在试图使用多重继承时候的不便,而很多语言都可以使用这个特性。但是Java可以使用接口类,把多重继承可能导致的风险减少到最小。
-
Java不支持运算符重载,这是为了防止运算符重载使得代码的功能变的不清晰。但是用Java实现的语言Groovy可以进行运算符重载。
-
准确地说,JAVA不是平台无关的,它本身就是一个平台。
使用Swing平台编写的带有GUI(图形用户界面)的程序和其他原始程序非常不同。选用AWT工具包编写程序的程序员看到的都是原始界面,而且也无法获得先进的GUI编程支持,如果使用的话,就要提供每个平台上面所需的API,这将是一项庞大的工 程。Swing则是完全用Java语言所写的程序,避免了界面元素重复的问题,只使用所有平台都支持的最基本的绘图机制。但是很多用户不知道如何在 Java风格和Windows风格之间进行转换,结果造成了Java程序的界面在很多程序中非常特殊。苹果电脑已经提供了优化过的Java运行时程序,包含了Mac OS X的经典Aqua界面风格。
Java语言的一些特性不可避免的有额外的性能代价,例如数组范围检查、运行时类型检查等等。Java程序的性能还会因为不同的动态复杂性和垃圾处 理机制使用的多少而各有不同。如果JVM的实现比较优化的话,那么这些功能甚至可以增加内存分配的性能。这和总是使用STL或者托管C++的程序的情况类似。
尽管如此,仍然有许多人认为Java的性能低。这部分归因于Sun公司最初的JVM实现使用未优化的解释机制来执行字节码。一些新版本的JVM使用Just-In-Time(JIT) 编译器,在加载字节码的时候将其编译成针对运行环境的本地代码来实现一些本地编译器的优化特性。Just-In-Time机制和本地编译的性能比较仍旧是 一个有争议的话题。JIT编译需要很多时间,对于运行时间不长或者代码很多的大型程序并不适宜。但是不算JIT编译阶段的话,程序的运行性能在很多JVM下可以和本地编译的程序一争短长,甚至在一些计算比较密集的数值计算领域也是这样。目前,Java已经使用更先进的HotSpot技术来代替JIT技术,Java的性能有了更进一步的提升。
Java的设计目的主要是安全性和可移植性,所以对于一些特性,比如对硬件架构和内存地址访问的直接访问都被去除了。如果需要间接调用这些底层功能的话,就需要使用JNI(Java 本地接口)来调用本地代码,而间接访问意味着频繁调用这些特性时性能损失会很大,微软的.NET平台也有这样的问题。所以到目前为止,性能敏感的代码,例 如驱动程序和3D视频游戏,还是大多使用本地编译,甚至直接以不直接支持面向对象的C语言或机器码编写。 |
没有评论:
发表评论