论坛首页 Java企业应用论坛

为什么软件必须编译

浏览 25831 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-06-09  
正如庄表伟提到的,软件开发存在很多视而不见的盲区。
只有破除这些盲区,软件开发才能进步。当人们习惯了
过程话编程的时候,OO站出来说,不对,要数据和操作
一体,于是有了OO。当人们习惯了在不同平台上编写
不同代码的时候,Java站出来说,不对,要有平台无关性。当人们习惯了不同语言编写不同代码的时候,.NET站出来说,不对,各个语言之间要能互相调用,类继承。
当人们习惯了浏览器只是操作系统中的一个普通软件的时候,微软站出来说,不,我们要把整个操作系统做成一个大浏览器。
   只有破除了一个又一个盲区,软件开发才能进步。
为什么软件必须编译,这本身就是另外一个视而不见的问题。Java JVM可以做成一个平台,为什么不能做成一个包括JIT Source的平台?微软既然能把操作系统做成一个大浏览器,为什么不能把操作系统做成一个大编译器?
   前面说了,我对人为割离Java Code和配置的做法感到厌烦.这意味着必须编写配置,编写读配置的Code,调用读配置Code的Code,烦把.
   当把Source也JIT之后,这些烦恼就迎刃而解,包括其他一些问题也能解决,比如动态Enhance还是静态Enhance的问题,AspectJ的修改文件导致难调试问题等等.微软和Sun完全有实力解决这个问题,无非是他们没想到罢了
0 请登录后投票
   发表时间:2004-06-09  
奇怪了,我那一句把别人当傻瓜了?
说别人没想到就涉及价值判断了?
这是什么逻辑?
扯什么共产主义,你说我提的那个微软实现不了么?
IL都JIT了,更何况是区区的Source。
要讨论拿实际的东西来讨论,不要一堆没有内容的
价值判断。
0 请登录后投票
   发表时间:2004-06-09  
最近对动态语言产生了极大的兴趣。说实在的,我倒没有想过软件为什么要编译的问题,可是我觉得提高效率是最重要的。

我想效率有两个方面:一个是开发效率,一个是执行效率。编译语言总会比解释性的语言的执行效率来得快,而动态的脚本语言却有着更高的开发效率。在这个效率的权衡之中,JAVA找到了一个很好的平衡点。

我是赞同femto的观点,为了寻求更高的开发效率,我们确实应该考虑一下软件有编译的必要性吗? 毕竟现在,开发的成本还是居高不下的,而执行效率的考虑已经在硬件不断进步中退到了一个相对次要的位置了。
0 请登录后投票
   发表时间:2004-06-09  
perhaps 写道
为了寻求更高的开发效率,我们确实应该考虑一下软件有编译的必要性吗? 毕竟现在,开发的成本还是居高不下的,而执行效率的考虑已经在硬件不断进步中退到了一个相对次要的位置了。


nod nod, 深得我心。
0 请登录后投票
   发表时间:2004-06-09  
perhaps 写道

我想效率有两个方面:一个是开发效率,一个是执行效率。编译语言总会比解释性的语言的执行效率来得快,而动态的脚本语言却有着更高的开发效率。在这个效率的权衡之中,JAVA找到了一个很好的平衡点。

nod,nod,总算有人站出来同意我的观点了
关于执行效率方面,其实我已经隐含的提到了,可以用JIT或者PreCompile解决。jsp就有PreCompile,而JIT的话现在不管是Java class文件或者.NET的IL都有即需编译。就是说程序在运行时即需编译成Native Code,这样后续的运行就不会再有效率问题。Java class的JIT的话也有好几种技术,包括load 一个Java 类的时候,把整个Java 类文件即需编译成Native Code,或者使用热点分析,
多次运行需要优化的进行即需编译来优化性能,Java的Hotspot就是这个东东呢。(可以参见这里的说明,http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_4.html)
对于.NET平台,IL头一次执行的话也是JIT成Native Code来运行。
看看HotSpot或者IL的JIT说明,可以看到这个技术还是蛮复杂的,不过对于
微软或者Sun来说就是小Case了,所以他们把JIT延伸到Source领域其实并不是
什么难事。
  关键是,很多头疼的事情,如果Source 可以JIT了,很多问题可以迎韧而解。
除了前面提到的不正常的分割Java Code和配置代码外。还有Rule Engine的
问题。现在的Rule Engine需要学习一门新的语言,然后性能又不行,如果
Source可以JIT了,这个问题就不存在了。甚至连Rule Engine这个名词本身都不需要了,因为Source JIT本身就可以支持得很好了。
  ps:我觉得这个Thread提出一些比较有价值的想法的话,我想把这些想法
Post到外国去,比如说TSS或者Sun或Microsoft的地方,让他们注意到
这个建议,这样兴许一年以后出来的Compiler就支持了,到时候程序员就比较幸福了,我们就不需要为前面提到的诸多问题头疼了:)
0 请登录后投票
   发表时间:2004-06-10  
动态语言就是这样的啊
再说了,用java也可以实现同样的目的,只要你自定义一个classLoader就可以了

问题是:意义有多少?
配置文件动态配置难道你要修改源代码吗?没几天你的软件不就乱套了?动态配置别的方法也可以实现啊

提高开发效率有可能是一个优点,你省去了每次调试编译的时间,但这个时间好像不太多吧?
0 请登录后投票
   发表时间:2004-06-10  
jsp第一次运行会编译
所以第一次访问jsp会超慢
这个工作本来应该发布时做
干嘛要到用户使用时做呢
还不少人喜欢手工precompile一次所有jsp

另外是代码到了用户那里才即时编译难保代码的安全(不净指java)
而且还要用户装编译器
jre跟jdk的区别可能还不算大
传统的应用程序呢(指c++之类的),本来用户就能直接运行的东西,难道你硬要把代码送到用户手上,然后叫用户装个visual studio来运行么,或是一些precompile或jit的东西么(反正就是编译器)

代码到了用户手上其实没什么价值,楼主你需要的是现场修改吧,现场你有能力修改整份代码么,把有需要的部分做成properties其实已经很足够了
0 请登录后投票
   发表时间:2004-06-10  
hehe,很多问题不能一概而论的,如果上纲上线说这个情况是个银弹,适合所有情况那显然是不现实的。
前面的帖子也提到过了,是在deploy的情况下,
配置数据需要改,或者Rule Engine需要改的情况下,
不可能在客户那边装IDE,装Ant什么的把?当然是希望
既改即生效。
  而且这种动态修改的部分肯定是隔离出来的,你当然
不可能把整个程序在客户那里从头到尾的修改。而是指,
你预知大概什么东西会改,比如一些属性的配置,一些
Rule Engine的规则,那些是deploy之后仍然需要改的。
  to zgd, 你说的属性用properties,那么Source这种方式只要一个常量类,用public static final 定义一些常量。另外对于有关联的配置,现在要xml配,然后再转成Java Object的一些关联,要用上xml解析或者xml的marshal/demarshal,还是麻烦的,如果Source本身可修改,那么这种问题不复存在。
  就好像OO提供了Inheritance,而实际中好的软件系统是Favor Composition Over Inheritance的,软件
开发提供给你的强大功能,并不代表你就要滥用。关于前面说的Source功能,需要修改的位置也必须隔离出来,
这样才不至于改的乱了套。
  to age0,微软可开放激进的很,要不然也不会把下一代操作系统做成一个大浏览器了,那么你不如问问他把IE嵌到操作系统里头高明么。微软什么事情干不出来。
你看.NET平台把所有语言都编译到同样的中间语言,
不同语言之间可以相互继承/调用, 这种独创性的想法
就能令人大跌眼镜了。
0 请登录后投票
   发表时间:2004-06-10  
femto 写道
hehe,很多问题不能一概而论的,如果上纲上线说这个情况是个银弹,适合所有情况那显然是不现实的。
前面的帖子也提到过了,是在deploy的情况下,
配置数据需要改,或者Rule Engine需要改的情况下,
不可能在客户那边装IDE,装Ant什么的把?当然是希望
既改即生效。

请问需要编译器吗
其实ide和ant倒是次要,也仅仅是辅助的工具而已,方便你修改代码而已

我举个实际一点的例子
例如我把代码和相应的ant脚本(先编译再运行程序),ant会自动先检测将新文件编译然后再运行程序,那就可以现场修改了。如果你说修改代码不方便,那好,再加一个语法加亮的编辑器,甚至使用大型的ide(注意,这不是必须)。如果你说这不是用了ant吗,我会说你也不是用了编译器吗,再加一个小小的ant不算过分吧。
这不是precompile吗
想更自动化吗,我觉得jsp就是一个例子(其实也差不多的)

至于source jit
jit就是jvm会在内存里先将class编译成native code(如果不对请指正),所以第一次运行class会慢(在编译),第二次运行class就会很快(native code)。但是这个是在内存中进行,关闭vm后native code就会消失。很好,source jit又怎样,第一次会在内存编译source(超慢),编译成class还是native code先不管,第二次就会很快了。关闭vm再开另外一个vm又编译一次(超慢)。如果你说编译出来的东西可以保存在磁盘,我会说这跟我自己运行一个javac有什么区别。
ps,干嘛jit不把native code保存到磁盘呢?这个问题应该跟问干嘛不把java编译成native code差不多。class是跨平台的,vm不是。

我始终不明白自己编译和你所说的自动编译或内存编译有什么区别
0 请登录后投票
   发表时间:2004-06-10  
兩者有什麼區別?
其實我是客戶時我就是不想wait,wait,wait
0 请登录后投票
论坛首页 Java企业应用版

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