论坛首页 Java企业应用论坛

为什么软件必须编译

浏览 25821 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-06-10  
albert_qhd 写道
动态语言就是这样的啊
再说了,用java也可以实现同样的目的,只要你自定义一个classLoader就可以了

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

提高开发效率有可能是一个优点,你省去了每次调试编译的时间,但这个时间好像不太多吧?


很赞成.
就是这个:你自定义一个classLoader就可以了(可以不用class文件,这就看你的技术水平了),就是说这只是看你对于一些东西的封装.
其实任何一种语言都要编译的,就算是汇编,还不是要被化成机器码(二进制),动态语言不也一样要解释(这时候不也是编译吗,要不化成机器码,哪会执行).

我觉得这个话题不值得讨论,因为不觉得编译有什么坏处(因为每一种语言都要编译,只是否为显式/隐式,当然除非你自己直接写二进制),再说,如果你想即时编译的话,要不在java中嵌入动态语言,要不就自己实现(可以实现像Tomcat一样的东西,在你的Code被重新编译后就重新load).

不过在大部的地方这种东西没有多大用处,因为问题本身与这个没有关联.
只是与你解决问题的方式有关联.

再讲一个例子:
在Eclipse 中写一个main类,然后执行它,改一下,再执行它,你觉得它编译了吗(你要显式调用javac与java吗)??
这算不算不用编译呢??

如果我们再把Eclipse(IDE)看成是一种语言(其实IDE是一种容器)的话,那它算不算是一种不用编译的语言呢?

补:觉得这个话题只与自动化有关,与语言问题无关(特别像JAVA这种强大的语言).
0 请登录后投票
   发表时间:2004-06-10  
eclipse保存的时候就会编译的了
还可以设定为保存时不编译,然后手工按complie按钮

eclipse在只有jre的时候就能编译程序并不奇怪,ibm有能力做编译器啊

至于显式调用javac与否,有点像自欺欺人
总不会对着tomcat说,哇真厉害,jsp不用编译就能运行,修改了也立刻出效果
0 请登录后投票
   发表时间:2004-06-10  
提高开发效率最主要的途径还是在语言这一级别上,关键就是使用最简洁的命令(集)表达最丰富的意思。从汇编到c这样的高级语言,开发效率提高了一个级别;从c到java等算是半动态的语言,开发效率又上了半个级别;再从java等到动态语言Python等,开发效率又上了一个级别。可以说开发效率是语言的发展主要动力之一。
0 请登录后投票
   发表时间:2004-06-14  
gcj就是直接编译成本地代码。

本地有效率,但带来的问题就是安全性问题,可能有这方面的考虑。
0 请登录后投票
   发表时间:2004-06-14  
femto 写道

  to zgd, 你说的属性用properties,那么Source这种方式只要一个常量类,用public static final 定义一些常量。另外对于有关联的配置,现在要xml配,然后再转成Java Object的一些关联,要用上xml解析或者xml的marshal/demarshal,还是麻烦的,如果Source本身可修改,那么这种问题不复存在。


哈哈,挺有意思的讨论。其实femto并不是说软件不应该编译,
而是一门心思想把配置文件写到source code里去。

人总有这种时候,看着一样东西,就是觉得不爽,可其实真的
换成你建议的方式,也未必好到哪里去,只是没有试过,我们
不知道罢了。

其实static final 的常量生命类也是一个文件,properties也
是一个文件,谁比谁麻烦多少?你说xml要parse。可xml写起来
多简单呀!你要初始化一个对象数组,各自的属性都不一样你怎
么做?一个一个new,然后一个一个赋值吗?有100个对象,
xml只要把相应数据写出来就行了。要是在code里可就惨了,每个
都要new,然后写对应的属性的值是什么,100个,每个每个
都不一样,连循环都不能用,这么长的code别说读起来费劲,
就说分号你得多敲多少个呀?怎么样?比写个循环读xml麻烦吧!

其实呢!如何配置都没什么关系,只要最终起到的效果是一样的
就行,有人喜欢把擦鞋的工具放在鞋柜里,说和鞋放在一起,好找。
可有的人喜欢把它们放到工具箱里,说都是工具,清晰。
只要找的着,都一样。这不是该不该编译的问题。

至于编译,我想其实大家没什么分歧,肯定要编译。不论是JIT
还是Pre Compile都是要编译的么。那么就是在什么时机编译
的问题了。我觉得,与其每次运行每次编译,还不如写好代码
一次性编译,宁可在开发中牺牲点时间完成这步工作,也不应该
让用户过多的等待。这就是为什么现在所有软件开发都采用这种
方式的原因。我也不认为是微软或Sun没有想到这个问题,只是
它们认为时机还未成熟。更何况,呵呵,商业软件的原代码谁愿
意分发给客户?只要客户水平够高,你不是等于把自己的成果让
给别人,至少后期维护,人家就直接修改了,不用再Pay你钱了
吧~只为了把配置写进代码,付出这么大代价不太值得吧。

还有.net技术就别替他们吹了,也没什么特有创意的,编译成
中间件无非是抄Java的跨平台技术。至于各种语言互相混用,
完全是因为MS现在维护的这几种开发语言,要么不够强大,要
么不够方便,没有一种十全十美,所以每个都有一定的用户群,
微软谁都不能对不起,才这么和稀泥。现在它有了C#肯定会
主推这个工具,把所有语言向这上统一,你说它一套API要做
N个版本,就连编译器都要有N个,它累不累呀它。
0 请登录后投票
   发表时间:2004-06-14  
引用

其实任何一种语言都要编译的,就算是汇编,还不是要被化成机器码(二进制),动态语言不也一样要解释(这时候不也是编译吗,要不化成机器码,哪会执行).


谁说的任何一种语言都要编译?还是有解释执行的么!
比如dos下的批处理文件,你见过编译它的吗?
你要说它不是种语言,那xml是不是语言?
Ant 的 build.xml编译出来的目标文件在哪儿了?
还有Windows Script语言,浏览器中的Java Script语言
都是不编译的。解释执行还是有相当的市场的,只要应用
不太大,效率要求不太高,不在乎原代码传播,那就解释吧。
你把个bat编译成exe也不见得就快到哪里去了。

其实Java也好,.Net也好,都是先编译后解释,
femto的质疑时这种情况下第一层编译还需不需要了。
我想,这么做,一来是因为中间代码的解释效率还是高,
二来多少也有原代码保护的意思吧!

其实象你说的那种动态load的语言,也不是不可能出现,
比如真的把配置(比如rule set)写到了代码里,那客户
运行时配置rule,就等同于程序自己在修改代码,听上去
挺可怕的。程序要是自己能改自己,就有点像病毒了。

说到这儿,我忽然想起了我上学时候帮老师写的机器管理
的程序。要求输入一个密码才能上机,老师说,密码得藏
好了,别让学生在硬盘上找找就找着了。我就把密码hard code
在程序里了,老师急了,说密码也得能改呀,不能每台机器
密码都一样呀~ 我就跟踪出了密码那个字符串在编译后的
exe中的位置,然后每次修改密码,程序就打开自己的exe
把那个字符串替换了,然后再自动reload。现在估计这个
程序早不用了,之后的很多年,我都在想,这样的程序挺奇怪的!
0 请登录后投票
   发表时间:2004-06-15  
实现这个问题和cpu和操作系统有很大关系的,如果你想不编译系统的话,那么要么是要求cpu能直接看懂你的程序,要么是由操作系统来完成这个功能。
如果你学过汇编的话,你就会知道这有多么复杂了。
否则就不会出现 从->机器语言->汇编语言->高级语言
0 请登录后投票
   发表时间:2004-08-24  
femto 写道
为什么只有Java class file才能JIT,而Java Source 不能JIT,
为什么只有IL能JIT,而C# Source 不能JIT.
正如Alan Cooper一样,我对软件易用性的问题开始感到愤怒了。

ps:关于产生这个愤怒的原因:传统的软件代码必然分为两部分,
一部分是Java Code,一部分是外部配置文件.因为Deploy的时候,
Java class没法改,而某些参数又必须动态修改,所以只好人为的
划出一块到配置文件中.(包括透明前一段提到的Rule Engine,
也无非是这种情况的一个延伸,除了数据需要动态配置外,还有
一些行为需要动态配置).如果Java Code从一开始就能动态,那么就什么事也没有了.
可现在的情况,造成了这种人为的,不正常的划分.当开始思考到这个问题的
时候,我发现这个问题极不正常,完全是做Compiler的人的懒惰造成的,
正如Alan Cooper会对软件必须安装产生愤怒一样,我对软件必须编译
也产生了愤怒

c#可以动态编译source Code(不是用批处理,不在硬盘上保存中间结果),动态生成程序集,还可以动态发出C#的源代码,也可以动态加载程序集。不要愤怒了
0 请登录后投票
   发表时间:2004-08-24  
perhaps 写道
我想效率有两个方面:一个是开发效率,一个是执行效率。编译语言总会比解释性的语言的执行效率来得快,而动态的脚本语言却有着更高的开发效率。在这个效率的权衡之中,JAVA找到了一个很好的平衡点。


正好相反,我觉得强类型、编译型语言的开发效率比弱类型、解释型语言要高得多,因为很多问题是可以在保存的同时就由编译器帮你检查出来的,而不是非得到运行时去挨个跟踪变量的真实类型。Java的类型检查,说实话我认为不是太强,而是太弱了。
5 请登录后投票
   发表时间:2004-08-25  
是啊。jit如果加上source大概也可以吧。至少理论上我看不出有什么不行的。

不过不觉得可以完全代替配置文件之类的东西。不同的工具有不同的用途,配置文件就是用来配置的,用java语言表达有时候只怕繁琐。
0 请登录后投票
论坛首页 Java企业应用版

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