论坛首页 编程语言技术论坛

我喜欢Ruby的原因

浏览 68481 次
精华帖 (0) :: 良好帖 (12) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间: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做这类玩意了,那谁的经验也有点落后啊。
0 请登录后投票
   发表时间:2008-04-24  
mcpssx 写道
我坚决不同意你这一点
1,E公司当时是Erlang创始人在公司的时候才用的
2,E公司现在也不用Erlang

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

嗯,这个俺确实不知道详情
第一是听说E公司用Erlang做了上千万行的产品代码
第二是听H公司的同志们很羡慕的说E公司的研发如何多快好省
于是产生了一点联想
貌似E公司时下当打的网管平台技术架构跟H公司的差不多的说…
0 请登录后投票
   发表时间: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.

麻烦讲话之前做做功课。虽说论坛上讲错话不用负责任,可是连了解都没有了解就大放厥词是在让人讨厌。
0 请登录后投票
   发表时间: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代码都塞进一行里面,然后说,你看我一行就可以了!
0 请登录后投票
   发表时间:2008-04-24  
mcpssx 写道
在这里,闭包里面可以访问外部的s,不知java如何实现?

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





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

0 请登录后投票
   发表时间:2008-04-24  
mcpssx 写道

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


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

0 请登录后投票
   发表时间: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。。。用用就知道了。

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


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


6 请登录后投票
   发表时间:2008-04-24  
呵呵 简单通俗一点说

引用

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


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

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

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

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

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

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

某些团队想抹杀人性,把人变成编码机器,办事哲学问题,这个就不议论了。
0 请登录后投票
   发表时间:2008-04-24  
还有啊

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

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

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

想表达什么,又表达不出什么。这是何必呢
0 请登录后投票
   发表时间: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但凡脚本语言都可以直接刷浏览器的吧?孤陋寡闻了不是。


0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics