`
halfmile
  • 浏览: 12004 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

我喜欢Ruby的原因

阅读更多
刚看到“姜太公”说开始不喜欢Ruby,读了一遍帖子,觉得。。。青菜萝卜各有所爱吧。

本想跟贴讨论,但觉得那样的争论很无谓,毕竟代码说明问题

Java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test 
{
    public static void main(String[] args)
    {
        try {
            BufferedReader in = new BufferedReader(new FileReader("test.txt"));
            StringBuffer sb = new StringBuffer();
            String str;
            while ((str = in.readLine()) != null) 
              { sb.append(str + "\n"); }            
            in.close();
            String result = sb.toString();
            Pattern sentencePattern = Pattern.compile("(.*?\\.)\\s+?");
            Pattern javaPattern = Pattern.compile("Ruby");
            Matcher matcher = sentencePattern.matcher(result);
            while (matcher.find()) {
                String match = matcher.group();
                Matcher matcher2 = javaPattern.matcher(match);
                if (matcher2.find())
                    System.err.println(match);
            }
        } catch (IOException e) 
          {
            e.printStackTrace();
          }     
    }
}


Ruby
File.read('test.txt').scan(/.*?\. /).each { |s| puts s if s =~ /Ruby/ }


这个可能不怎么说明问题。在程序里面,经常会用到xml数据容器,那么

要表达:

  <node name="a">
      <node name="b">
          <node name="d"/>
          <node name="e"/>
      </node>
      <node name="c">
          <node name="f"/>
          <node name="g"/>
          <node name="h"/>
      </node>
  </node>


*在 Java 里*

Tree a = new Tree("a");

Tree b = new Tree("b");
Tree c = new Tree("c");
a.addChild(b);
a.addChild(c);

Tree d = new Tree("d");
Tree e = new Tree("e");
b.addChild(d);
b.addchild(e);

Tree f = new Tree("f");
Tree g = new Tree("g");
Tree h = new Tree("h");
c.addChild(f);
c.addChild(g);
c.addChild(h);


* 在 Ruby 里 *
tree = a {
            b { d e }
            c { f g h }
          }


这里例子都是搬来的,更多在http://www.rubyrailways.com/sometimes-less-is-more
分享到:
评论
130 楼 crazy.j 2008-04-24  
我说句实在话。。。。。。能赚到钱就是好东西
129 楼 robbin 2008-04-24  
mcpssx 写道
1,我在这里重申,我并没有说ruby一无是处,而是指出这东西就跟C++一样,是一个因为特性太多导致难于驾驭的东西,特别是针对团队而言,这时候起作用的就是木桶理论。

14年前,我刚毕业做开发的时候,用clipper做mis,这是dbase公司的工程师出来开发的一个编译性的产品,这其中就有闭包
bBlock := { |nArg| nArg + 1 }
        ? EVAL(bBlock, 1)    

应该大家都是学习smalltalk带来的语法,这玩意 不能说没用。
后来主要做AutoLisp和 c++的CAD处理,什么watcom c++ , high c++

后来2000年左右炒股浪潮中,喜欢上了“分析家”,跑到了金融行业,就是现在大智慧新一代的前身

那时候觉得分析家公式体系思想不错,就想自己玩一个,开始研究lex/yacc, coco/r之类的分析器,最后觉得不如借用现有脚本,

先用python,后来发现了ruby,因为ruby的操作符重载,语法确实比python容易作为实现分析家公式系统,这大概就是现在的DSL吧?那时候rails连个影子都没有。

其实很多人都把各种语言用在金融计算,比如国内的ocaml.cn的创建者就是一个做系统交易的,而“之乎者”在闽发当年大谈江恩理论,当时写了个半成品的分析软件,然后跑到了加拿大写了个blogtrade后来改名AIOTrade,现在好像在写Erlang, Scala的IDE。
还有什么J语言,K语言等等。

我以为,web开发最好不要投入太多精力去搞各种花样,最好用在其他更有意义的地方。



我一看到程序员晒老皇历就觉得特有意思,要不我也晒晒17年前我在286上面玩汇编的经历?

128 楼 robbin 2008-04-24  
mcpssx 写道
谢谢,还好我用ruby的时候rails这个框架恐怕还没出来,我可以告诉你,包括D语言,ocaml,erlang,scheme我都玩过,而且绝对是国内根本就没有流行的时候,还有各种稀奇古怪的比如kdb+,K语言。


拜托你看清楚一点:

robbin 写道
否定ruby的人以mcpssx,自言自语为首都是那种根本没有ruby实际开发经验


我还可以告诉你,我玩过的语言不下30种,很多语言你听都没有听过,但是这不代表我掌握了这种语言,更加不意味着有这种语言的实际开发经验。

引用

2、你说的前面那个人的观点已经被我反驳掉了,他本人也承认自己观点错了,你还拿这个作为例证,不觉得挺无聊吗?
================================================================
对不起,我没看出来,大概你是强制要求你不是用open class,把一个类的方法都写在一块 吧!
那我就不太明白了,大家说的open class 这么好,你真么没有用呢?


有这么一个人,他很迷恋飞机的速度,以至于他每天上班,都和别人说,飞机多快阿,你干吗不做飞机上班呢?你为什么强制不做飞机呢?为什么非要做公交车上班呢?那我就不太明白了,大家都说做飞机多么多么快,你真的不做飞机上班吗?

知道什么叫高射炮打蚊子吗?一个model就那么点逻辑用不着open class,除非你吃饱了撑的,非要做飞机上班,然后一边说:你看你看,做飞机上班多麻烦阿,还要去机场,还要安检,还要候机,看到没有,这说明做飞机是不合适的?你说这是怎么回事呢?


引用
3、编程语言火不火和社区关系不大,国内用C/C++的人多的很,你看见哪个C++论坛火了吗?
=======================================================================
当然有了,比如国内cppblog, vckbase都有很高质量的文章,我今天刚查了一下googlep排名居前的ror论坛


嘿嘿,偷换概念玩的挺熟! JavaEye也有大把很高质量的Ruby文章。而且JavaEye的流量比那两个网站大得多。

引用
你这种代码是有严重的问题的,一旦程序执行到中间出错退出,数据库连接就无法被正常关闭。你之所以一直没有碰到问题是因为你开发的系统没有遭遇大并发和高负载,算是走狗屎运罢了。
========================================================================
这样说的话,走狗屎运的是java, 那不如当初都去用asp,因为当时asp,php,jsp中只有asp的connection是ref count一定会自动关闭的,而当时java的connection等等都是必须显式关闭。

按照你的逻辑,ruby那就更加是中大奖了,因为Rails压根就不需要关闭数据库连接,我就是一直开着。关闭都省了。
127 楼 gigix 2008-04-24  
引用
我重申一点,我以为ruby之类是个人应用的一个也许还可以的工具,但绝对不是集体项目开发的选择。

(耸肩)
北美的一大堆客户都要求用Rails来做他们的项目
咱们就看看中国会用多长时间来跟上北美的风潮吧
从前人们说Java不行的时候,说.NET不行的时候,不都是一样的历史不断重演么
rubynroll 写道
那个甲方乙方的问题,你就不用当心了,客户不同意,是不会有人硬把ruby/rails塞给客户的。关键是,你有尝试让客户了解ruby/rails么?

历史一再证明,客户会强迫厌恶变化的程序员们不得不面对变化或者转行并且抱怨程序员是一碗青春饭没法吃到三十五岁
IT行业的好处是它让历史在很短的时间里重演,不过即便只是短到10年的历史也有很多人记不住
126 楼 rubynroll 2008-04-24  
看来胡搅蛮缠很有意思啊,huh?

“代码行数少未必就能写出易维护的代码,那要看谁设计谁写的..." -- 胡搅蛮缠!

“ruby和ror现在一个问题是业界和用户接受程度上还没有广泛经受住考验...” -- 这有关系么?

那个甲方乙方的问题,你就不用当心了,客户不同意,是不会有人硬把ruby/rails塞给客户的。关键是,你有尝试让客户了解ruby/rails么?

“ror现在是小男孩裸奔,两三年后我们再回过头来看看他是好汉还是孬种吧” --胡搅蛮缠!

“比较两种语言的优劣还是很值得的...” -- 我们不是在比较语言的优劣吧?我们始终在讨论的是ruby这种语言的一些特性会对表达带来什么影响,以及rails这种框架对软件开发方法有什么特别的地方(例如一些人提出当心xxx问题在rails下其实不会yyyy...)。

“吵架生哪门子气太没必要了,生气了难道java代码就能够少几行” -- 不生气,我不写java代码。
125 楼 seemoon 2008-04-24  
说说我的看法:语言简洁度、灵活性、方法包的丰富性这些ror无疑要强于java,这点毋庸置疑,不然java就不会考虑搞个jruby或groovy来模仿了,正是因为先进才要将这些特性引入java当中,如果落后那何必要多此一举呢?搞java的人又不是傻x;代码行数少未必就能写出易维护的代码,那要看谁设计谁写的,你的项目组有几个蹩脚的初级程序员整天给你添乱我看你还敢不敢把代码少成天挂在嘴上;ruby和ror现在一个问题是业界和用户接受程度上还没有广泛经受住考验,毕竟是新生不久的事物,从乙方角度来说,你找java程序员肯定比找ror程序员容易得多,你是java程序员现在你捧个饭碗吃几口饭也容易得多;从甲方角度讲,接受一个java做的erp或crm比接受一个ror做的要多得多,要不你去拿ror架构现在去竞争一个电信项目看看?ror现在是小男孩裸奔,两三年后我们再回过头来看看他是好汉还是孬种吧。不过,比较两种语言的优劣还是很值得的,理越讲越明嘛,吵架生哪门子气太没必要了,生气了难道java代码就能够少几行?哈哈。
124 楼 potian 2008-04-24  
业余有啥不好的,C,Unix就是业余搞出来的,基本上就是为了个Space Travel游戏跑得快一点
123 楼 robbin 2008-04-24  
其实喜欢不喜欢某种编程语言是一件非常私人偏好的事情,比方说我最喜欢的编程语言是Unix Shell,但是我喜欢Shell并不意味着Shell就是工业主流编程语言,也不意味着Shell是一门全球使用者最多的编程语言。因此这种讨论本来无对错之分,只有口味偏好差别而已。

但是很明显,否定ruby的人以mcpssx,自言自语为首都是那种根本没有ruby实际开发经验,甚至连ruby语言都不了解的人,而反驳他们的人当中liusong,gigix都至少在Java和Ruby两个领域有丰富的开发经验,于是讨论就变成了科普了,热闹则热闹,但是没有什么技术含量。当然这也不是没有一点意义,起码可以澄清很多偏见,让别人看清楚问题的所在。

mcpssx 写道
1,脚本语言缺乏类型信息,对大型程序不利,
所以javascript 2.0开始加入可选的类型声明,python也开始加入参数注解

2,ruby语言过于灵活,类可以任意在任何地方添加方法,还有method_missing之类的东西,正如前面有人指出的,你不清楚那个写了类声明的文件是否包含类的所有方法

3,时间对rails不利,目前国内发展2年任然没有火起来,光看几个ruby论坛就知道人气了


1、理由很可笑,Yahoo网站,Facebook网站,MySpace网站全部用PHP开发,是不是大型程序?怎么不利了?

2、你说的前面那个人的观点已经被我反驳掉了,他本人也承认自己观点错了,你还拿这个作为例证,不觉得挺无聊吗?

3、编程语言火不火和社区关系不大,国内用C/C++的人多的很,你看见哪个C++论坛火了吗?


自言200801 写道
我们以前写PHP的时候从不关心disconnection是否正常关闭的,现在系统用了5年啦,还在用,
disconnection相关的问题没碰到过。
数据库不是长连接,一般都是在<body>前放个connection(),在</body>后放个disconnection,
具体细节我不清楚啦,都3年不去搞PHP啦,即使是这样反反复复的connection()与disconnection,
系统性能还是很快的。


你这种代码是有严重的问题的,一旦程序执行到中间出错退出,数据库连接就无法被正常关闭。你之所以一直没有碰到问题是因为你开发的系统没有遭遇大并发和高负载,算是走狗屎运罢了。

自言200801 写道
php、ruby似乎有个共同点,创始人都是业余的,语言和库都有点“补丁化的味道”,杂乱就是啦。

php、ruby/Rails都是鼓励“个人英雄主义”的,巴不得一个项目只要一个人就能搞定,
对于开发速度、部署来说,php还是快一点的,以前写PHP时,写完直接刷新浏览器看看就行啦,从不写什么单元测试的。


吵架的最高境界莫过于贬低对方的为人和水平,他水平那么差,怎么可能做出来好东西? 高,真是高!

看来不写单元测试就是提高开发速度的独门秘籍阿,貌似你还不知道Perl,Python,Ruby但凡脚本语言都可以直接刷浏览器的吧?孤陋寡闻了不是。


122 楼 7thbyte 2008-04-24  
还有啊

力挺ruby,ror的人,一大半是从java转过来的。

倒是好多反对的,一直在臆测,猜想,妄下评论。

凡事都是有理由的吧,既然有这么多支持的声音冒出来,未去尝试就站出来反对

想表达什么,又表达不出什么。这是何必呢
121 楼 7thbyte 2008-04-24  
呵呵 简单通俗一点说

引用

Array array1 = new Array(); 
array1.add( "cat" ); 
array1.add( "monkey" ); 
array1.add( "goat" );


这样的代码以从人类的自然思维看很是龃龉,于是乎多写几遍就烦了。

于是乎下一遍时开始复制粘贴。
复制粘贴来粘贴去,结果还是有一样忘记把array1改成array2。

测试到的时候自然是出错了。
于是就在数千行的“规范代码”汪洋大海里苦苦寻找。。

这种景象我是经常见到的呢

Ruby语法有什么深层次学问且不论,写起来至少不容易烦。
达到烦的底线要比java低很多

窃以为,代码再怎样,还是人敲出来的。无论语法如何,编译器如何,能在编写时就减少错误的语言,可算好语言。
毕竟语言这种东西,还是要有点人性的。

某些团队想抹杀人性,把人变成编码机器,办事哲学问题,这个就不议论了。
120 楼 liusong1111 2008-04-24  
引用
很明显多出来的就是class PrintFunction implements UnaryFunction这一行。


很明显多出来的不止这一行。我前面问你的 public double handle(double i) { 算不算额外的代码,你避而不答。 现在我继续问你public Object execute( Object object ) {算不算额外的一行代码?
你给出的java代码完成的并不是rubynroll那段ruby代码的功能,你在代码中一直回避s变量的访问问题(你能不能针对rubynroll的代码,写出真正能跑的java实现呢?),而又一次重申这个空理论:

引用
这个问题已经解释过了,对象是携带过程的数据,闭包就是携带数据的过程,因此环境变量是通过类成员变量携带的。


这种讨论没劲就没劲在,对于基本原则双方就没达成一致. 我再重申下我的讨论基础:

引用
比较编程语言不应该在他们的原始能力上进行比较,因为从理论上任一图灵完备的语言都能满足该要求。

通俗的说,请不要再跟我掰扯这些语言能不能做到的问题,理论上都能做到(你对自己支持的东西连这点信心都没有吗?).要比的是能不能做得好.
所以,你上面那段空理论,如同对我说"程序无非是数据+算法"、"所有语言最终都会转成机器码来跑"...一样,没有任何意义。

你的PrintFunction没有写成静态内部类,这样需要新建一个PrintFunction.java文件出来,对吧?可惜你连匿名内部类都不用,怎么接rubynroll的招?

你前面贴的:
Array array1 = new Array();
array1.add( "cat" );
array1.add( "monkey" );
array1.add( "goat" ); 


后来改良成:
Array ar = new Array("1","2","3"); 


这个Array类是jgl提供的,jdk本身不提供. 对于jdk,要组装成可变长数组,通常做法就是第一种. 而第二种写法之所以能做到,也是借助了jdk5.0后才有的变长参数,不然,顶多也就简化成:
Array ar = new Array(new Object[]{"1","2","3"});


那么,在达到相同的原始功能的前提下,进行语法改进没有意义吗?
你这几行代码要用到泛型的话,代码就更长了,现在的代码其实没用上编译器检查带来的好处。

拿jdk1.4及之前的语法,如你改良前代码,需要4行,连续调3次add方法。
而这个功能用自然语言的精确描述是:构建一个最初包含"1","2","3"的数组。
你改良后的代码就能很明确的表达这个含义,而改良前的代码直接读起来是:初始化一个空数组,依次加入"1","2","3"。
哪个更易读懂呢?

我前面说了,消除重复性很多时候不是”封装“这种手段所能解决的,封装依靠的基础还是语言能力。为什么明明是”最初包含“的语义,却要使用"连续add"的语义表达呢?你怎么封装从而消除这个不必要的add语义呢?
下半部份代码用自然语言描述是:对于数组中的每个元素,依次打印s和该元素的连接结果。看看用jgl会引入什么?要想个有意义的类名如PrintFunction,要知道实现UnaryFunction(一元函数)接口,要实现execute方法。这些语义,是自然语言所描述的功能必须要引入的吗?当你在execute里使用 调用环境的局部变量时,尤其想改局部变量内容时,再看看java实现有多少不必要的局限。开发者不是傻子,比比代码行数,想想要记住Unary,execute,就该清楚为啥JGL这些东西没有被普遍使用。

引用
我觉得你这个4行代码和14代码相当可笑,我们比较代码是比较有意义代码


我前面也说了,如果一个大的工程里,仍然可以保持这么高的对应比例(你那14行可没完成4行完成的东西),那有没有意义呢?
为什么不举看起来”有意义“的例子?因为要保证话题足够小。我想跟你比较ActiveRecord和hibernate的代码,看形势你玩过ActiveRecord的可能性很小,想想就觉得没劲。

再重复一遍:
引用
推导一下:复制粘贴是产生重复代码的主要根源,重复代码是坏味道的主要表现,去除坏味道是重构的主要目标,重构是增强易维护性的主要手段。

大量缩减代码行数很重要,直觉还是知觉?
直觉是大大提高了开发效率,可读性也更好(由上,去除了非必要语义)。很多模式缩减为语义、惯用法。
推论是由于消除了重复,最终大大提升可维护性。重构的必要性和波及规模大大缩减。
另外IDE的支持也很强,语法检查、outline、调试、导航、code assist、inline doc。。。用用就知道了。

至于一种问题多种解决方式的疑问,对比上面就知道,应该给谁扣这个帽子。


我没有耐心继续讨论了,该分享的也都说了。特请下个打手上场。


119 楼 rubynroll 2008-04-24  
mcpssx 写道

我觉得你这个4行代码和14代码相当可笑,我们比较代码是比较有意义代码,....


从你的话里理解,是不是说,多出来的那些都是“没有意义”的代码? 这看起来很有道理,ruby就是提倡少写废话代码。

118 楼 rubynroll 2008-04-24  
mcpssx 写道
在这里,闭包里面可以访问外部的s,不知java如何实现?

我记得在其它地方有看到有人曾经质疑过闭包里面访问绑定是环境对象的行为是否有必要,我觉得十分必要,特别是在编写GUI程序时,特别有用,能使代码高度“内聚”。
========================================================================
这个问题已经解释过了,对象是携带过程的数据,闭包就是携带数据的过程,因此环境变量是通过类成员变量携带的。





饶恕我这个对java不是很通的人刨根究底....你的类是怎么携带这个环境的?你不会是指为要访问的所有外部变量逐一声明类成员,然后逐一赋值,然后再...吧?我希望你给出一个真正的“机制”来解释java如何实现闭包功能,就象前面那个forEach就很漂亮。

117 楼 rubynroll 2008-04-24  
mcpssx 写道


我觉得你这个4行代码和14代码相当可笑,我们比较代码是比较有意义代码,不是看多了一个{就算一行吧?那你还要敲end呢,这也算3个字母吧?
这样吧,我这么写

Array ar = new Array("1","2","3");
forEach(ar, new PrintFunction());
class PrintFunction implements UnaryFunction {
  public Object execute( Object object ) {
    System.out.println( "PRINT " + object );
    return null; // Not used.
  }
}
你看行数是不是一下又少了不少?

很明显多出来的就是class PrintFunction implements UnaryFunction这一行。



比代码行数的意义在于,可以看出一个语言特性到底对表达方式带来什么样的影响。

我都说过了不计较4行和14行的区别,你反而来较劲...不如你把那些java代码都塞进一行里面,然后说,你看我一行就可以了!
116 楼 Teal'c 2008-04-24  
mcpssx 写道

E公司现在也不用Erlang
Erlang目前还是概念性产品,商业公司不是咨询公司,不会冒险做革命先烈

The research has resulted in the development of a new programming
language (called Erlang), together with a design methodology, and set of
libraries for building robust systems (called OTP). At the time of writing
the technology described here is used in a number of major Ericsson, and
Nortel products. A number of small companies have also been formed
which exploit the technology.

...

No theory is complete without proof that the ideas work in practice. To
demonstrate that these ideas work in practice I present a number of case
studies of large commercially successful products which use this technology.
At the time of writing the largest of these projects is a major Ericsson product, having over a million lines of Erlang code. This product (the
AXD301) is thought to be one of the most reliable products ever made by
Ericsson.

麻烦讲话之前做做功课。虽说论坛上讲错话不用负责任,可是连了解都没有了解就大放厥词是在让人讨厌。
115 楼 gigix 2008-04-24  
mcpssx 写道
我坚决不同意你这一点
1,E公司当时是Erlang创始人在公司的时候才用的
2,E公司现在也不用Erlang

Erlang目前还是概念性产品,商业公司不是咨询公司,不会冒险做革命先烈

嗯,这个俺确实不知道详情
第一是听说E公司用Erlang做了上千万行的产品代码
第二是听H公司的同志们很羡慕的说E公司的研发如何多快好省
于是产生了一点联想
貌似E公司时下当打的网管平台技术架构跟H公司的差不多的说…
114 楼 gigix 2008-04-24  
liusong1111 写道
你这个论断同样不负责任。

引用
以前我也用java搞过跟爱立信BSC网元有关的告警系统,也含web层的啊,
还是7*24小时运行的,线程这种东西要是Ruby/Rails没搞定的话,不是又少了个适用场合。

web系统是否必须跑在多线程下?是否跑在多线程下性能才高?安全性才强?伸缩性才强?
我们team有布署方面的专家,这方面我不在行,就说说我所了解的吧,请各位指正。
j2ee程序是以多线程的方式跑在jvm中的,在最早的应用中,因为线程的创建和销毁比进程更少耗资源(性能因素),因此被推崇。
而后来发现有很多问题,比如稳定性从理论上不如多进程,伸缩性相对SNA架构的多进程方案又差很多,而多进程方案随着lighttpd等技术和一些理论上的支撑(进程重用等),并随多核技术的到来,线程带来的好处已经极大的弱化,而多进程的模式已经有翻身之势。在互联网应用中,使用多进程方案进行布署,很可能一直以来就是主流(不确定,需要各位大牛指正)。Rails不支持多线程,我觉得根本就不是问题。PHP是什么布署模式?我不了解,有怀疑是。。。(就不说怀疑什么了,呵)

这个,你说得不完全对。用什么部署模型,很大程度上取决于你做的到底是什么东西。做web,当然SNA架构就很好。像那个谁说的那种网元告警系统,如果把控制操作也放在web层做的话,对实时性的要求是比较高的,对负载要求倒还好,所以SNA提供的价值不大。不过话说回来,H公司的网元告警系统的web层是只读的,控制操作全在富客户端上,所以这个架构究竟是不是欠考虑而留下的,也很难讲。
而且像网元管理这种对并行处理要求很高的东西,照我看,它就应该用Erlang来做。E公司老早就用Erlang做这类玩意了,那谁的经验也有点落后啊。
113 楼 dreamhead 2008-04-24  
自言200801 写道

另外,语法糖这种东西不都是在parse阶段就完成的,比如javac、erlang都不是。


是否可以举个例子,说明哪些语法糖需要是无法在parse阶段完成,需要借助执行部分的力量。

自言200801 写道

但是,按你所说的C ruby是直接从解析阶段跳到执行阶段,每种语法糖都有自己的格式,
而且这种格式肯定是比JVM指令还高级的,是不是又对性能产生了影响?

还有,要是你对C ruby的解释执行阶段了解,能否说说C ruby执行代码时是基于Stack?还是虚拟寄存器/内存单元?

1.8之前的Ruby(包括1.8)中,压根就没有虚拟机,它的执行过程就是eval一棵语法树,所以,它很慢,所以,才会有后来的YARV。
112 楼 gigix 2008-04-24  
自言200801 写道
gigix 写道
引用
语法的简洁有时是以牺牲性能换来的,特别对于解释性的语言。

有一个经验,我在JavaEye分享过几次,现在可以再分享一次:如果一个人想说一个软件有问题但又说不出来到底有什么问题,他就会说这个东西有性能问题。只要你听到别人跟你说某某东西有性能问题,你就不妨先大胆假设他压根就弄不清到底有什么问题,十次有九次都是准的。

开一个HTTP连接要几十毫秒,访问一下数据库又是几十毫秒,这个时候你跟我说Ruby作为一种解释性语言会牺牲性能,huh?这个,基本上,就跟十年前人们说Java的性能问题一样,可笑。


呵呵,gigix我知道你在软件工程领域还是算牛的,但是在编译理论跟程序语言设计方面你就别争太多了吧,
每个人都有缺点的,我不知道在哪看过你写的个人传记(忘了),你说你不是科班出身的,说你至今不懂编译原理。

C ruby的前端是基于LALR(1)算法的,它是用 Bison parser(yacc的升级版本)先解析parse.y这个文法文件,
最后得到了parse.c,parse.c将近有1.5万行,它就是个ruby语言的语法分析器,编译后都300多kb啦,

C ruby就是个解释器啊,它要分析ruby脚本,总得把parse加载到内存先吧,
ruby语言的简洁,是因为它提供了很多的语法糖,如果你对java的foreach了解的话,这个foreach它也是个语法糖,
语法糖在内部还要转换成其他形式的,就像foreach会转成普通的for语句一样,这中间就多了一道工序了,
自然就花了额外的时间去处理啦,你再想想ruby语言有那么多的语法糖,光是一个数组就有那么多种格式,
而且C ruby目前似乎没有即时编译功能,每次都得做同样的事,性能不慢才怪呢。

然而这本来就是一个工程问题
我前面不是说了吗,对于一个web应用来说,最大的开销在两端的IO,这两个的时间是毫秒级的
(实际上还有一个大开销的东西就是HTML的渲染,通常也是毫秒级的)
既然我明知道每次请求都涉及两个几十毫秒的操作,用编程语言来做的计算到底是几十微秒还是几百微秒,有意义吗?
再考虑到一台性能颇不错的服务器只要两万块人民币,拜托,我干嘛要花这个工夫去考虑它的语法糖背后到底藏了什么?
111 楼 rubynroll 2008-04-24  
一觉醒来,发现大家都很踊跃发言....回到闭包的问题(不好意思,我一直对闭包很推崇,因为它是ruby吸引我的一个很重要原因),前面有大侠用以下java代码演示:

mcpssx 写道
Example Algorithms1.java
// Copyright(c) 1996,1997 ObjectSpace, Inc.
import com.objectspace.jgl.*;
import com.objectspace.jgl.algorithms.*;
import com.objectspace.jgl.functions.*;

JGL
    Array array1 = new Array();
    array1.add( "cat" );
    array1.add( "monkey" );
    array1.add( "goat" );
    Applying.forEach( array1, new PrintFunction() );


class PrintFunction implements UnaryFunction
  {
  public Object execute( Object object )
    {
    System.out.println( "PRINT " + object );
    return null; // Not used.
    }
  }




我想大概是想表达ruby类似的代码:

array1 = ["cat", "monkey", "goat"]
array1.each do |a|
  puts "PRINT" + a
end

且不说4行代码和14行代码的比较....我前面说过,ruby的闭包不仅仅是“传函数指针”,闭包创建的时候自动binding一个环境,因此在闭包内部可以访问绑定时环境的对象,说起来拗口,还是用代码说话:

s = "hello"
array1 = ["cat", "monkey", "goat"]
array1.each do |a|
  puts "#{s} " + a
end


在这里,闭包里面可以访问外部的s,不知java如何实现?

我记得在其它地方有看到有人曾经质疑过闭包里面访问绑定是环境对象的行为是否有必要,我觉得十分必要,特别是在编写GUI程序时,特别有用,能使代码高度“内聚”。

相关推荐

    网友原创系列之Silver_Ruby主题包

    【Ruby语言介绍】 Ruby是一种面向对象的、动态类型的编程语言,由日本人松本行弘(Yukihiro Matsumoto)在1995年设计并创造。...对于那些喜欢Ruby语言的人来说,这样的主题包无疑为他们的编程生活增添了色彩和乐趣。

    Ruby 15天自学教程ppt

    ThoughtWorks的首席科学家、敏捷开发的鼻祖Martin Fowler在博客中曾写到“我的任何一个合格读者都应该知道这几年我已成了一个Ruby爱好者,简洁的语法及优雅的框架使我喜欢上Ruby,它已成为我开发个人项目的首选语言...

    Ruby 自学教程程序源代码

    ThoughtWorks的首席科学家、敏捷开发的鼻祖Martin Fowler在博客中曾写到“我的任何一个合格读者都应该知道这几年我已成了一个Ruby爱好者,简洁的语法及优雅的框架使我喜欢上Ruby,它已成为我开发个人项目的首选语言...

    vim-ruby-refactoring, 在vim中,用于 ruby的重构工具 !.zip

    用于Vim的 ruby-重构工具我喜欢 vim 当我开发软件的时候,它是我的选择编辑器。目前( 至少在过去的4年中) 主要使用 ruby 编程语言。在开发过程中,我一直丢失了一个重构工具,但是我从没有心想过( 就像你在内部找到...

    ruby-rust-interop:展示在 Ruby 运行时中从 Rust 调用基于数字的函数

    ruby-rust-互操作展示在 Ruby 运行时中从 Rust 调用基于数字的函数我希望这些例子能帮助你使用 Rust 设置 Ruby! 所有这些示例都在使用 Ruby 2.1.6 和 Rust 1.0.0-beta.4 的 Windows 上进行了测试如果你克隆 repo,...

    audio-ruby:Ruby 的跨平台音频设备接口

    如果您喜欢处理其中任何一个,我非常乐意接受 Pull Requests! 用法 列出可用的音频设备 音频模块提供了一种方法来检索系统上可用的所有音频设备的列表。 require 'audio' devices = Audio . devices # =&gt; An ...

    vimilicious:用于创建 vim 插件的 Ruby 库

    就像我喜欢和崇拜 rails.vim 一样......你有没有看过源代码? 天啊! 将 ruby​​ 用于一些 vim 脚本或应用程序创建可以使您的生活更轻松。 只有那些使用 ruby​​ 支持编译的 vim 才能利用 vimilicious 或基于 ...

    Combine_pdf:一个纯Ruby库,用于合并PDF文件,数字页甚至更多。

    我喜欢这种宝石,但是我觉得是时候该放弃维护它了,并专注于音乐和其他我想开发的东西。 如果您想加入并最终接手,请打我。 已知局限性 快速淘汰: 阅读PDF表单时,某些表单数据可能会丢失。 我已尽力尝试解决此...

    myGoodiesAutoInstall:我最喜欢的程序的Ruby Auto Installer

    自动安装我的东西一个简单的ruby脚本,它会自动安装一些程序。 该脚本在采用纯格式后非常有用,因为它可以节省一些时间。 试试吧!安装...安装自动构建并运行wget ...

    rubyfmt:Ruby自动格式化程序!

    不,但是距离真的很近我该如何使用建立它: 确保您已安装货物运行make all 将target / release / ruby​​fmt-main复制为rubyfmt到路径上的某个rubyfmt Rubyfmt支持以下CLI调用: &lt;whatever&gt; | rubyfmt &lt;whatever&gt; ...

    小胡子:无逻辑的Ruby模板

    胡子 受和启发,Mustache是​​一种与框架无关的呈现无逻辑视图的方法。 正如ctemplates所说,“它强调... 我喜欢写Ruby。 我喜欢编写HTML。 我喜欢写JavaScript。 我不喜欢编写ERB,Haml,Liquid,Django模板,将Ru

    实例解析Ruby程序中调用REXML来解析XML格式数据的用法

    我有这样的问题:我不喜欢令人困惑的 API。有几种用于 Java 实现的 XML 解析器 API。其中大多数都遵循 DOM 或 SAX,并且在基本原理上与不断出现的众多 Java API 非常相似。也就是说,它们看 上去象是由从未使用过...

    ruby_videos:关于 Ruby 编程语言或与之相关的优质视频的精选列表

    这个项目的原因是我喜欢许多概念,但也想知道我是否可以只用标准的 Rails 和 PORO(带有一些轻量级的 gem)来做类似的事情。 虽然这个项目非常简单,但很多代码对于项目来说看起来有点过分。 这是现阶段的预期。 ...

    ruby-hysh:黄鹰的Ruby外壳

    但是我不喜欢bash的语法,宁愿在Ruby中这样做。 这项工作基于HYSH(黄鹰在Common Lisp中的SHell: )。示例 def dpkg_installed1 ( package_names = nil ) Hysh . out_lines -&gt; { Hysh . pipe [ 'dpkg' , '-l' ], ...

    程序员为什么还要刷题-ruby-101:Ruby-101

    程序员常刷题Ruby 101:学习 Ruby 编程语言 在这里,我描述了我学习 Ruby 的历程,Ruby 是一种非常酷且快速的面向对象的解释型编程语言。 有一些编程概念的基本知识是很好的开始。 本文档会定期更新,我也会提供大量...

    rubysnake:经典蛇游戏的克隆,使用图形库ruby2d

    欢迎来到我的Ruby蛇游戏。 这是使用ruby2d gem /库构建的项目。 要运行此程序,您应该已经安装了这样的库,然后您可以通过在控制台中输入: ruby snake.rb来运行游戏。 安装Ruby2d 首先:安装所需的依赖项 对于Mac...

    ruby101-kitap:土耳其Ruby书

    我一直很喜欢的口袋书。 无论是在大小还是内容上。 您可以始终随身携带的资源,以紧凑的方式包含与其主题相关的所有内容。 我的目的是准备一本味道像这样的床头书,随时随地都可以找到。 编写本书时,最困难的...

    rubylisp:Ruby的Lisp方言

    从设计角度来看, 是我最喜欢的语言,并且可以利用现有JVM库这一事实非常方便。 但是只有一个问题-它的启动时间太慢。 很不错; 它是一个强大的Lisp,而且速度很快。 但是,找到X现有库来执行Y任务并不总是那么...

    生菜:受Ruby启发的Cucumber的python行为驱动开发工具

    我喜欢python,而且从没这么做过。 但是我也曾经错过过一些使编写测试变得容易和有趣的事情。 我喜欢,这是一个单元测试的pythonic框架。 但是,随着我从事的项目的增长,测试也随之增加,并且变得越来越难以理解...

Global site tag (gtag.js) - Google Analytics