Java视线论坛 :: 阅读主题 - Java为什么不能动态部署,为什么没有PHP/RoR简单

来源:百度文库 编辑:神马文学网 时间:2024/04/28 23:26:31
作者 正文
hongliang
Weblogic Cluster


性别:
加入时间: 2005/11/03
文章: 397
来自: 上海

时间: 2006-2-18 01:51:18    标题:
我也有这样的疑惑。我学Java之前,用ASP/PHP做叻至少3年的WEB开发,深感动态“部署”带来的便利,而事实上像ASP/PHP这样的架构根本也没有“部署”这一步,文件放上去就行叻,简单地狠。
可是学Java之后,一直到现在,也有一个遗憾,就是无法找到一个比较完满的支持动态部署的方案。而在实际Internet应用中,经常要对程序改来改去。。。
我是否可以这样总结,ASP/PHP对于Internet应用支持的狠好,而J2EE则似乎有那么一种天生的Intranet应用的基因。
返回顶端

robbin
论坛管理员


性别:
年龄:30
十二宫图:
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-2-20 17:09:33    标题:
hongliang 写道:
我也有这样的疑惑。我学Java之前,用ASP/PHP做叻至少3年的WEB开发,深感动态“部署”带来的便利,而事实上像ASP/PHP这样的架构根本也没有“部署”这一步,文件放上去就行叻,简单地狠。
可是学Java之后,一直到现在,也有一个遗憾,就是无法找到一个比较完满的支持动态部署的方案。而在实际Internet应用中,经常要对程序改来改去。。。
我是否可以这样总结,ASP/PHP对于Internet应用支持的狠好,而J2EE则似乎有那么一种天生的Intranet应用的基因。
JSP不是一样可以动态部署吗?一旦涉及的组件开发和部署,动态性就必须考虑组件的状态,rails和PHP一样,都是进程模型,每次请求启动ruby,执行完毕关闭ruby,就好像每次请求你启动一个Java VM,执行完毕关闭Java VM,如果这样去做,Java一样可以动态部署。
所以ASP/PHP/RoR并没有提供真正意义上的动态部署,要说动态部署,也就JSP那叫做真正的动态部署。然而涉及到组件级别动态部署,Java在VM级别没有提供完善的基础设施,当然你也可以通过对classloading机制的编程来实现这一点,例如Atlassian的Confluence和JIRA的plugin框架就是这样做到的,可以实现插件的动态部署,这东西现在开源出来了,叫做tonic,值得好好研究。
返回顶端

hongliang
Weblogic Cluster


性别:
加入时间: 2005/11/03
文章: 397
来自: 上海

时间: 2006-2-20 22:03:07    标题:
robbin误会我的意思叻。。。我并不是说人家ASP/PHP/Rails动态部署好,我也说叻,它们根本就没有部署这一环节。而基于classloading实现的插件机制,最古老的jive就有,并不能算是解决“动态部署”的良方妙药阿。至于JSP,缺点就不说叻,跟ASP/PHP没有什么两样。在体系架构良好的项目里,velocity/freemarker这样的模板语言可以实现任意的更改,但是这也只是页面级的。真正深入到.class文件中,还是只能对jvm做restart或者用类似于tomcat reload的方式。
我觉得Tomcat可以reload应用这一点还是狠方便的,但就是怕它在unload class的时候留下尾巴,比如数据库连接池没有关闭等等。如果这一点没问题,那就真的太好叻。
返回顶端

robbin
论坛管理员


性别:
年龄:30
十二宫图:
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-2-20 22:14:00    标题:
hongliang 写道:
robbin误会我的意思叻。。。我并不是说人家ASP/PHP/Rails动态部署好,我也说叻,它们根本就没有部署这一环节。而基于classloading实现的插件机制,最古老的jive就有,并不能算是解决“动态部署”的良方妙药阿。至于JSP,缺点就不说叻,跟ASP/PHP没有什么两样。在体系架构良好的项目里,velocity/freemarker这样的模板语言可以实现任意的更改,但是这也只是页面级的。真正深入到.class文件中,还是只能对jvm做restart或者用类似于tomcat reload的方式。
我觉得Tomcat可以reload应用这一点还是狠方便的,但就是怕它在unload class的时候留下尾巴,比如数据库连接池没有关闭等等。如果这一点没问题,那就真的太好叻。
也不能说ASP/PHP就不需要部署这一环节,准确的来说,ASP/PHP把部署这一环节留给硬件或者操作系统去做了,而Java则是把部署这一环节放在应用服务器内部来实现。
举个例子来说吧,如果要做群集,对于Java来说只不过是配置AppServer,但是对于PHP/RoR,那么就必须寻求操作系统或者硬件方案;
再例如,实现HttpSession,AppServer自己就搞定了,如果PHP/RoR,就必须自己去管理留在硬盘的session临时文件;
再例如,如果你想增加对象缓存,对于Java来说,很好搞定,但是对于PHP/RoR,就没有办法了,必须寻求一些非常偏门的解决方案,例如寻找某些可以使用操作系统共享内存的memory cache,这部署起来的难度远远超乎Java。
再例如,数据库连接池,Java配置起来那也是超乎简单,但是PHP/RoR要实现同样的机制,我还不知道有什么理想的解决方案。
这么说起来,你觉得Java部署简单,还是PHP/RoR部署简单呢?
返回顶端

hongliang
Weblogic Cluster


性别:
加入时间: 2005/11/03
文章: 397
来自: 上海

时间: 2006-2-20 23:56:08    标题:
robbin 写道:
如果要做群集,对于Java来说只不过是配置AppServer,但是对于PHP/RoR,那么就必须寻求操作系统或者硬件方案;
而实际上呢?排除session的原因,我发现操作系统级的群集最简单、效率最高、最可管理。
robbin 写道:
再例如,实现HttpSession,AppServer自己就搞定了,如果PHP/RoR,就必须自己去管理留在硬盘的session临时文件;
而实际上呢?将内存ram作为存放该session临时文件的文件系统,效率一点不差。
robbin 写道:
再例如,如果你想增加对象缓存,对于Java来说,很好搞定,但是对于PHP/RoR,就没有办法了,必须寻求一些非常偏门的解决方案,例如寻找某些可以使用操作系统共享内存的memory cache,这部署起来的难度远远超乎Java。
而实际上呢?它们根本没有真正OO意义上的对象。缓存的目的是什么呢?如果将提升网站响应时间作为最终目的,那么应该缓存的是HTML页面,而不是对象。
robbin 写道:
再例如,数据库连接池,Java配置起来那也是超乎简单,但是PHP/RoR要实现同样的机制,就必须靠第三方C++中间件来搞定了。
这一点我无话可说。事实上我也经常跟我的同学/朋友说,如果PHP有基于Apache的数据库连接池module,我能基于J2EE思想用PHP实现一个比WebWork2+Spring+Hibernate+FreeMarker更简单灵活轻便的WEB开发框架。而这样的框架有叻,就是Ruby On Rails。基于Apache2 API的PHP的数据库连接池module其实也不难开发,但是我还没看到一个广泛使用的、成熟的。
robbin 写道:
这么说起来,你觉得Java部署简单,还是PHP/RoR部署简单呢?
我还是觉得PHP简单。。。
返回顶端

robbin
论坛管理员


性别:
年龄:30
十二宫图:
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-2-21 00:42:03    标题:
引用:
而实际上呢?将内存ram作为存放该session临时文件的文件系统,效率一点不差。
即使这样,还是要通过操作系统的文件系统API,效率和JVM内部API调用差距还是有很大的。不过这种方式最大的问题在于可移植性。 如果不是在Linux上面运行,你怎么办呢?更何况在内存设置RAMDisk,是不能够动态伸缩的,多了太浪费,少了又不够用,你怎么办呢?
引用:
而实际上呢?排除session的原因,我发现操作系统级的群集最简单、效率最高、最可管理。
老实说,情况并不完全如此。操作系统群集的配置想对比应用服务器级别来说粗略的多。比如某银行应用,在三台机器上面部署了8个Websphere实例,如何实现根据权重的负载分配,如何实现Session的粘着访问,如何根据不同的应用负载公式分配到不同的实例去等等,操作系统群集控制不到这么细。如果是一个群集负载方案设计的比较复杂的情况下,操作系统群集经常是很难满足需要的。
引用:
而实际上呢?它们根本没有真正OO意义上的对象。 缓存的目的是什么呢?如果将提升网站响应时间作为最终目的,那么应该缓存的是HTML页面,而不是对象。
对象缓存的主要目的是减少对数据库的访问,因为大部分web应用瓶颈都是数据库数据存取。对于一个高点击率的数据库型web网站,使用对象缓存是提升性能最有效的途径,俗话说缓存才是王道!对于PHP/RoR来说,这个级别的缓存是没有的,所以同样负载的吞吐量,Java要高得不止一个数量级。
而PHP/RoR缓存页面的能力必须在前端放置sqiud proxy来实现,那么整个网络的拓扑也相当复杂,自然没有Java的OSCache在web.xml里面配一下就搞定来得爽了。
引用:
基于Apache2 API的PHP的数据库连接池module其实也不难开发,但是我还没看到一个广泛使用的、成熟的。
Apache运行mod的方式基本上是来了请求就创建/预创建进程,用完了就释放,因此无法持有一个全局共享实例来提供所有的进程来访问。因此从原理上来说,就无法实现连接池机制。(PHP的长连接那不是连接池,也有严重的问题)
这个问题引申一下,就是Java服务器端很多能力都来自于有一个应用服务器的概念,从应用服务器一启动,就有一个JVM进程一直在跑,因此可以在JVM的生命周期范围内持有全局共享实例,这个JVM范围内的任何线程都可以访问和存取共享实例,因此诸如数据库连接池、HTTPSession,对象缓存等等功能都可以支持的很好。不过他的一个负面影响就是极大的增加了开发和部署的难度。
但是我认为,对于性能要求比较高,或者应用比较复杂的项目来说,这种应用服务器机制是非常必要的,他提供了在这种情况下所必须的所有的基础设施,如上面列举的这些。
事实上PHP/RoR正好反过来,在抛弃应用服务器概念的同时,也放弃了高端应用的可能性,因为应用服务器概念的缺失导致各个请求之间无法共享全局实例,请求之间无法直接通讯,因此很多基础设施都不具备。
举个最简单的例子来说,我要做一个网页计数器,每个页面被访问的时候加1。就这么个简单的功能,你用PHP/RoR就做不好!
如果是Java那很简单,定义一个类的public static 属性,每个JSP页面都可以访问到它,加1就是了,最多在加1的时候同步一下,就搞定了。分析一下背后的原理,这是因为JVM一直在跑,这个计数器全局实例可以被所有的请求线程访问到。
但是换了PHP/RoR你就没辙!他没有一个应用服务器概念,所以你没有办法定义保持住状态的全局共享实例,每个请求进程执行完就销毁了。你要实现计数器,就必须考虑如何实现进程间通讯,而且还要考虑如何开辟一块操作系统共享内存去存放计数器,最后又怎么释放操作系统共享内存的问题,搞不好,内存就溢出了。我以前做PHP的时候就面临过这样的困扰,不得以,就只能把计数器保存到一个硬盘文件中,所有的访问进程都去存取这个硬盘文件,这效率就可想而知了。
其实RoR的一个重大缺陷也就在于此,RoR是没有数据库连接池的。像这种PHP/RoR的运行方式一旦系统的负载到一定的程度,你往往找不到理想的解决方式,而J2EE就可以有各种手段来很方便的扩展。这方面一个活生生的例子就是eachnet,开始用PHP,后来撑不住了,用Java给它做了页面缓存,还在后端使用BEA的Tuexdo中间件,不过最后还是全部迁移到J2EE平台。
BTW:虽然用PHP跑的网站也很多,有些负载也相当不俗,不过你可以发现一个现象,一旦负载上去了,PHP网站的性能就一落千丈,最后往往不得不依靠动态页面静态化来解决问题。
返回顶端

hongliang
Weblogic Cluster


性别:
加入时间: 2005/11/03
文章: 397
来自: 上海

时间: 2006-2-21 02:09:24    标题:
跟robbin这样讨论狠爽,我想继续讨论。
robbin 写道:
即使这样,还是要通过操作系统的文件系统API,效率和JVM内部API调用差距还是有很大的。不过这种方式最大的问题在于可移植性。 如果不是在Linux上面运行,你怎么办呢?更何况在内存设置RAMDisk,是不能够动态伸缩的,多了太浪费,少了又不够用,你怎么办呢?
三大主流平台,Windows/Linux/Unix,全都可以做Ram Disk。另外,你应用服务器里的Session占用的大小更不能动态伸缩啊,总共JVM的堆大小就是启动时指定的。一个PHP的session文件只有几十个字节,1000个session也就几十k。这点内存算不了什么吧。。。
在session管理这一点上,我认为PHP/RoR不吃亏。
robbin 写道:
老实说,情况并不完全如此。操作系统群集的配置想对比应用服务器级别来说粗略的多。比如某银行应用,在三台机器上面部署了8个Websphere实例,如何实现根据权重的负载分配,如何实现Session的粘着访问,如何根据不同的应用负载公式分配到不同的实例去等等,操作系统群集控制不到这么细。如果是一个群集负载方案设计的比较复杂的情况下,操作系统群集经常是很难满足需要的。
嘿嘿,我说叻啊,我那种是最简单的,适合一般性需求。你拿个特殊的复杂的来压我,不公平啊。。。假如PHP也有这样的需求,我想可以这样:
用iptables的NAT做负载均衡,前台Apache用mod_proxy_balancer做权重分配,session问题暂不考虑(要stikcy也可以,不过那就扯远叻)。不同的应用负载公式我不太理解,也是这是最复杂的吧。
robbin 写道:
对象缓存的主要目的是减少对数据库的访问,因为大部分web应用瓶颈都是数据库数据存取。对于一个高点击率的数据库型web网站,使用对象缓存是提升性能最有效的途径,俗话说缓存才是王道!对于PHP/RoR来说,这个级别的缓存是没有的,所以同样负载的吞吐量,Java要高得不止一个数量级。
而PHP/RoR缓存页面的能力必须在前端放置sqiud proxy来实现,那么整个网络的拓扑也相当复杂,自然没有Java的OSCache在web.xml里面配一下就搞定来得爽了。
对于这个问题,我个人理解是这样的,如果有错误robbin请一定指正我。
方式 效率数量级
数据库select 1
数据库select+二级缓存 100
直接页面缓存 10000
我始终是这样认为的。所以我一直以来的做法也是直接用最后一种方式,将压力放心地丢给前端的Apache,后台的Tomcat只做尽量少的事情。对象的缓存失效和页面的重新生成实际上是一个问题,那何不直接做页面的缓存,减少app server的压力。本来app server抗压就不如apache http server那样的纯httpd。
robbin 写道:
Apache运行mod的方式基本上是来了请求就创建/预创建进程,用完了就释放,因此无法持有一个全局共享实例来提供所有的进程来访问。因此从原理上来说,就无法实现连接池机制。(PHP的长连接那不是连接池,也有严重的问题)
这个的确是有实现的可能性的,你可以联想一下firebird那样的BBS系统(就是教育网内普遍使用的telnet方式的BBS),它也是每个用户一个进程,大家看的也都是一样的东西。原理是借用linux/unix下的shm(共享内存)。
robbin 写道:
这个问题引申一下,就是Java服务器端很多能力都来自于有一个应用服务器的概念,从应用服务器一启动,就有一个JVM进程一直在跑,因此可以在JVM的生命周期范围内持有全局共享实例,这个JVM范围内的任何线程都可以访问和存取共享实例,因此诸如数据库连接池、HTTPSession,对象缓存等等功能都可以支持的很好。不过他的一个负面影响就是极大的增加了开发和部署的难度。
这段没有意见,除叻最后“极大”那两个字,其它的都同意
robbin 写道:
举个最简单的例子来说,我要做一个网页计数器,每个页面被访问的时候加1。就这么个简单的功能,你用PHP/RoR就做不好!
PHP我忘叻,ASP可以用application对象轻松实现。
robbin 写道:
但是换了PHP/RoR你就没辙!他没有一个应用服务器概念,所以你没有办法定义保持住状态的全局共享实例,每个请求进程执行完就销毁了。你要实现计数器,就必须考虑如何实现进程间通讯,而且还要考虑如何开辟一块操作系统共享内存去存放计数器,最后又怎么释放操作系统共享内存的问题,搞不好,内存就溢出了。我以前做PHP的时候就面临过这样的困扰,不得以,就只能把计数器保存到一个硬盘文件中,所有的访问进程都去存取这个硬盘文件,这效率就可想而知了。
情况的确是这样。
robbin 写道:
这方面一个活生生的例子就是eachnet,开始用PHP,后来撑不住了,用Java给它做了页面缓存,还在后端使用BEA的Tuexdo中间件,不过最后还是全部迁移到J2EE平台。
BTW:虽然用PHP跑的网站也很多,有些负载也相当不俗,不过你可以发现一个现象,一旦负载上去了,PHP网站的性能就一落千丈,最后往往不得不依靠动态页面静态化来解决问题。
一旦负载上去,J2EE的杀手锏是什么?App Server做cluster?
返回顶端

robbin
论坛管理员


性别:
年龄:30
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-2-21 02:43:42    标题:
引用:
三大主流平台,Windows/Linux/Unix,全都可以做Ram Disk。另外,你应用服务器里的Session占用的大小更不能动态伸缩啊,总共JVM的堆大小就是启动时指定的。一个PHP的session文件只有几十个字节,1000个session也就几十k。这点内存算不了什么吧。。。
在session管理这一点上,我认为PHP/RoR不吃亏。
Unix/Windows平台的RAMDisk实现我确实不知道,孤陋寡闻了。
应用服务器的JVM堆大小当然可以伸缩,如果你不指定最大值,就可以扩展到平台允许的最大值。而且HTTPSession使用的空间在JVM堆里面可以任意伸缩,不存在不够或者浪费的问题。
引用:
嘿嘿,我说叻啊,我那种是最简单的,适合一般性需求。你拿个特殊的复杂的来压我,不公平啊。。
负载均衡的问题一般不会用到那么复杂,不过高端的企业应用确实就会设计非常复杂的方案,所以说PHP/RoR无法进入高端的企业应用领域。
引用:
方式 效率数量级
数据库select 1
数据库select+二级缓存 100
直接页面缓存 10000
我始终是这样认为的。所以我一直以来的做法也是直接用最后一种方式,将压力放心地丢给前端的Apache,后台的Tomcat只做尽量少的事情。对象的缓存失效和页面的重新生成实际上是一个问题,那何不直接做页面的缓存,减少app server的压力。本来app server抗压就不如apache http server那样的纯httpd。
如果严重依赖用户信息生成的页面,你是无法使用页面缓存的。就拿论坛为例,每个人登陆以后,他没有浏览过的主题前面会有黄色图标显示出来。如果对该页面缓存,那么我登陆以后缓存该页面,然后你登陆,拿出来缓存页面给你,这样你看到的页面其实是给我看的页面,而不是给你看的页面,这样就错了。(现在很多PHP论坛采用这种缓存确实普遍出现了这类问题,要你强制刷新一遍,强迫服务器重新生成你要的页面,才能看到正确的页面)
因此页面缓存只适用于那种不依赖用户定制信息的情况,例如新闻发布什么的。对于动态网站来说,页面缓存往往并不适合,我注意到著名的wiki产品confluence也默认配置了页面缓存,不过他只缓存了CSS文件,没有去缓存xxx.action。
所以动态网站的性能提升之道还是在于对象缓存,降低对数据库的访问次数。
另外值得注意的一个问题是,httpd server抗压能力强不代表它执行速度快,由于apache httpd server是进程加线程的模型,所以执行动态内容并没有纯线程模型例如Java应用服务器快。这个其实你可以很简单的做一下PHP和Java的压力测试就知道了。
引用:
这个的确是有实现的可能性的,你可以联想一下firebird那样的BBS系统(就是教育网内普遍使用的telnet方式的BBS),它也是每个用户一个进程,大家看的也都是一样的东西。原理是借用linux/unix下的shm(共享内存)。
这种实现的原理就是利用操作系统共享内存来实现进程间通讯。实际上对于PHP/RoR来说也可以利用这种方式把Session信息放入操作系统共享内存。不过对操作系统共享内存进行编程可并不那么容易,搞好不好操作系统内存都无法回收了,资源管理是一个大问题。如果上面提到的种种问题,如session,缓存,数据库连接池全部都准备采用操作系统共享内存的方式去解决的话,你最后就会发现,你实际上已经实现了一个PHP/RoR版本的应用服务器的早期雏形。
引用:
PHP我忘叻,ASP可以用application对象轻松实现。
ASP运行在IIS上面,而IIS是一个标准的应用服务器实现。PHP/RoR实现不了高效的网页计数器。
引用:
一旦负载上去,J2EE的杀手锏是什么?App Server做cluster?
除了那些大家都可以采用的动态页面静态化,页面proxy等等方式(这种方式局限性很大,不适合用户定制化的动态网站),J2EE提升性能有几个方面:
1、线程模型本身比apache mod的进程方式运行要高效很多;
2、可以使用数据库连接池消除建立数据库物理连接的开销;
3、可以使用对象缓存极大降低对数据库的访问;
RoR没有做过测试,就PHP来说,同样的应用和软件硬件条件,Java的版本负载能力比PHP的版本高出至少一个数量级。
全局共享实例这个问题就是PHP/RoR的致命死穴,从最简单的网页计数器,到企业应用提升性能很关键的数据库连接池和对象缓存,PHP/RoR都做不到,即使能够做到,其代价也远远高于Java。所以PHP/RoR只能用在中小型项目,无法应用于大型企业应用中。
确实有些大网站用PHP也不错,例如Yahoo!,不过我相信Yahoo本身对PHP功能肯定做了必要的扩展,例如很可能使用C++中间件来处理真正的业务逻辑,而PHP仅仅充当View模版的作用。前几天一个在某比价购物网站工作的朋友也提到,他们网站也是这样用的,后台逻辑全部都是C++的中间件,前台用PHP做View。
补充一点,用操作系统共享内存来实现全局共享实例,除了编程很困难之外(必须用操作系统平台API去操纵),共享内存也是不能动态伸缩的!当你分配了一段共享内存之后,这段内存空间大小就不能再变了,万一你程序负载高了,缓存和连接池,session越用越多,共享内存不够了,你就没办法了,只能重起Apache了。
返回顶端

hongliang
Weblogic Cluster


性别:
加入时间: 2005/11/03
文章: 397
来自: 上海

时间: 2006-2-21 05:42:01    标题:
robbin 写道:
HTTPSession使用的空间在JVM堆里面可以任意伸缩,不存在不够或者浪费的问题。
PHP一个session临时文件30字节,就算有10万个session也仅仅是3M内存,对于这个内存是否浪费的问题似乎并不重要吧。。。
robbin 写道:
负载均衡的问题一般不会用到那么复杂,不过高端的企业应用确实就会设计非常复杂的方案,所以说PHP/RoR无法进入高端的企业应用领域。
这个我同意。顺便问一句,高端的企业应用方案会复杂到什么程度?能举个例子说明并且说明为什么一定要那么复杂吗?
robbin 写道:
如果严重依赖用户信息生成的页面,你是无法使用页面缓存的。就拿论坛为例,每个人登陆以后,他没有浏览过的主题前面会有黄色图标显示出来。如果对该页面缓存,那么我登陆以后缓存该页面,然后你登陆,拿出来缓存页面给你,这样你看到的页面其实是给我看的页面,而不是给你看的页面,这样就错了。(现在很多PHP论坛采用这种缓存确实普遍出现了这类问题,要你强制刷新一遍,强迫服务器重新生成你要的页面,才能看到正确的页面)
因此页面缓存只适用于那种不依赖用户定制信息的情况,例如新闻发布什么的。对于动态网站来说,页面缓存往往并不适合,我注意到著名的wiki产品confluence也默认配置了页面缓存,不过他只缓存了CSS文件,没有去缓存xxx.action。
所以动态网站的性能提升之道还是在于对象缓存,降低对数据库的访问次数。
像你说的论坛这种情况,我会对象缓存+页面缓存一起上。首先将页面生成为HTML(页面缓存),然后内部再去下载一次用户个人信息(对象缓存),最后用javascript将页面最终个性化。这样,表面上app server端的点击量虽然没有减少,甚至还多叻http server那一个点击,但是压力的确是会大大降低。拿JavaEye论坛帖子列表来说,变的是什么?是用户名和帖子旁边的那个是否阅读的小黄图标。而不变的是什么?是帖子列表。数据库里哪张表最大?当然是帖子表叻。与其每次都select三次,包括任务最终还要分页的帖子表,倒不如页面也缓存,只select用户个人信息。而且从数据库查询速度上看,带有用户id的select查询总比分页查询一张大帖子表来的快吧。再深入一点,帖子浏览页面,就更是页面缓存大显身手的时候叻,因为用户的个性化信息更少。
robbin 写道:
另外值得注意的一个问题是,httpd server抗压能力强不代表它执行速度快,由于apache httpd server是进程加线程的模型,所以执行动态内容并没有纯线程模型例如Java应用服务器快。这个其实你可以很简单的做一下PHP和Java的压力测试就知道了。
我可从来没说/想/认为/感觉http server执行动态内容快:)不过说到这,我倒是想总结一下,希望robbin能指出我说的不对的地方。有关执行速度,最上面最快,最下面最慢:
http server + 静态内容
app server + 静态内容
http server + 静态内容 + SSI
app server + 静态内容 + SSI
http server + C/C++ fastcgi
app server + 动态内容(即J2EE servlet)
http server + php module / mod_perl
http server + php cgi / perl cgi
robbin 写道:
操作系统共享内存进行编程可并不那么容易,搞好不好操作系统内存都无法回收了,资源管理是一个大问题。如果上面提到的种种问题,如session,缓存,数据库连接池全部都准备采用操作系统共享内存的方式去解决的话,你最后就会发现,你实际上已经实现了一个PHP/RoR版本的应用服务器的早期雏形。
实际上,单纯针对linux操作系统的shm进行正确地操纵的话,对于一个合格linux C程序员来讲是基本功,只要控制好各种同步间的信号量。不过话说回来,这个代价的确是狠高。
robbin 写道:
ASP运行在IIS上面,而IIS是一个标准的应用服务器实现。PHP/RoR实现不了高效的网页计数器。
其实要高效地实现也不是绝对不可以,比如它可以往系统环境变量里写。只不过PHP的确是有这个问题,即使想方设法绕路而行,到最后还是自己给自己找麻烦啊。
robbin 写道:
除了那些大家都可以采用的动态页面静态化,页面proxy等等方式(这种方式局限性很大,不适合用户定制化的动态网站),J2EE提升性能有几个方面:
1、线程模型本身比apache mod的进程方式运行要高效很多;
第一,线程是否真的高效取决于操作系统。起码在linux 2.4内核上体现不出来这一点。2.6上面线程模型改善狠多,这也是为什么搞J2EE的我们发现内核升级为2.6后JVM性能提升那么多的原因。但即使是这样,2.6内核实现的线程也远不如人们的预期,虽然线程的确比进程快狠多,但是还不够。据说Solaris的线程模型最棒,也许solaris上这一点体现的最明显。
第二,apache并不是只能用进程方式啊,这一点robbin千万千万不要误倒大家啊。apache在linux上倾向于prefork process我个人认为有两大原因:1是经过这么多年的实践,在linux上面用进程模型是最稳定的;2就是linux上线程的实现本身就狠笨重,没有效率上的太大优势。
robbin 写道:
2、可以使用数据库连接池消除建立数据库物理连接的开销;
这个绝对是好东西,也是非app server架构拿不去抢不走的。
robbin 写道:
3、可以使用对象缓存极大降低对数据库的访问;
这个也是好东西,我倾向于跟页面缓存结合起来用,以发挥更大的威力。
robbin 写道:
就PHP来说,同样的应用和软件硬件条件,Java的版本负载能力比PHP的版本高出至少一个数量级。
这个我绝对同意,当年就是冲着这一点才使劲学Java的。
robbin 写道:
全局共享实例这个问题就是PHP/RoR的致命死穴,从最简单的网页计数器,到企业应用提升性能很关键的数据库连接池和对象缓存,PHP/RoR都做不到,即使能够做到,其代价也远远高于Java。所以PHP/RoR只能用在中小型项目,无法应用于大型企业应用中。
这个我也是完全同意并且深有感触的。不过,只能应用J2EE的大型项目所占比例并不大,这也是PHP立足的根本。
robbin 写道:
确实有些大网站用PHP也不错,例如Yahoo!,不过我相信Yahoo本身对PHP功能肯定做了必要的扩展,例如很可能使用C++中间件来处理真正的业务逻辑,而PHP仅仅充当View模版的作用。前几天一个在某比价购物网站工作的朋友也提到,他们网站也是这样用的,后台逻辑全部都是C++的中间件,前台用PHP做View。
关于这个robbin就不必用“相信”这种猜测性字眼叻,我敢肯定它们就是那么干的。之所以这么肯定是因为我知道水木清华BBS就是那么干的。之所以水木负载能力那么强,就是因为它底层代码全部是C,只有web层的view是用php做的,并且代码在一帮linux牛人的强力压榨下已经是最大程度地攫取叻机器资源。
robbin 写道:
补充一点,用操作系统共享内存来实现全局共享实例,除了编程很困难之外(必须用操作系统平台API去操纵),共享内存也是不能动态伸缩的!当你分配了一段共享内存之后,这段内存空间大小就不能再变了,万一你程序负载高了,缓存和连接池,session越用越多,共享内存不够了,你就没办法了,只能重起Apache了。
您老咋还想这事呢。。。不就那几兆内存吗大哥。。。
返回顶端

robbin
论坛管理员


性别:
年龄:30
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-2-21 07:52:33    标题:
apache在Unix平台采用的是进程加线程的混合模型。apache赖以成名的还是其稳定性,到不是速度。是否在Linux平台Java线程执行效率比apache进程加线程要高,这个我只是一种直观感觉,未经测试证明。
session的问题是这样,如果你往session里面放很多东西,session占用的空间就会大很多。
有时候企业应用部署方案会比较复杂更多的是来自具体业务上面的要求。
确实现在来说,一定要高端的企业项目并不是那么多,所以很多小型的,对执行效率要求很低的项目用J2EE显得大而无当。这个时候用RoR就很合适。所以我把RoR看成是Web开发领域的VB。不过PHP/RoR连数据库连接池都不支持,确实让人感觉很土
返回顶端

winterwolf
Weblogic Cluster

加入时间: 2005/01/01
文章: 318

时间: 2006-2-21 09:32:33    标题:
[quote]我也有这样的疑惑。我学Java之前,用ASP/PHP做叻至少3年的WEB开发,深感动态“部署”带来的便利,而事实上像ASP/PHP这样的架构根本也没有“部署”这一步,文件放上去就行叻,简单地狠。
可是学Java之后,一直到现在,也有一个遗憾,就是无法找到一个比较完满的支持动态部署的方案。而在实际Internet应用中,经常要对程序改来改去。。。
我是否可以这样总结,ASP/PHP对于Internet应用支持的狠好,而J2EE则似乎有那么一种天生的Intranet应用的基因。[/quote]
javascript也算java(rhino) 用在服务器端一样可以动态部署 而且可以有效的利用一切java资源. 不仅php asp处于劣势 很多动态语言都会受到冲击.
返回顶端

glassprogrammer
Macromedia JRun

加入时间: 2004/02/28
文章: 62

时间: 2006-2-21 09:54:17    标题:
ASP里面,如果你后台使用了一个自己编写的COM组件,你看看还能不能动态"部署"?
返回顶端

flier
Caucho Resin


性别:
加入时间: 2004/08/05
文章: 17
来自: 北京

时间: 2006-2-21 16:14:18    标题:
glassprogrammer 写道:
ASP里面,如果你后台使用了一个自己编写的COM组件,你看看还能不能动态"部署"?
如果是 COM+ 组件的话,理论上也是可以达到“准动态”部署的,按 MS 的思路 Windows 自身就是一个 AppServer。
返回顶端

robbin
论坛管理员


性别:
年龄:30
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-2-22 14:54:20    标题:
想到PHP/RoR这种缺乏应用服务器支撑的脚本语言另外一个可以说相当致命的问题:那就是安全性不好!
Java的class是在虚拟机上面的运行的,JVM有一个良好的类加载体系和类验证机制来保证恶意代码无法通过验证,更不要说被执行了。
而PHP/RoR是直接被操作系统执行的,而且PHP/RoR这种脚本语言又没有一个编译的过程,因此安全性可以说是非常的差,只要编程稍微不小心,就很容易被人家通过精心构造的URL字符串实现缓冲区溢出攻击。而这种问题几乎是无法通过语言级别或者操作系统级别来解决的,只能依靠程序员对HTTP Request的参数进行非常仔细的过滤。
返回顶端

hongliang
Weblogic Cluster


性别:
加入时间: 2005/11/03
文章: 397
来自: 上海

时间: 2006-2-22 17:48:16    标题:
robbin 写道:
想到PHP/RoR这种缺乏应用服务器支撑的脚本语言另外一个可以说相当致命的问题:那就是安全性不好!
Java的class是在虚拟机上面的运行的,JVM有一个良好的类加载体系和类验证机制来保证恶意代码无法通过验证,更不要说被执行了。
在一个允许上传文件而不对文件做是否是JSP文件的检查的web application中,仍然有安全性问题。
robbin 写道:
而PHP/RoR是直接被操作系统执行的,而且PHP/RoR这种脚本语言又没有一个编译的过程,因此安全性可以说是非常的差,只要编程稍微不小心,就很容易被人家通过精心构造的URL字符串实现缓冲区溢出攻击。而这种问题几乎是无法通过语言级别或者操作系统级别来解决的,只能依靠程序员对HTTP Request的参数进行非常仔细的过滤。
别的我不敢说,基于Apache之上的php、mod_perl这样的脚本语言是没有缓冲区溢出攻击的,因为人家要攻击也不是攻击你脚本,而是直接针对apache或者apache module,真正我们自己写的脚本,拿到的变量都是apache已经处理过的叻。如果说是SQL注入那样的攻击,J2EE同样存在,这取决于开发人员自身,与技术本身无关。
另,如果robbin有办法对现有的php做缓冲区溢出攻击,不妨share出来吧:)Internet上那么多php应用,看看我们能黑掉几个
返回顶端
作者 正文
robbin
论坛管理员


性别:
年龄:30
十二宫图:
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-2-22 18:33:58    标题:
你没有理解我的意思,呵呵,不过我也论述的不清楚。要论述清楚这个问题很不容易。简单来说Java的安全性由虚拟机来保证,而PHP/RoR的安全性完全交给开发人员自己来保证。
返回顶端

hongliang
Weblogic Cluster


性别:
加入时间: 2005/11/03
文章: 397
来自: 上海

时间: 2006-2-23 02:02:26    标题:
好吧好吧,嘿嘿:)那这个问题就讨论到这吧:)
返回顶端

yangzheng
JBoss

性别:
加入时间: 2004/04/04
文章: 33

时间: 2006-3-16 16:39:20    标题:
最后一次回复此帖.
刚才开会,顺便拿了2004年第12期的程序员看看,上面刚好有个专题采访php创始人Lerdorf,里面提到一些他的回答可以回复xfxlf提出的两个问题.
我抄了一下:
第38页如果csdn没有翻译错误的话,他的原话是这样的:
从整体上来说,雅虎的php和外部的没有太大的区别,仅仅是由部分的不同.这些改动都是针对系统配置而言,而并非是针对php的源代码.
第40页:谈到了他对企业级应用的理解,原话是这样的:企业级应用就是那些能解决企业级层面所面临问题的应用,通常是为了解决那些复杂和苛刻的应用问题.
我想如果银行和电信不是解决这些问题的话,ok,他就不是企业级应用..
他们是吗,我想大家都会有明确的回答.
返回顶端

partech
Java Virtual Machine

性别:
年龄:65
十二宫图:
加入时间: 2004/11/13
文章: 676
来自: 深圳

时间: 2006-3-16 20:39:50    标题:
hongliang 写道:
我也有这样的疑惑。我学Java之前,用ASP/PHP做叻至少3年的WEB开发,深感动态“部署”带来的便利,而事实上像ASP/PHP这样的架构根本也没有“部署”这一步,文件放上去就行叻,简单地狠。
可是学Java之后,一直到现在,也有一个遗憾,就是无法找到一个比较完满的支持动态部署的方案。而在实际Internet应用中,经常要对程序改来改去。。。
我是否可以这样总结,ASP/PHP对于Internet应用支持的狠好,而J2EE则似乎有那么一种天生的Intranet应用的基因。
咳,谁说不能动态部署?看看Eclipse的OSGi......
返回顶端

robbin
论坛管理员


性别:
年龄:30
十二宫图:
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-3-29 17:45:03    标题:
如上文所述,我对RoR运行的方式非常不满,实际上我非常希望RoR这种简单的东西可以运行在某种VM上面,这样将兼有RoR的简单学习,快速上手,也有VM语言的带来的诸多企业应用需要的特性。前几天在CSDN上面也看到了这方面的文章,很多人荐言,Java应该在JVM上面支持运行Ruby,我想这才是我希望看到的最理想的方式。
另外上周末请教了yanger,他认为,RoR没有连接池缓存这些问题并不是非常重要,当你的应用真正到了对性能严格要求的时候,自然你也会愿意花很多的投资在上面改造应用,增加C++中间件,从实际的角度来说,也往往确实如此。
所以这个争论可以做一个结论了:RoR缺乏VM,会带来性能方面的问题,但是真到了对性能要求比较高的时候,你自然愿意投资去解决它,而Java语言的发展方向应该是在JVM上面提供对脚本语言更好的原生支持,例如Ruby。
返回顶端

gigix
Java Virtual Machine


性别:
年龄:25
十二宫图:
加入时间: 2004/03/07
文章: 816
来自: 北京

时间: 2006-3-29 18:06:04    标题:
robbin 写道:
如上文所述,我对RoR运行的方式非常不满,实际上我非常希望RoR这种简单的东西可以运行在某种VM上面,这样将兼有RoR的简单学习,快速上手,也有VM语言的带来的诸多企业应用需要的特性。前几天在CSDN上面也看到了这方面的文章,很多人荐言,Java应该在JVM上面支持运行Ruby,我想这才是我希望看到的最理想的方式。
另外上周末请教了yanger,他认为,RoR没有连接池缓存这些问题并不是非常重要,当你的应用真正到了对性能严格要求的时候,自然你也会愿意花很多的投资在上面改造应用,增加C++中间件,从实际的角度来说,也往往确实如此。
所以这个争论可以做一个结论了:RoR缺乏VM,会带来性能方面的问题,但是真到了对性能要求比较高的时候,你自然愿意投资去解决它,而Java语言的发展方向应该是在JVM上面提供对脚本语言更好的原生支持,例如Ruby。
现在有人做Ruby-CLR桥,让Ruby能够调用.NET的lib。以前我也觉得JVM上跑Ruby很要紧,现在觉得无所谓,而且Groovy也比Ruby更受重视。
返回顶端

robbin
论坛管理员


性别:
年龄:30
十二宫图:
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-3-29 18:20:25    标题:
ruby调用CLR的lib无非是扩大他的类库API而已,其实PHP现在也可以调用Java的类库,这和提供一个VM支持还是不同的概念。
groovy社区似乎不是特别活跃,上次BEA SHUG上面听bran说,颇有些不为外人所道的内情(bran是groovy bytecode的contributor)
返回顶端

potian
BEA Weblogic

年龄:36
十二宫图:
加入时间: 2003/11/12
文章: 283

时间: 2006-3-30 00:37:43    标题:
目前绝大多数JVM的bytecode验证机制非常容易受到攻击,robbin可以查一些论文,我至少看到过好几段经过设计的短小的bytecode码直接可以让JVM崩溃,看过很久了,不记得名字了。
据我所知,groovy半年前基本已经死亡,可能gigix有最近消息。Groovy是从堆砌开始的,我不认为他可以和一个具有非常明确设计目标、历经10年,最近又有大批Java界人士转投的语言(Ruby)相比
应该是1个月前,Ruby 1.9已经和YARV合并成为Rite(Ruby 2.0),在CVS Head里面,早就支持VM了,比Ruby1.x有很大提高,不过性能上和JVM还有些差距,但还有很多空间,没有任何理论上的问题。
JVM是不太适合动态类型语言的,这也是perl、Ruby另起炉灶的原因,JPython、JRuby等等基本上只能是玩具或小的粘合剂。
返回顶端

庄表伟
Java Virtual Machine

性别:
年龄:30
十二宫图:
加入时间: 2004/03/15
文章: 600
来自: 上海

时间: 2006-3-30 08:58:29    标题:
potian 写道:
目前绝大多数JVM的bytecode验证机制非常容易受到攻击,robbin可以查一些论文,我至少看到过好几段经过设计的短小的bytecode码直接可以让JVM崩溃,看过很久了,不记得名字了。
据我所知,groovy半年前基本已经死亡,可能gigix有最近消息。Groovy是从堆砌开始的,我不认为他可以和一个具有非常明确设计目标、历经10年,最近又有大批Java界人士转投的语言(Ruby)相比
应该是1个月前,Ruby 1.9已经和YARV合并成为Rite(Ruby 2.0),在CVS Head里面,早就支持VM了,比Ruby1.x有很大提高,不过性能上和JVM还有些差距,但还有很多空间,没有任何理论上的问题。
JVM是不太适合动态类型语言的,这也是perl、Ruby另起炉灶的原因,JPython、JRuby等等基本上只能是玩具或小的粘合剂。
大大激发了我学Ruby的兴趣。谢谢
返回顶端

javavsnet
Caucho Resin


加入时间: 2005/07/12
文章: 19

时间: 2006-3-30 09:01:16    标题:
现在这么多人关心Ruby,很少有人提Python了。Python同样是强大的动态语言,只不过缺乏ROR这样的杀手级应用。我觉得如果Python阵营中开发出类似ROR的东西不是很难,到时候是否大家又会投入Python的怀抱呢?目前Jython发展到2.2版了,支持Python2.2的全部功能和2.3的部分功能,可以和Java结合起来,是否是Java和动态语言结合的利器呢?可惜目前JYthon的开发者转到微软旗下了,让人担心将来的发展。
返回顶端

robbin
论坛管理员


性别:
年龄:30
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-3-30 09:09:23    标题:
javavsnet 写道:
现在这么多人关心Ruby,很少有人提Python了。Python同样是强大的动态语言,只不过缺乏ROR这样的杀手级应用。我觉得如果Python阵营中开发出类似ROR的东西不是很难,到时候是否大家又会投入Python的怀抱呢?目前Jython发展到2.2版了,支持Python2.2的全部功能和2.3的部分功能,可以和Java结合起来,是否是Java和动态语言结合的利器呢?可惜目前JYthon的开发者转到微软旗下了,让人担心将来的发展。
python其实现在也有类似RoR的东西,只不过还在beta阶段,没有launch。有时候就是这样的,你先出来的东西已经占领了市场,后面做得再好,也会很被动。
返回顶端

robbin
论坛管理员


性别:
年龄:30
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-3-30 09:10:16    标题:
按照potian的说法,那么我是否可以理解为ruby现在也在做VM,并且可以预期将来RoR运行在RubyVM上面?
返回顶端

potian
BEA Weblogic

年龄:36
加入时间: 2003/11/12
文章: 283

时间: 2006-3-30 11:29:54    标题:
其实Ruby的VM很早以前就开始做了,但很多都没有坚持下来,坚持得最久的是YARV,从2005年1月份开始的
matz很早就说过Ruby 2.0叫做Rite,但是到底用谁的项目还是自己写没有确定,在Ruby1.8以后,matz基本确定他在1.9分支上做语法级别的实验,而ko1(YARV)的作者得到承认,这在2005年的Ruby年会上已经透露出来了。
然后就是不久前的合并,现在原先的Ruby语言的语法测试已经完全能够通过了,但是由于这些测试写得覆盖率不够(matz曾经很不好意思地承认他不是TDD的崇拜者),所以目前还有不少工作,但是我已经在Rite上跑通了最简单的Rails Demo程序。
据我估计,应该最多在3-5个月内,Rite虽然不一定正式推出,但是应该可以毫无阻碍地运行Rails程序
返回顶端

hongliang
Weblogic Cluster


性别:
加入时间: 2005/11/03
文章: 397
来自: 上海

时间: 2006-3-30 11:47:48    标题:
谁能说一下Eclipse的OSGi能用到J2EE开发和部署上吗?partech?
返回顶端

partech
Java Virtual Machine

性别:
年龄:65
加入时间: 2004/11/13
文章: 676
来自: 深圳

时间: 2006-3-30 11:52:58    标题:
hongliang 写道:
谁能说一下Eclipse的OSGi能用到J2EE开发和部署上吗?partech?
http://www.eclipse.org/equinox/incubator/server/
http://www.eclipse.org/proposals/rap/
http://www.infonoia.com/en/content.jsp?d=inf.05.07
你有Eclipse的OSGi就不需要J2EE那套恶心得咚咚了。
返回顶端
作者 正文
hongliang
Weblogic Cluster


性别:
加入时间: 2005/11/03
文章: 397
来自: 上海

时间: 2006-3-30 13:26:32    标题:
partech 写道:
hongliang 写道:
谁能说一下Eclipse的OSGi能用到J2EE开发和部署上吗?partech?
http://www.eclipse.org/equinox/incubator/server/
http://www.eclipse.org/proposals/rap/
http://www.infonoia.com/en/content.jsp?d=inf.05.07
你有Eclipse的OSGi就不需要J2EE那套恶心得咚咚了。
看叻。。。嗯。。。果然不合我胃口
返回顶端

goncha
Macromedia JRun


性别:
年龄:24
十二宫图:
加入时间: 2004/04/07
文章: 56
来自: Shanghai

时间: 2006-3-30 13:55:41    标题:
robbin 写道:
按照potian的说法,那么我是否可以理解为ruby现在也在做VM,并且可以预期将来RoR运行在RubyVM上面?
其实以FastCGI模式运行的Rails也可以认为是运行在一个VM中.
返回顶端

robbin
论坛管理员


性别:
年龄:30
十二宫图:
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-3-31 23:26:46    标题:
goncha 写道:
robbin 写道:
按照potian的说法,那么我是否可以理解为ruby现在也在做VM,并且可以预期将来RoR运行在RubyVM上面?
其实以FastCGI模式运行的Rails也可以认为是运行在一个VM中.
无语...
返回顶端

cookoo
Caucho Resin


性别:
加入时间: 2006/02/16
文章: 20
来自: Montreal

时间: 2006-4-02 06:51:51    标题:
javavsnet 写道:
现在这么多人关心Ruby,很少有人提Python了。Python同样是强大的动态语言,只不过缺乏ROR这样的杀手级应用。我觉得如果Python阵营中开发出类似ROR的东西不是很难,到时候是否大家又会投入Python的怀抱呢?目前Jython发展到2.2版了,支持Python2.2的全部功能和2.3的部分功能,可以和Java结合起来,是否是Java和动态语言结合的利器呢?可惜目前JYthon的开发者转到微软旗下了,让人担心将来的发展。
jython的原作者去微软前早已离开jython队伍,去搞aspectj了,他是个凭兴趣干活的天才.后来去微软可以说和jython没什么关系.
至于python on rails的问题,除了如robbin前面说的first runner效应. 2nd runner其实也是有机会赶超的(学习好榜样:微软), 关键是不能只是简单clone,要有特别的东西.否则你将提供的东西别人早已提供, 还能吸引谁来用? 很遗憾, 现在的几个python on rails: subway, turbogears, pylons似乎只是想维护python的纯洁性(everything is pythonic), 所以其影响力至多也就局限于python社团内部而已.
返回顶端

charon
Weblogic Cluster

加入时间: 2004/06/09
文章: 422

时间: 2006-4-02 20:38:16    标题:
potian 写道:
...
据我所知,groovy半年前基本已经死亡,可能gigix有最近消息。Groovy是从堆砌开始的,我不认为他可以和一个具有非常明确设计目标、历经10年,最近又有大批Java界人士转投的语言(Ruby)相比
...
groovy的1.0-jsr-04是在11月发布的,12月初有一次很重要的会议,今年2月13日发布了1.0-jsr-05。
唯一的问题是那个Groovy SCM List自200507以后一直没有更新了。但是从issue tracker来看还是很活跃啊。
从mailing list来看,其社区的活跃程度,不比spring差。
而且,从另一个角度来说,groovy继承的是java的所有成果,其外势并不比ruby差,从语法层面来看也看不出太本质的区别。另一方面,现在大幅度转向过去的那些人,本来就不是java的中坚力量,属于那些弄潮级别的,本来即便在java,也只是暂驻而已。
返回顶端

potian
BEA Weblogic

年龄:36
加入时间: 2003/11/12
文章: 283

时间: 2006-4-03 02:11:04    标题:
groovy的最初目标是A语言有、B语言有、C语言有,你有我有大家有,噢黑噢黑噢嘿嘿,颇有点要采遍天下名花的意思。都不知道他想干嘛,想提供给程序员什么样的一种视角和编程感观。
热闹了好一阵子,然后搞了个什么JSR(我实在不知道哪种成功的语言是先忙着搞标准,再搞普及的)。不过突然几个月声音全无,只剩下一个人在那里零星地回答几个问题。当然现在可能有热闹起来了
当然这只是我的个人观点。学了Ruby以后,就基本上没怎么去看过了。当然有很多理由,譬如Rails的影响,Dave Thomas,MartinFowler,Bruce Tate这些人的鼓吹,原先玩Smalltalk全对象,Closure,method_missing却没有机会好好在项目里面用,但如果一定要我说一个为什么用Ruby的原因,那就是
好玩,简单
看看ANT和Rake,谁更好玩,谁能玩得更好,看看YAML和XML谁更简单,。。。
返回顶端

firebody
Java Virtual Machine


性别:
加入时间: 2004/05/07
文章: 629

时间: 2006-4-03 09:36:46    标题:
charon 写道:
potian 写道:
...
据我所知,groovy半年前基本已经死亡,可能gigix有最近消息。Groovy是从堆砌开始的,我不认为他可以和一个具有非常明确设计目标、历经10年,最近又有大批Java界人士转投的语言(Ruby)相比
...
groovy的1.0-jsr-04是在11月发布的,12月初有一次很重要的会议,今年2月13日发布了1.0-jsr-05。
唯一的问题是那个Groovy SCM List自200507以后一直没有更新了。但是从issue tracker来看还是很活跃啊。
从mailing list来看,其社区的活跃程度,不比spring差。
而且,从另一个角度来说,groovy继承的是java的所有成果,其外势并不比ruby差,从语法层面来看也看不出太本质的区别。另一方面,现在大幅度转向过去的那些人,本来就不是java的中坚力量,属于那些弄潮级别的,本来即便在java,也只是暂驻而已。
技术商人。
返回顶端

charon
Weblogic Cluster

加入时间: 2004/06/09
文章: 422

时间: 2006-4-03 10:10:39    标题:
如果要比构建工具,rake可能和ant在一个级别,但是不如maven2.
我从groovy的beta6一直到现在的jsr05,平均每两个小版本升级一次,大概用了有一年半的时间了,最大的感觉就是groovy越来越完善,性能也有很大的提高(没侧过,纯感觉)。最早的时候错误信息乱七八糟的一堆,好像到了beta10之后就好多了,目前的版本错误定位已经非常明确。使用的主要场合是异构数据库异构表之间倒数据,包括在db2,db400,mysql,sqlserver,太简洁了。而且,成熟的type3/4的驱动随手可得。
从另一方面来说,ruby是否能够在主流企业应用上取代java的位置,政治是最重要的。从我所处的行业来看,java平台已经写入了行业的信息化指导纲要中(里面没有没有.net,hehe),从我所在的企业而言,外协开发项目几乎不会采用java以外的平台,而且,也禁止采用非java的新技术。这个是从维护成本考虑的,假如乙方用ROR作了一部分工作,虽然多快好省,但是除非这个乙方正好是我的战略合作伙伴(不过,虽然我们现在有一个战略合作伙伴,但是技术太差了,也是政治因素决定的,hehe),否则,必然会要求重新实现。这里面有两个风险,一个是ROR本身的成熟度决定了其版本更新的速度和幅度,近期上的企业项目会处于一个很尴尬的境地(想一想现在要维护一个java1.1时代的软件就知道了);另一个是供应商锁定的风险,这个市场上要找到一个ruby玩得好的公司,也挺难的。
作为一个负责任的甲方,现在ruby还很难进入radar屏幕中。除非兜售的是套装产品,那就另当别论了。
返回顶端

charon
Weblogic Cluster

加入时间: 2004/06/09
文章: 422

时间: 2006-4-03 10:27:32    标题:
firebody 写道:
技术商人。
应该说是技术掮客,hehe.
感觉上Martin Flower,Bruce Tate这些人是不挺的在奔跑,不停的在找新的咨询增长点,通过不停的变换来保持这一领域的竞争优势。他们与像ibm那些大公司不停乱搞的不同之处在于,商业公司基本上要考虑客户的既有投资,所以那些公司这两年虽然吹来吹去吹得晕,但是货还是那些货,只是干得方式多了。
除非ruby在集成领域能够表现出足够强大的力量(现在我是一点没看到),否则不太可能撬动市场。
返回顶端

potian
BEA Weblogic

年龄:36
加入时间: 2003/11/12
文章: 283

时间: 2006-4-03 10:50:44    标题:
rake和Ant根本就是两回事
因为一个是编程语言,只不过利用了Ruby语言的特点,一个是XML,十万八千里去了,根本就没得比
作为一个人人,或者程序员,快乐是第一位的
作为一个负责任的软件研发管理者,就是要做好两点:
1。为程序员创造一个快乐的环境,不然就算赚到钱,这个公司也是毫无价值的
2。而如何提供更高质量、可维护、可扩展的系统、为客户提高更有价值更好的服务是第一位的。市场声誉、客户满意度都会下降。不然公司就不可能发展下去。
而越简单,越好玩,这个目标就越有可能达到,Java就是这样异军突起的,最重要的原因之一就是比C++语言纯粹、简单、清楚,但又继承了Smalltalk的很多好处。
Ruby今天就要代替Java是不可能的,也许以后代替也是不可能的,可能在某些行业永远也进不去,譬如Java在某些行业的某些产品上也很难进得去的,这很正常,哪有万能的东西。但如果是一个程序员,不要只盯着Rails,去试一试用Ruby去解决一些日常问题,看看能带来什么样的变化和乐趣,我想大部分人会非常感兴趣的。在这之后可以进行某些有价值的讨论。我现在就在看另外一种语言。
返回顶端

capitain
Macromedia JRun

加入时间: 2003/09/13
文章: 51

时间: 2006-4-03 11:31:46    标题:
这个问题讨论起来没有定论,用什么顺手用什么吧, 我们公司还用一个叫pike的语言呢, 这个语言一万年都无法升为主流. 呵呵
返回顶端

charon
Weblogic Cluster

加入时间: 2004/06/09
文章: 422

时间: 2006-4-03 12:18:18    标题:
把rake与ant放在一起,是指他们的理念是类似的。也就是在这个意义上说,maven要更加ROR一点,而且有一个更加抽象、内洽的构建模型。rake只是和ant一样,不过是make在ruby上的一个异化,本质上还是diy的。ant也一样,但maven就完全不同,其区别类似于控制反转。
ruby在一定位面的成功是可以预期的,就如lua在游戏脚本领域独领风骚一样(我对lua的兴趣远远大于ruby),也像php在90年代末的大肆风行之后仍然占据着web位面的重要位置。但是能够动摇java平台的,现在看来仍然只是.net一个而已。
以前玩过perl,python,但是现在只要是有java虚拟机的地方,我都会装一个groovy包,太简单顺手了。
其实,有时间去玩ruby,为什么不花1/5的时间去看看groovy.
返回顶端

potian
BEA Weblogic

年龄:36
加入时间: 2003/11/12
文章: 283

时间: 2006-4-03 13:41:36    标题:
我是不用Maven的,太复杂了,学不会
Rake的意义在于
1)它是一种面向构造领域的工具,很自然
2)它本身就是Ruby程序,可以按Ruby语言的方式来编写任务的内容
3)如果ANT或者Maven没有提供这样的功能,你可以当时就编写程序,根本不需要这些查检,那个插件的
我不能想象XML文本能做这些事情。
返回顶端

charon
Weblogic Cluster

加入时间: 2004/06/09
文章: 422

时间: 2006-4-03 14:21:51    标题:
相比于rake或者ant,maven的复杂在于假如前两者是"一种面向构造领域的工具",那么maven就是已经建成的构造领域机器。其复杂性只是因为它为开发者提供了一套运作规则和完整的默认实现,如同ROR一样。
从插件的角度来看,maven是比较弱的,虽然它的目标是能够用其他的脚本语言来搞定插件,但是现在没看到(也许只是我没看到?)....hehe.
只是,自己手工编写maven插件的机会基本上很少,毕竟构建是一个很狭窄的领域,而maven本身是一个相对完整的模型,内置了众多常见的插件,并能够方便的集成ant的插件。更多的是在配置这些插件起作用的阶段。
其实,要说到diy,groovy其实也有一个AntBuilder,可以满足一下diy的乐趣。但是,我觉得maven已经足够好,不需要为构建费更多的心思了。
返回顶端

rtm
Macromedia JRun

性别:
年龄:6
十二宫图:
加入时间: 2003/09/08
文章: 50

时间: 2006-4-03 16:41:07    标题:
始终觉得xml做为构建文件不是很好的选择,简单情况下还好,复杂了就会变的很难看,绝对没有脚本语言来的清晰.ant,maven做的是脚本的工作,用的不是脚本语言.
返回顶端
作者 正文
robbin
论坛管理员


性别:
年龄:30
十二宫图:
加入时间: 2003/09/07
文章: 1945
来自: 上海

时间: 2006-4-03 16:50:06    标题:
rtm 写道:
始终觉得xml做为构建文件不是很好的选择,简单情况下还好,复杂了就会变的很难看,绝对没有脚本语言来的清晰.ant,maven做的是脚本的工作,用的不是脚本语言.
我现在越来越反感用XML来作为Java web项目的配置文件了,尤其是Spring的XML配置文件和Webwork的XML配置文件。项目一旦变得比较大的时候,想要重构,是非常困难的。所以我认为,必须消除XML配置文件,而且必须让配置信息可以有重构支持,所以这种配置信息必须以Java代码的方式来编写,也就是说应该用annotation去写,而不是XML。所以Hibernate的映射文件非常适合使用annotation,而spring和webwork这种全局性的配置文件,用annotation则太分散了,用Jacn就很不错,考虑给Jacn增加webwork支持。
返回顶端

charon
Weblogic Cluster

加入时间: 2004/06/09
文章: 422

时间: 2006-4-03 17:22:15    标题:
jacn这个项目也太小众了吧。而且去年7-8月一个月内发布了3个小版本,之后一直就没动静了,这样也敢用?
xml配置确实很烦,以前我有一个项目用groovy脚本来作spring的配置,不过也没有重构的支持。
返回顶端360docimg_501_360docimg_502_
360docimg_503_
robbin
论坛管理员
360docimg_504_
360docimg_505_
性别:360docimg_506_
年龄:30
十二宫图:360docimg_507_
加入时间: 2003/09/07
文章: 1945
来自: 上海
360docimg_508_
360docimg_509_时间: 2006-4-03 18:06:53    标题:360docimg_510_360docimg_511_
charon 写道:
jacn这个项目也太小众了吧。而且去年7-8月一个月内发布了3个小版本,之后一直就没动静了,这样也敢用?
xml配置确实很烦,以前我有一个项目用groovy脚本来作spring的配置,不过也没有重构的支持。
我觉得配置烦琐到不可怕,真正可怕的是没有编译器检查和IDE的重构支持。我现在持有这样一种观点,配置信息用脚本还是XML没有本质上的差别(虽然脚本的可读性更好),对于一种编译语言来说,就应该充分利用编译检查这个优点,否则的话,就干脆全部使用脚本语言编程得了。特别是当我看到RoR使用ruby来写yaml配置,就更加确定这一点,那就是Java项目的配置信息就应该写在Java代码里面,这样才能充分发挥Java的优势,用脚本还是XML配置的路子都不对。
jacn的源代码味道很不好,不过实现原理非常简单,就是用Java去编写配置,然后程序运行的时候读取class文件的bytecode,转换为框架XML配置需要的XML DOM送给框架。实现的要点就是能够通过bytecode读取配置信息,可以把这一功能做成一个基础平台,然后各种框架需要的DOM信息分别写插件实现,其实就是另外一种形式的XDoclet,只不过XDoclet读取的是Java源代码中间的注释信息,而Jacn读取的是Java源代码编译的class bytecode的信息而已,但是显然Jacn这种方式的好处就是编译器可以进行检查,IDE也可以提供重构支持,另外用Java代码写配置,很容易实现一些XML配置很难配置好的功能,例如AOP,事务支持什么的,用Jacn就是一行代码搞定,很直观。
目前对我来说,就是急需给Jacn增加webwork配置文件的功能支持,我准备在有空闲时间的时候做一点这方面的工作,因为一般项目的action数量是很多的,重构Action的时候,对xwork.xml同步修改能力极差,这个缺陷严重影响了对项目的重构质量。
虽然spring和webwork都开始提供annotation支持,但是这种全局性的配置文件不同于Hibernate,他们需要提供一种概览性质的东西,这个时候Jacn比annotation要合适。最后我觉得Jacn这种在Java代码里面写配置的创意很棒。
返回顶端360docimg_512_360docimg_513_360docimg_514_360docimg_515_
360docimg_516_
charon
Weblogic Cluster
360docimg_517_
加入时间: 2004/06/09
文章: 422
360docimg_518_
360docimg_519_时间: 2006-4-03 21:17:37    标题:360docimg_520_360docimg_521_
其实脚本语言也可以有编译期检查的,即搞一点静态类型的东西。
groovy的邮件列表里面有这个需求(从性能角度提出来的),但是还没做出来,hehe.
而且,groovy留了一个很有意思的口子,和一般动态语言不同的是,它并不介意你声明一个对象的类型。因此,如果在脚本代码中坚持使用类型声明,对于重构的支持还是有可能的。而且,对于有特定类型声明的对象而言,编译期的验证也是有可能实现的。
上一次由charon于2006-4-03 周一, 下午9:20修改,总共修改了1次
返回顶端360docimg_522_360docimg_523_
360docimg_524_
robbin
论坛管理员
360docimg_525_
360docimg_526_
性别:360docimg_527_
年龄:30
十二宫图:360docimg_528_
加入时间: 2003/09/07
文章: 1945
来自: 上海
360docimg_529_
360docimg_530_时间: 2006-4-03 21:18:46    标题:360docimg_531_360docimg_532_
charon 写道:
其实脚本语言也可以有编译期检查的,即搞一点静态类型的东西。
groovy的邮件列表里面有这个需求(从性能角度提出来的),但是还没做出来,hehe.
而且,groovy留了一个很有意思的口子,和一般动态语言不同的是,它并不介意你声明一个对象的类型。因此,如果在脚本代码中坚持使用类型声明,对于重构的支持还是有可能的。而且,对于有特定类型声明的对象而言,编译期的验证也是有可能的。
这种混合结构的类型检查是不彻底的,还不如没有。
返回顶端360docimg_533_360docimg_534_360docimg_535_360docimg_536_
360docimg_537_
charon
Weblogic Cluster
360docimg_538_
加入时间: 2004/06/09
文章: 422
360docimg_539_
360docimg_540_时间: 2006-4-03 21:21:49    标题:360docimg_541_360docimg_542_
彻不彻底取决于代码的编写者.只要是强类型的,编译器本身的验证还是非常鲁棒的.当然,这个还没有实现....
返回顶端360docimg_543_360docimg_544_
360docimg_545_
robbin
论坛管理员
360docimg_546_
360docimg_547_
性别:360docimg_548_
年龄:30
十二宫图:360docimg_549_
加入时间: 2003/09/07
文章: 1945
来自: 上海
360docimg_550_
360docimg_551_时间: 2006-4-03 21:30:49    标题:360docimg_552_360docimg_553_
我现在认为:
诸如spring这种配置bean之间依赖关系的情况(实际上是指明java class之间的调用关系),webwork这种配置Action之间依赖关系的情况(URL与java class之间的对应关系)的情况,即涉及到概览性描述class的情况,是非常适合使用Java语言本身去描述的。同样的情况还有struts-config.xml等等。这些情况是Jacn大展伸手的地方。
涉及到颗粒度很细的class自身内部的信息,则非常适合使用annotation去描述,例如Hibernate的hbm映射文件,Webwork Action的validation.xml文件等等,所幸的是,Hibernate和Webwork都提供了相应的annotation功能。
还有一种情况是不依赖与任何class的流程性,规则性描述,例如工作流定义,规则引擎的规则定义,ant的编译文件等等,这些东西非常适合与使用纯脚本去描述,因为他们本身带有比较强的程序逻辑性,却又抽象级别比较高,我认为非常适合使用groovy这样的脚本语言去描述(当然类似的脚本还有很多例如beanshell等等)
最后,我认为XML适合场合在于异构系统的整合,以及松散藕合的分布式调用上面,即web services适用的场合(XMLHTTP实际上也是某种程度上面的web services),目前比较热门的商业词汇SOA描述的应用场景正是XML大显身手的地方。
综上所述,我认为XML在Java世界这么多年来,被严重误用了。看看Python配置文件多喜欢用py,Ruby配置文件多喜欢用yaml,我们要反思一下,并不是不能够用Java写配置文件的。
当然考虑到编译性语言的编译需要和语法的严谨性限制上,并不是什么配置都适合使用Java的,然而spring和webwork配置文件这种描述class之间关系的配置无疑不应该使用XML,也不应该使用脚本,而应该采用Java。
返回顶端360docimg_554_360docimg_555_360docimg_556_360docimg_557_
360docimg_558_
cookoo
Caucho Resin
360docimg_559_
360docimg_560_
性别:360docimg_561_
加入时间: 2006/02/16
文章: 20
来自: Montreal
360docimg_562_
360docimg_563_时间: 2006-4-04 06:17:37    标题:360docimg_564_360docimg_565_
charon 写道:
彻不彻底取决于代码的编写者.只要是强类型的,编译器本身的验证还是非常鲁棒的.当然,这个还没有实现....
从其他语言看,动态类型的语言要获得重构支持比较困难.
groovy是动态的巴? 它的很多特性也是基于动态性的, 很难想象"可选静态类型"是什么样子. 而且就算groovy很慢,性能也不是主要问题,因为总可以直接用java改写瓶颈部分.
返回顶端360docimg_566_360docimg_567_
360docimg_568_
charon
Weblogic Cluster
360docimg_569_
加入时间: 2004/06/09
文章: 422
360docimg_570_
360docimg_571_时间: 2006-4-04 08:33:44    标题:360docimg_572_360docimg_573_
cookoo 写道:
charon 写道:
彻不彻底取决于代码的编写者.只要是强类型的,编译器本身的验证还是非常鲁棒的.当然,这个还没有实现....
从其他语言看,动态类型的语言要获得重构支持比较困难.
groovy是动态的巴? 它的很多特性也是基于动态性的, 很难想象"可选静态类型"是什么样子. 而且就算groovy很慢,性能也不是主要问题,因为总可以直接用java改写瓶颈部分.
当初用groovy的原因也是这个,如果因为某些原因,就可以使用java来扩展它。
其实groovy可以做成一个动态强类型,并且允许特定类型声明的语言,现在的脚本语言中,python是动态强类型的,vbs是动态弱类型的,但都不支持特定类型声明。如果groovy能够成为第一个这样的语言,那么,很可能在某些方面集成了动态语言和静态语言的优点。对于重构的支持、编译期查错都能够比一般的动态语言要强。
现在groovy编译器实际上并没有对可以静态判定的类型在使用中的一致性进行检查。
返回顶端360docimg_574_360docimg_575_
360docimg_576_
cookoo
Caucho Resin
360docimg_577_
360docimg_578_
性别:360docimg_579_
加入时间: 2006/02/16
文章: 20
来自: Montreal
360docimg_580_
360docimg_581_时间: 2006-4-04 09:44:05    标题:360docimg_582_360docimg_583_
charon 写道:
cookoo 写道:
charon 写道:
彻不彻底取决于代码的编写者.只要是强类型的,编译器本身的验证还是非常鲁棒的.当然,这个还没有实现....
从其他语言看,动态类型的语言要获得重构支持比较困难.
groovy是动态的巴? 它的很多特性也是基于动态性的, 很难想象"可选静态类型"是什么样子. 而且就算groovy很慢,性能也不是主要问题,因为总可以直接用java改写瓶颈部分.
当初用groovy的原因也是这个,如果因为某些原因,就可以使用java来扩展它。
其实groovy可以做成一个动态强类型,并且允许特定类型声明的语言,现在的脚本语言中,python是动态强类型的,vbs是动态弱类型的,但都不支持特定类型声明。如果groovy能够成为第一个这样的语言,那么,很可能在某些方面集成了动态语言和静态语言的优点。对于重构的支持、编译期查错都能够比一般的动态语言要强。
现在groovy编译器实际上并没有对可以静态判定的类型在使用中的一致性进行检查。
如果真要搞需要类型声明的动态语言的话,从另一方面讲也同时继承了两边的弱点:类型声明的繁琐和动态语言缺乏编译期检查. 另外你想过既然是动态类型,怎么在设计期明确声明类型呢?编译期又能检查出什么呢?要真这么做那动态语言里的多态就恐怕要推倒重来了.
现在新的语言设计趋势是类型推断, 也就是不需要明确声明的静态类型. .net下的Boo就是这个设计思路,单论速度大概是ironpython的十倍. 不过有趣的是Boo是弱类型的: 1 + ‘1‘ = ‘11‘ ! 动态语言的重构支持也有成功的,就是smalltalk. 它的refactoring browser是重构工具的鼻祖, 那是因为smalltalk的设计期就是运行期.
唉,现在世界确实比较混乱了...
返回顶端360docimg_584_360docimg_585_
360docimg_586_
charon
Weblogic Cluster
360docimg_587_
加入时间: 2004/06/09
文章: 422
360docimg_588_
360docimg_589_时间: 2006-4-04 10:10:46    标题:360docimg_590_360docimg_591_
所以才要类型声明可选的动态语言啊。此时,编译器帮你自动搞定可以静态判断类型的。实际上,对于动态强类型语言的使用者而言,大多数情况下(如果不是全部的话)都知道所定义变量的类型。
不需要明确声明的静态类型是不自洽的。一旦有参数传递,那所有东西都不是静态可考了,只有在运行期才能确定真正的类型。
其实,如果没有出现ROR,ruby充其量也就是smalltalk那类小生境语言。现在的话,可能搞定php?
返回顶端360docimg_592_360docimg_593_
360docimg_594_
potian
BEA Weblogic
360docimg_595_
年龄:36
加入时间: 2003/11/12
文章: 283
360docimg_596_
360docimg_597_时间: 2006-4-04 13:12:23    标题:360docimg_598_360docimg_599_
程序中的业务逻辑问题比类型问题严重的多,普通的测试覆盖率,就轻松地解决类型问题
程序员写程序的时候只要坚持好的习惯,例如不把同一个变量用于不同的目的,真正的类型错误很少会出现,考虑我们在Java1.4以前的集合类型就知道了,Java能在编译时检查出集合里面对象的类型吗,不能,谁经常在写集合代码的时候搞错类型了吗,没有,除非你思路混乱。而在一个普通的Java程序里,围绕着集合进行的代码占据了极高的比例。
就算不是TDD,只要坚持对每一个单元进行测试,类型错误出现的可能性是微乎其微。而不管是否静态动态语言,单元测试应该是一个非常基本的要求。
我不认为动态类型会有多少不安全或者会让程序员犯多少错误。代码行多少,代码阅读是否简单、易于理解才是可能产生错误多少的根本原因。
但是弱类型在这方面可怕得很,可是我们用了整整30多年C了。
上一次由potian于2006-4-04 周二, 下午2:08修改,总共修改了1次
返回顶端360docimg_600_360docimg_601_
360docimg_602_
potian
BEA Weblogic
360docimg_603_
年龄:36
加入时间: 2003/11/12
文章: 283
360docimg_604_
360docimg_605_时间: 2006-4-04 14:02:40    标题:360docimg_606_360docimg_607_
对重新命名之类的重构可能工具会起到作用。
但是实际工作中的重要重构都是需要手工操作的。例如最常见的重构方法是抽取方法、抽取抽象类或成员在类之间的转移。很多时候抽取方法通常不能整段整段地进行,而是需要先从相互纠缠的代码整理出一段干净的单责任的代码,加上冗余的变量,然后先抽取一段成一个方法,进行测试。接下去再对剩余的代码重复上述过程。这个过程基本上工具是很少有用处的,除了一切都准备好以后抽取那一下,但就算这一下,很多工具也是不合意的。
返回顶端360docimg_608_360docimg_609_
360docimg_610_
zkj_beyond
Oracle9iAS
360docimg_611_
360docimg_612_
性别:360docimg_613_
年龄:24
加入时间: 2004/05/02
文章: 155
360docimg_614_
360docimg_615_时间: 2006-4-04 15:07:18    标题:360docimg_616_360docimg_617_
引用:
potian
实在,高度不一样。
从另外角度看确实不会360docimg_618_
返回顶端360docimg_619_360docimg_620_360docimg_621_360docimg_622_
360docimg_623_
charon
Weblogic Cluster
360docimg_624_
加入时间: 2004/06/09
文章: 422
360docimg_625_
360docimg_626_时间: 2006-4-04 16:24:56    标题:360docimg_627_360docimg_628_
其实我对ruby最大的迷惑是没找到接口在哪里。虽然之前的动态语言确实是不需要接口的。
我一直觉得单元测试很难保证使用者按照类的编写者所设想的正当方式来使用那些方法,毕竟不是很多人都会去看着测试用例写调用代码。而接口可以被看成是契约的一种表示,并且它是抽象的,不会受到具体实现的困扰。
动态语言使用上的巨大灵活性,使我感到仅仅靠单元测试很有点力不从心。应该说,现有的测试工具对于广泛使用诸如closure之类结构的动态语言而言,存在着阻抗不匹配的现象。
对于重构,我赞同potian的看法,除了在涉及到包/类/方法重命名的时候,使用工具确实非常轻快之外,其它的很多场合,使不使用对效率并没有显著的影响。
返回顶端360docimg_629_360docimg_630_
作者 正文
cookoo
Caucho Resin
360docimg_631_
360docimg_632_
性别:360docimg_633_
加入时间: 2006/02/16
文章: 20
来自: Montreal
360docimg_634_
360docimg_635_时间: 2006-4-04 18:57:29    标题:360docimg_636_360docimg_637_
如果的事情就不用谈了, DHH说假如当初没有先看见ruby他大概也会去用python写rails. 那样的话现在python可以一脚踢开java横着走了360docimg_638_
interface我一直认为只是静态类型和OO的折衷的产物,不是OO的必须要素. 动态类型如果要明确声明接口那method_missing又怎么实现呢? 灵活性总是要有代价, 只是要看这个性价比合算与否.
我同意你说的很少人看测试来用代码的,因为测试包含很多边界情况,而不像文档中只包含正常情况. 当然通过文档来约定如何使用不能像interface那样获得编译期检查. 但是真会出问题么?不会啊. Bruce Eckel早就写过文章谈过这个问题了.
返回顶端360docimg_639_360docimg_640_
360docimg_641_
charon
Weblogic Cluster
360docimg_642_
加入时间: 2004/06/09
文章: 422
360docimg_643_
360docimg_644_时间: 2006-4-04 21:59:00    标题:360docimg_645_360docimg_646_
Strong Test实际上是很难达到的。
我曾经在Robert Martin的“敏捷软件开发”中的保龄球例子中找到过很明显而且严重的逻辑错误,有人据称在后面的更加复杂的例子中找到过更为恶劣的逻辑错误。那是一本以TDD来讲敏捷的书。
当然,这类错误不论在静态类型语言还是动态类型语言都会出现,我只是想说明,彻底、或者不那么彻底但够用的测试是很困难的。尤其是涉及到多个对象的合作逻辑的时候(当然,easymock是一个很漂亮的工具)。单个方法的工作方式可以预期,但是一旦交织(因为现在都倾向于编写那类短促的方法,还有一些人喜欢重用,所以这类交织的频率就更多),那就是在考验开发者的逻辑思维和想象能力了。我一直觉得je上的大伙对程序员的测试能力太乐观了。
实际上,从某种意义上来说,我们需要进一步强化测试的手段,而不是弱化。那么,有必要取消静态类型检查么?毕竟,这是一种更加廉价的测试。
谈到接口,我觉得这是一个关键性进步之一。从解耦的角度来看,接口提供了调用者和实现者之间的一个支点,使得契约得以不依赖于调用者和实现者而独立存在。这是一种非常自然和直观的思维方式。曾经我对针对接口的契约定义(比如通过annotation)和测试非常感兴趣,但后来俗事太多...
而且,接口本身和missing-method是没有关系的,但它可以添加强制约束。
一个抛弃接口的动态强类型语言,只是返古。但是,想要在动态类型语言中引入接口,同时又要保持语义模型的一致性,是件不容易的事情。
返回顶端360docimg_647_360docimg_648_
360docimg_649_
potian
BEA Weblogic
360docimg_650_
年龄:36
加入时间: 2003/11/12
文章: 283
360docimg_651_
360docimg_652_时间: 2006-4-04 22:28:19    标题:360docimg_653_360docimg_654_
尽管静态类型检查确实比较廉价,因为你必须测试,所以区别已经不大了
在Ruby里面类型是duck type,也就是说如果我只关心你的叫法和你的走路方法,那么只要你象鸭子一样嘎嘎叫,像鸭子一样蹒跚走路,那么我就把你当作鸭子。
例如我很关心我女儿的身高,有一天突然发现我女儿比桌子高了,我就比着凳子和我女儿说,“你看原来你只有这么一点高”,又指着桌子说,“看看,现在比桌子还高了”。只是为了比一个高低,桌子、凳子、我女儿(小孩)没有必要去实现一个hasHeight这个接口,只要他们都有Height就行了。
返回顶端360docimg_655_360docimg_656_
360docimg_657_
charon
Weblogic Cluster
360docimg_658_
加入时间: 2004/06/09
文章: 422
360docimg_659_
360docimg_660_时间: 2006-4-04 22:44:51    标题:360docimg_661_360docimg_662_
这里就有一个偶然性等同问题,如果碰巧两个对象都有同名方法,但是语义不同,在这种情况下都是可以去搞一下的。
比如,人和人XXX,狗和狗XXX,假如都是用xxx这个方法。就很容易出现人和狗xxx这样的事情。而且,测试的时候也很难用简单的方式发现到底是哪两种东西在xxx.
返回顶端360docimg_663_360docimg_664_
360docimg_665_
robbin
论坛管理员
360docimg_666_
360docimg_667_
性别:360docimg_668_
年龄:30
十二宫图:360docimg_669_
加入时间: 2003/09/07
文章: 1945
来自: 上海
360docimg_670_
360docimg_671_时间: 2006-4-04 23:08:10    标题:360docimg_672_360docimg_673_
potian 写道:
对重新命名之类的重构可能工具会起到作用。
但是实际工作中的重要重构都是需要手工操作的。例如最常见的重构方法是抽取方法、抽取抽象类或成员在类之间的转移。很多时候抽取方法通常不能整段整段地进行,而是需要先从相互纠缠的代码整理出一段干净的单责任的代码,加上冗余的变量,然后先抽取一段成一个方法,进行测试。接下去再对剩余的代码重复上述过程。这个过程基本上工具是很少有用处的,除了一切都准备好以后抽取那一下,但就算这一下,很多工具也是不合意的。
这种重构往往在整理单责任代码的同时伴随着配置的修改,class的rename和move等动作,甚至包括class调用关系的调整。这里抛开ruby,只看Java,就算单元测试代码齐全,无论如何Eclipse能够给我提供的帮助远远超过UltraEdit。目前我面临的问题是,我希望重构能够把XML配置一起放进去,否则XML我总是要重新review一遍,严重影响重构的信心,因此产生了使用Java来表达配置信息的想法。
总之,我认为对于静态类型语言例如Java来说,这种类型严格定义可以让Eclipse这种IDE帮我们做很多很多事情。我不认为在UltraEdit里面rename,move是一件很轻松的事情。
返回顶端360docimg_674_360docimg_675_360docimg_676_360docimg_677_
360docimg_678_
cookoo
Caucho Resin
360docimg_679_
360docimg_680_
性别:360docimg_681_
加入时间: 2006/02/16
文章: 20
来自: Montreal
360docimg_682_
360docimg_683_时间: 2006-4-04 23:48:17    标题:360docimg_684_360docimg_685_
charon 写道:
这里就有一个偶然性等同问题,如果碰巧两个对象都有同名方法,但是语义不同,在这种情况下都是可以去搞一下的。
比如,人和人XXX,狗和狗XXX,假如都是用xxx这个方法。就很容易出现人和狗xxx这样的事情。而且,测试的时候也很难用简单的方式发现到底是哪两种东西在xxx.
很简单,大部分动态语言都有方法在运行期判断对象的类型(ruby用kind_of?). 人和狗是不能xxx(除非程序员想这么干,编译器能查出这种大逆不道的语义么?),但还有很多别的共性巴,毕竟大家都是动物嘛哈哈.强类型的麻烦就是所有这些共同的部分都要重复处理. 我前面说了,这是灵活性和性能的不同权衡.
返回顶端360docimg_686_360docimg_687_
360docimg_688_
capitain
Macromedia JRun
360docimg_689_
加入时间: 2003/09/13
文章: 51
360docimg_690_
360docimg_691_时间: 2006-4-05 00:29:58    标题:360docimg_692_360docimg_693_
charon 写道:
其实我对ruby最大的迷惑是没找到接口在哪里。虽然之前的动态语言确实是不需要接口的。
我一直觉得单元测试很难保证使用者按照类的编写者所设想的正当方式来使用那些方法,毕竟不是很多人都会去看着测试用例写调用代码。而接口可以被看成是契约的一种表示,并且它是抽象的,不会受到具体实现的困扰。
动态语言使用上的巨大灵活性,使我感到仅仅靠单元测试很有点力不从心。应该说,现有的测试工具对于广泛使用诸如closure之类结构的动态语言而言,存在着阻抗不匹配的现象。
对于重构,我赞同potian的看法,除了在涉及到包/类/方法重命名的时候,使用工具确实非常轻快之外,其它的很多场合,使不使用对效率并没有显著的影响。
对于ruby的duck typing来说, 的确无法保证charon所要求的东西, 不过看问题也要分两面, 失去什么,得到什么, 分析起来, 我觉得ruby还是划算的...
返回顶端360docimg_694_360docimg_695_360docimg_696_
360docimg_697_
potian
BEA Weblogic
360docimg_698_
年龄:36
加入时间: 2003/11/12
文章: 283
360docimg_699_
360docimg_700_时间: 2006-4-05 00:44:31    标题:360docimg_701_360docimg_702_
对XML我也没什么好感。不过很多时候是因为被滥用了。
一个原因是用作不恰当的地方,譬如ANT,明明是编程,为什么要用XML,复杂程序的构造过程可能和很多系统、外部工具、编译器打交道,或者要获取外部资源,用XML写只能在别人提供的功能内打圈圈,或者自己写插件。譬如我们的集成构造过程失败需要向我们自己报警服务器发送一个报警信号,这个报警服务器根据预定义的规则会触发警灯、语音播放、email、短消息等等。我非要去写个什么publisher插件,传送参数也麻烦的很,解析来解析去,写得对不对还不知道,动作被生生割成两块。如果象rake只需要一句简单的socket发送即可,所有的上下文全部都在程序里面,谁提交的,什么构造问题等等之类的。
另外是分散和重复,象Hibernate的XML就属于重复工作,万恶之源莫过于重复了。还有像Web.xml的filter配置,为什么不用annotation或者象Rails一样和代码写在一起。不过对annotation我也没什么好感,那是另花。
还有就算用作配置有时候也不够动态,特别是和系统业务相关的配置,一开始觉得这些配置不会变,用了XML,结果呢,需要动态增加或删除,放在数据库里面才是正道,当然为了CVS的方便,可以用脚本维护。
还有就是太复杂,根本没有层次的配置文件,用properties比XML好得多。就算有层次的,要生成对象的,绝大多数YAML也比XML好,易读,清晰。
返回顶端360docimg_703_360docimg_704_
360docimg_705_
javavsnet
Caucho Resin
360docimg_706_
360docimg_707_
加入时间: 2005/07/12
文章: 19
360docimg_708_
360docimg_709_时间: 2006-4-05 08:45:04    标题:360docimg_710_360docimg_711_
cookoo 写道:
如果的事情就不用谈了, DHH说假如当初没有先看见ruby他大概也会去用python写rails. 那样的话现在python可以一脚踢开java横着走了360docimg_712_
ror中把方法映射为url的方式和CherryPy是一致的,应该是参考了CherryPy,可惜没有用Python写rails
返回顶端360docimg_713_360docimg_714_
360docimg_715_
towjzhou
Macromedia JRun
360docimg_716_
360docimg_717_
性别:360docimg_718_
年龄:6
十二宫图:360docimg_719_
加入时间: 2004/06/04
文章: 73
来自: 上海
360docimg_720_
360docimg_721_时间: 2006-4-05 09:16:12    标题:360docimg_722_360docimg_723_
robbin 写道:
potian 写道:
对重新命名之类的重构可能工具会起到作用。
但是实际工作中的重要重构都是需要手工操作的。例如最常见的重构方法是抽取方法、抽取抽象类或成员在类之间的转移。很多时候抽取方法通常不能整段整段地进行,而是需要先从相互纠缠的代码整理出一段干净的单责任的代码,加上冗余的变量,然后先抽取一段成一个方法,进行测试。接下去再对剩余的代码重复上述过程。这个过程基本上工具是很少有用处的,除了一切都准备好以后抽取那一下,但就算这一下,很多工具也是不合意的。
这种重构往往在整理单责任代码的同时伴随着配置的修改,class的rename和move等动作,甚至包括class调用关系的调整。这里抛开ruby,只看Java,就算单元测试代码齐全,无论如何Eclipse能够给我提供的帮助远远超过UltraEdit。目前我面临的问题是,我希望重构能够把XML配置一起放进去,否则XML我总是要重新review一遍,严重影响重构的信心,因此产生了使用Java来表达配置信息的想法。
总之,我认为对于静态类型语言例如Java来说,这种类型严格定义可以让Eclipse这种IDE帮我们做很多很多事情。我不认为在UltraEdit里面rename,move是一件很轻松的事情。
在xml引用的几乎都是类名,而类名的重构是可以波及到xml里面的,不管是移动还是重命名(至少在idea里可以)。
返回顶端360docimg_724_360docimg_725_360docimg_726_
360docimg_727_
charon
Weblogic Cluster
360docimg_728_
加入时间: 2004/06/09
文章: 422
360docimg_729_
360docimg_730_时间: 2006-4-05 10:28:43    标题:360docimg_731_360docimg_732_
cookoo 写道:
很简单,大部分动态语言都有方法在运行期判断对象的类型(ruby用kind_of?). 人和狗是不能xxx(除非程序员想这么干,编译器能查出这种大逆不道的语义么?),但还有很多别的共性巴,毕竟大家都是动物嘛哈哈.强类型的麻烦就是所有这些共同的部分都要重复处理. 我前面说了,这是灵活性和性能的不同权衡.
但是你如果在方法里面用这类动态类型判断的话,实际上就已经很丑陋了,这个做法比在方法签名上声明类型要差很多。
返回顶端360docimg_733_360docimg_734_
360docimg_735_
potian
BEA Weblogic
360docimg_736_
年龄:36
加入时间: 2003/11/12
文章: 283
360docimg_737_
360docimg_738_时间: 2006-4-05 10:35:19    标题:360docimg_739_360docimg_740_
这完全是一个程序的逻辑问题,既然你在动态语言里面把逻辑写成人狗XX,静态语言也是一样的。别人有办法阻止你吗,这个和我们讨论的有关系吗,就算要接口,别人也会去定义,你总不能运用伦理编译器去判断这个接口不合理吧。
引用:
但是你如果在方法里面用这类动态类型判断的话,实际上就已经很丑陋了,这个做法比在方法签名上声明类型要差很多。
然,这就是动态语言静态化使用。除了少数的地方,例如Ruby里面处理重载方法的时候
返回顶端360docimg_741_360docimg_742_
360docimg_743_
cookoo
Caucho Resin
360docimg_744_
360docimg_745_
性别:360docimg_746_
加入时间: 2006/02/16
文章: 20
来自: Montreal
360docimg_747_
360docimg_748_时间: 2006-4-05 11:08:37    标题:360docimg_749_360docimg_750_
charon 写道:
cookoo 写道:
很简单,大部分动态语言都有方法在运行期判断对象的类型(ruby用kind_of?). 人和狗是不能xxx(除非程序员想这么干,编译器能查出这种大逆不道的语义么?),但还有很多别的共性巴,毕竟大家都是动物嘛哈哈.强类型的麻烦就是所有这些共同的部分都要重复处理. 我前面说了,这是灵活性和性能的不同权衡.
但是你如果在方法里面用这类动态类型判断的话,实际上就已经很丑陋了,这个做法比在方法签名上声明类型要差很多。
那你觉得仅仅为了不同参数类型一个方法重复写好几遍很漂亮?. 看java api doc的时候凡是重载出现的地方都一段话翻来复去地说很有意义?
对了,突然想起python jit: psyco的做法. 就是启动时自动生成方法的多个不同类型版本,这样既可以不用明确类型,也不用在运行期检查,提高了速度. 这样好了巴?咱们别管这个动态vs静态的小问题了.360docimg_751_
上一次由cookoo于2006-4-05 周三, 上午11:24修改,总共修改了1次
返回顶端360docimg_752_360docimg_753_
360docimg_754_
robbin
论坛管理员
360docimg_755_
360docimg_756_
性别:360docimg_757_
年龄:30
加入时间: 2003/09/07
文章: 1945
来自: 上海
360docimg_758_
360docimg_759_时间: 2006-4-05 11:19:05    标题:360docimg_760_360docimg_761_
towjzhou 写道:
robbin 写道:
potian 写道:
对重新命名之类的重构可能工具会起到作用。
但是实际工作中的重要重构都是需要手工操作的。例如最常见的重构方法是抽取方法、抽取抽象类或成员在类之间的转移。很多时候抽取方法通常不能整段整段地进行,而是需要先从相互纠缠的代码整理出一段干净的单责任的代码,加上冗余的变量,然后先抽取一段成一个方法,进行测试。接下去再对剩余的代码重复上述过程。这个过程基本上工具是很少有用处的,除了一切都准备好以后抽取那一下,但就算这一下,很多工具也是不合意的。
这种重构往往在整理单责任代码的同时伴随着配置的修改,class的rename和move等动作,甚至包括class调用关系的调整。这里抛开ruby,只看Java,就算单元测试代码齐全,无论如何Eclipse能够给我提供的帮助远远超过UltraEdit。目前我面临的问题是,我希望重构能够把XML配置一起放进去,否则XML我总是要重新review一遍,严重影响重构的信心,因此产生了使用Java来表达配置信息的想法。
总之,我认为对于静态类型语言例如Java来说,这种类型严格定义可以让Eclipse这种IDE帮我们做很多很多事情。我不认为在UltraEdit里面rename,move是一件很轻松的事情。
在xml引用的几乎都是类名,而类名的重构是可以波及到xml里面的,不管是移动还是重命名(至少在idea里可以)。
Eclipse也可以,但是不彻底,所以还是要review,等于没有。
返回顶端360docimg_762_360docimg_763_360docimg_764_360docimg_765_
360docimg_766_
charon
Weblogic Cluster
360docimg_767_
加入时间: 2004/06/09
文章: 422
360docimg_768_
360docimg_769_时间: 2006-4-05 11:23:49    标题:360docimg_770_360docimg_771_
potian 写道:
对XML我也没什么好感。不过很多时候是因为被滥用了。
一个原因是用作不恰当的地方,譬如ANT,明明是编程,为什么要用XML,复杂程序的构造过程可能和很多系统、外部工具、编译器打交道,或者要获取外部资源,用XML写只能在别人提供的功能内打圈圈,或者自己写插件。譬如我们的集成构造过程失败需要向我们自己报警服务器发送一个报警信号,这个报警服务器根据预定义的规则会触发警灯、语音播放、email、短消息等等。我非要去写个什么publisher插件,传送参数也麻烦的很,解析来解析去,写得对不对还不知道,动作被生生割成两块。如果象rake只需要一句简单的socket发送即可,所有的上下文全部都在程序里面,谁提交的,什么构造问题等等之类的。
另外是分散和重复,象Hibernate的XML就属于重复工作,万恶之源莫过于重复了。还有像Web.xml的filter配置,为什么不用annotation或者象Rails一样和代码写在一起。不过对annotation我也没什么好感,那是另花。
还有就算用作配置有时候也不够动态,特别是和系统业务相关的配置,一开始觉得这些配置不会变,用了XML,结果呢,需要动态增加或删除,放在数据库里面才是正道,当然为了CVS的方便,可以用脚本维护。
还有就是太复杂,根本没有层次的配置文件,用properties比XML好得多。就算有层次的,要生成对象的,绝大多数YAML也比XML好,易读,清晰。
非常赞同啊。
我对xml、对annotation,甚至aop的过度使用都觉得不爽。但是,没办法啊。也想过用数据库里来保存某些配置信息,但是做得好也太麻烦了。
另外,如果只是要发送socket消息(看起来选择什么级别的报警都是报警服务器的事情),按照持续构建工具的要求写一个类似于publisher的东西应该不难吧,一般的持续构建工具都会提供email,jabber,msn等几种标的,模出一个socket的来(找一个开源工具包搞定socket基本不需要力气),也花不了多少时间。
返回顶端360docimg_772_360docimg_773_
作者 正文
charon
Weblogic Cluster
360docimg_774_
加入时间: 2004/06/09
文章: 422
360docimg_775_
360docimg_776_时间: 2006-4-05 11:32:57    标题:360docimg_777_360docimg_778_
potian 写道:
这完全是一个程序的逻辑问题,既然你在动态语言里面把逻辑写成人狗XX,静态语言也是一样的。别人有办法阻止你吗,这个和我们讨论的有关系吗,就算要接口,别人也会去定义,你总不能运用伦理编译器去判断这个接口不合理吧。
其实这个问题和接口无关,只是和方法签名有关系。静态语言的话,对于人的xxx方法,偶可以定义xxx(HumanBeing target). 这个时候,最差也只是出现gay的情况。对于dog,则可以定义xxx(Dog target).这个时候,即便两个方法名字一样,因为签名不同,也没办法混用的。
当然,繁琐是繁琐一点,但是相当的坚固。如果使用泛型的话,倒可以和接口扯上边,可以简化一些,但是,java的泛型,太难懂了。
返回顶端360docimg_779_360docimg_780_
360docimg_781_
Trustno1
Weblogic Cluster
360docimg_782_
360docimg_783_
加入时间: 2004/03/02
文章: 424
360docimg_784_
360docimg_785_时间: 2006-4-05 12:18:53    标题:360docimg_786_360docimg_787_
尝试一些 type inference 的语言好了.
比如说
class A:
private name=""
get_name():
return name;
name 受型string,那么get_name自动推导出string 类型.在dynamic 语言里面加type inference 是很容易的事情,比如PyLint.只要编译器过关,type inference 是替代static type/dynamic type的一个非常有力的候选者,估计可以甩duck typing 八九条街的样子.
返回顶端360docimg_788_360docimg_789_
360docimg_790_
charon
Weblogic Cluster
360docimg_791_
加入时间: 2004/06/09
文章: 422
360docimg_792_
360docimg_793_时间: 2006-4-05 12:25:10    标题:360docimg_794_360docimg_795_
Trustno1 写道:
尝试一些 type inference 的语言好了.
比如说
class A:
private name=""
get_name():
return name;
name 受型string,那么get_name自动推导出string 类型.
只要编译器过关,type inference 是替代static type/dynamic type的一个非常有力的候选者,估计可以甩duck typing 八九条街的样子
好像java泛型里面也有一些type inference的成分,就是看了半天没看明白该怎么用。
觉得groovy可以那么搞一搞,一来加强编译期的检测,二来可以减少运行期的反射开销。
最后就变成一个拥有动态脚本书写特征和强化编译检查的超级无敌杂交私生子。
返回顶端360docimg_796_360docimg_797_
360docimg_798_
Trustno1
Weblogic Cluster
360docimg_799_
360docimg_800_
加入时间: 2004/03/02
文章: 424
360docimg_801_
360docimg_802_时间: 2006-4-05 12:33:57    标题:360docimg_803_360docimg_804_
charon 写道:
Trustno1 写道:
尝试一些 type inference 的语言好了.
比如说
class A:
private name=""
get_name():
return name;
name 受型string,那么get_name自动推导出string 类型.
只要编译器过关,type inference 是替代static type/dynamic type的一个非常有力的候选者,估计可以甩duck typing 八九条街的样子
好像java泛型里面也有一些type inference的成分,就是看了半天没看明白该怎么用。
觉得groovy可以那么搞一搞,一来加强编译期的检测,二来可以减少运行期的反射开销。
最后就变成一个拥有动态脚本书写特征和强化编译检查的超级无敌杂交私生子。
Java 的Generic 对于type inference 可差远了.
返回顶端360docimg_805_360docimg_806_
360docimg_807_
charon
Weblogic Cluster
360docimg_808_
加入时间: 2004/06/09
文章: 422
360docimg_809_
360docimg_810_时间: 2006-4-05 16:32:12    标题:360docimg_811_360docimg_812_
Trustno1 写道:
Java 的Generic 对于type inference 可差远了.
其实java generic只是用type inference来解决在java中引入generic之后可能引起的问题,而顺便提供了一点点的这类能力,而且很不直观。在这里只是一种手段,不是目标,更谈不上号召力了。
不过,好像基本没有看到动态/静态语言旗帜鲜明地搞编译期type inference的。动态语言反正也光棍了,不在乎这点。而静态语言的哲学好像巴不得多写几个字呢,难呢。
返回顶端360docimg_813_360docimg_814_
360docimg_815_
Trustno1
Weblogic Cluster
360docimg_816_
360docimg_817_
加入时间: 2004/03/02
文章: 424
360docimg_818_
360docimg_819_时间: 2006-4-05 16:39:07    标题:360docimg_820_360docimg_821_
charon 写道:
Trustno1 写道:
Java 的Generic 对于type inference 可差远了.
其实java generic只是用type inference来解决在java中引入generic之后可能引起的问题,而顺便提供了一点点的这类能力,而且很不直观。
不过,好像基本没有看到动态/静态语言旗帜鲜明地搞编译期type inference的。动态语言反正也光棍了,不在乎这点。而静态语言的哲学好像巴不得多写几个字呢,难呢。
自然是有的,Haskell,Boo,ML,当然还有B教主的C++0x.B教主万岁!天福永享寿与天齐!
返回顶端360docimg_822_360docimg_823_
360docimg_824_
charon
Weblogic Cluster
360docimg_825_
加入时间: 2004/06/09
文章: 422
360docimg_826_
360docimg_827_时间: 2006-4-05 17:02:27    标题:360docimg_828_360docimg_829_
倒!!!!
返回顶端360docimg_830_360docimg_831_
360docimg_832_
charon
Weblogic Cluster
360docimg_833_
加入时间: 2004/06/09
文章: 422
360docimg_834_
360docimg_835_时间: 2006-4-05 17:02:55    标题:360docimg_836_360docimg_837_
一篇关于单元测试和静态类型检查的文章
http://www-128.ibm.com/developerworks/cn/java/j-diag/part25/index.html
返回顶端360docimg_838_360docimg_839_
360docimg_840_
charon
Weblogic Cluster
360docimg_841_
加入时间: 2004/06/09
文章: 422
360docimg_842_
360docimg_843_时间: 2006-4-05 17:10:58    标题:360docimg_844_360docimg_845_
粗粗看了一下,B教主的C++0x,x>=9?实在是太牛X了。
另外那几个haskell,makelove和boo看起来不符合眼球经济学。
返回顶端360docimg_846_360docimg_847_
360docimg_848_
cookoo
Caucho Resin
360docimg_849_
360docimg_850_
性别:360docimg_851_
加入时间: 2006/02/16
文章: 20
来自: Montreal
360docimg_852_
360docimg_853_时间: 2006-4-05 18:33:03    标题:360docimg_854_360docimg_855_
charon 写道:
粗粗看了一下,B教主的C++0x,x>=9?实在是太牛X了。
另外那几个haskell,makelove和boo看起来不符合眼球经济学。
makelove...扑通. 这么让人兴奋的语言怎么没人用啊.
符合眼球的也有的,就是还没出来的C#3,不知java7会不会跟进.这些‘成熟语言‘是不能像groovy那样说改就改了.
Boo其实很有特色. 它既支持type inference也支持duck typing, 怪胎啊. 还有偶前面说错了,Boo是强类型的,但是+/*像python一样对字符串有特殊语义. 罪过~
返回顶端360docimg_856_360docimg_857_
360docimg_858_
Trustno1
Weblogic Cluster
360docimg_859_
360docimg_860_
加入时间: 2004/03/02
文章: 424
360docimg_861_
360docimg_862_时间: 2006-4-05 19:38:30    标题:360docimg_863_360docimg_864_
charon 写道:
粗粗看了一下,B教主的C++0x,x>=9?实在是太牛X了。
另外那几个haskell,makelove和boo看起来不符合眼球经济学。
应该是8吧,赶上奥运会.不过B教主已经把胡子剃了,就不知道会怎么样了
返回顶端360docimg_865_360docimg_866_
360docimg_867_
netfishx
Sybase EAServer
360docimg_868_
360docimg_869_
加入时间: 2005/09/21
文章: 81
来自: 北京
360docimg_870_
360docimg_871_时间: 2006-4-05 23:25:16    标题:360docimg_872_360docimg_873_
Trustno1 写道:
charon 写道:
粗粗看了一下,B教主的C++0x,x>=9?实在是太牛X了。
另外那几个haskell,makelove和boo看起来不符合眼球经济学。
应该是8吧,赶上奥运会.不过B教主已经把胡子剃了,就不知道会怎么样了
同感,B教主这胡子剃得实在是逆天呀逆天
返回顶端360docimg_874_360docimg_875_
360docimg_876_
charon
Weblogic Cluster
360docimg_877_
加入时间: 2004/06/09
文章: 422
360docimg_878_
360docimg_879_时间: 2006-4-06 10:56:10    标题:360docimg_880_360docimg_881_
netfishx 写道:
同感,B教主这胡子剃得实在是逆天呀逆天
逆天? 一看就知道不够虔诚,B教主就是天!!!
返回顶端360docimg_882_360docimg_883_
_xyz