锁定老帖子 主题:为什么软件必须编译
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-06-10
albert_qhd 写道 动态语言就是这样的啊
再说了,用java也可以实现同样的目的,只要你自定义一个classLoader就可以了 问题是:意义有多少? 配置文件动态配置难道你要修改源代码吗?没几天你的软件不就乱套了?动态配置别的方法也可以实现啊 提高开发效率有可能是一个优点,你省去了每次调试编译的时间,但这个时间好像不太多吧? 很赞成. 就是这个:你自定义一个classLoader就可以了(可以不用class文件,这就看你的技术水平了),就是说这只是看你对于一些东西的封装. 其实任何一种语言都要编译的,就算是汇编,还不是要被化成机器码(二进制),动态语言不也一样要解释(这时候不也是编译吗,要不化成机器码,哪会执行). 我觉得这个话题不值得讨论,因为不觉得编译有什么坏处(因为每一种语言都要编译,只是否为显式/隐式,当然除非你自己直接写二进制),再说,如果你想即时编译的话,要不在java中嵌入动态语言,要不就自己实现(可以实现像Tomcat一样的东西,在你的Code被重新编译后就重新load). 不过在大部的地方这种东西没有多大用处,因为问题本身与这个没有关联. 只是与你解决问题的方式有关联. 再讲一个例子: 在Eclipse 中写一个main类,然后执行它,改一下,再执行它,你觉得它编译了吗(你要显式调用javac与java吗)?? 这算不算不用编译呢?? 如果我们再把Eclipse(IDE)看成是一种语言(其实IDE是一种容器)的话,那它算不算是一种不用编译的语言呢? 补:觉得这个话题只与自动化有关,与语言问题无关(特别像JAVA这种强大的语言). |
|
返回顶楼 | |
发表时间:2004-06-10
eclipse保存的时候就会编译的了
还可以设定为保存时不编译,然后手工按complie按钮 eclipse在只有jre的时候就能编译程序并不奇怪,ibm有能力做编译器啊 至于显式调用javac与否,有点像自欺欺人 总不会对着tomcat说,哇真厉害,jsp不用编译就能运行,修改了也立刻出效果 |
|
返回顶楼 | |
发表时间:2004-06-10
提高开发效率最主要的途径还是在语言这一级别上,关键就是使用最简洁的命令(集)表达最丰富的意思。从汇编到c这样的高级语言,开发效率提高了一个级别;从c到java等算是半动态的语言,开发效率又上了半个级别;再从java等到动态语言Python等,开发效率又上了一个级别。可以说开发效率是语言的发展主要动力之一。
|
|
返回顶楼 | |
发表时间:2004-06-14
gcj就是直接编译成本地代码。
本地有效率,但带来的问题就是安全性问题,可能有这方面的考虑。 |
|
返回顶楼 | |
发表时间: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个,它累不累呀它。 |
|
返回顶楼 | |
发表时间: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。现在估计这个 程序早不用了,之后的很多年,我都在想,这样的程序挺奇怪的! |
|
返回顶楼 | |
发表时间:2004-06-15
实现这个问题和cpu和操作系统有很大关系的,如果你想不编译系统的话,那么要么是要求cpu能直接看懂你的程序,要么是由操作系统来完成这个功能。
如果你学过汇编的话,你就会知道这有多么复杂了。 否则就不会出现 从->机器语言->汇编语言->高级语言 了 |
|
返回顶楼 | |
发表时间: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#的源代码,也可以动态加载程序集。不要愤怒了 |
|
返回顶楼 | |
发表时间:2004-08-24
perhaps 写道 我想效率有两个方面:一个是开发效率,一个是执行效率。编译语言总会比解释性的语言的执行效率来得快,而动态的脚本语言却有着更高的开发效率。在这个效率的权衡之中,JAVA找到了一个很好的平衡点。
正好相反,我觉得强类型、编译型语言的开发效率比弱类型、解释型语言要高得多,因为很多问题是可以在保存的同时就由编译器帮你检查出来的,而不是非得到运行时去挨个跟踪变量的真实类型。Java的类型检查,说实话我认为不是太强,而是太弱了。 |
|
返回顶楼 | |
发表时间:2004-08-25
是啊。jit如果加上source大概也可以吧。至少理论上我看不出有什么不行的。
不过不觉得可以完全代替配置文件之类的东西。不同的工具有不同的用途,配置文件就是用来配置的,用java语言表达有时候只怕繁琐。 |
|
返回顶楼 | |