当前位置: 技术问答>java相关
JAVA无用论(转贴)
来源: 互联网 发布时间:2014-12-23
本文导语: JAVA无用论 2000-10-24 1. 写这篇文章的目的 学了一些关于Java的东西,个人认为它很不好用。为了减少上当人数 特写此文。 尽管 java 宣称它是100%面向对象,而C++不是。但是宣称100%面向 对象本身就不是什么面...
JAVA无用论 2000-10-24
1. 写这篇文章的目的
学了一些关于Java的东西,个人认为它很不好用。为了减少上当人数
特写此文。
尽管 java 宣称它是100%面向对象,而C++不是。但是宣称100%面向
对象本身就不是什么面向对象的思想。面向对象的本质目的是提高生
产率。讨论一种语言是否100%面向对象就好像讨论我们的社会性资性
社一样滑稽。其实学习面向对象不一定非要使用java不可。我反而认
为120%面向对象的C++是不错的选择。
Java号称跨平台,其实这是只一个梦想,也不妨用骗局这个词来形容
。软件的移植性仅仅和虚机相关吗?照此理论是不是可以说符合IA32
体系的软件在任何IA32体系上都能正常运行。那我怎么没看见SCO:
:lf 在 NT上运行?显然,除了虚机,软件二进制规范(执行文件格
式、连接方法)、运行时间库和系统调用也是软件移植问题因素。而
java规范中显然不包括完整的运行时间库和系统调用,甚至二进制规
范也有不兼容的地方(比如本原接口和固有接口)。软件总不能脱离
它的运行环境,不兼容就从这里开始。
要提高软件生产效率。应当认认真真的研究系统结构、二进制规范、
系统调用结构才是解决问题的方法。靠概念游戏这种投机取巧的方法
是行不通的。
我说java不好,甚至不必对其侧目,你信吗?我估计信的人不多。我
只是想说“上当之后别怪我没说”。
另外如果您在Java中发现了甜头也不妨告诉我。互相学习吗:)。
2. Java究竟是什么?
Java是一种虚拟硬件系统结构,是一种软件二进制规范,是一种编程
语言。当我们看到Java一词时,它可能表达上述三个含义钟的任何一
个。尽管这三个东西可以独立存在,不过实际上他们总是在一起出现
。所以也很少有人分的那么明确。使用Fortran语言编写Java虚机上
的代码理论上是可行的。但是有谁乐意做这件事呢?
作为虚拟硬件体系结构,
Java虚机和ALPHA、PowerPC、SPARC、IA32、51、960是同一概念上的
东西。也许您会奇怪?他们怎是同样的东西呢?IA32不就是PIII、PI
V那一大块吗?其实不然、我们知道386、P5、P6、P7的内部结构非常
不同。属不同的微体系。但是他们实现了相同的IA32指令集合。IA32
也不一定非要通过硬件实现,通过软件也可以。这种软件CPU产品广
泛出现在操作系统和CPU密集软件的开发、调试工具上。主要用于在C
PU出现之前调试软件。Java指令集同样也可以通过硬件实现。只是在
半导体工业激烈竞争的时代,没有大公司(含SUN)愿意把这么做。
SUN常常说M$很害怕java。他们之间的确存在很强的竞争关系。倒不
是Java高级语言的问题,我认为是Java二进制规范和 Windows操作系
统存在竞争。不妨考察Java中的(.class文件格式、装入方法、执行
过程、JDBC接口、J3D接口)和Windows中的(PE文件格式、DLL文件格
式、装入、连接方法、ODBC、Direct3D)。就知道竞争多么强烈。和N
T/IA不同。Java.exe执行程序包含虚机规范和二进制规范。在NT/IA
中是分离的产品。
人们总喜欢把Java高级语言和C++类比,他们之间的确存在很过相似
的地方。不过我认为C++和Java不存在什么竞争。它们使用在不同的
场合。他们的区别(内存管理、对象类型、线程规范)决定他们的用
途。用形似而神不似来形容C++和Java吧。仅从高级语言方面来看。J
ava真正竞争来自ECMAScript 。也就是JScript和VBScript。
3. Java虚机和IA32比较
Java VM和IA32最大的区别是Java VM的主要实现不考虑效率问题。由
此派生出寄存器少,指令结构简单(同样功能生成的程序代码长),
寻址空间小,寻址方法少、数据类型少等。除了上述问题,Java VM
没有涉及指令(显式或隐式)并行问题。
3.1. 基本特性差别
3.1.1. 数据类型比较
Java VM
IA32
整数类型
byte
short(16bit) char(UnionCode)
int
long (64bit)
{不存在无符号算术运算指令,另外注意这里没有boolean类型}
byte
Word(16bit)
DoubleWord(32bit)
QuotaWord(64bit)
DoubleQuotaWord(2*64bit)
BCD/PackedBCD
BitField
{存在有符号和无符号两种运算指令}
浮点类型
float(32bit)
double(64bit)
float(32bit)
double(64bit)
long double(80bit)
Packed double(2*64bit)
地址
returnAddress*
8bit , 16bit , 32bit , 48bit都有
没有显示的看到returnAddress
类型的宽度,不过。通过指令goto(0xa7)和goto_w(0xc8)来看。retu
rnAddress是可以是16位或32位的。
关于double和Long的原子问题:在目前的java规范中,double和long
作为两个独立的32 位数据独立存取。这样可能产生同步问题。历史
上Intel的CMPXCHG8B(Pentum pro以上CPU提供)指令就存在过类似
问题,一度被指责是CPU设计问题。好在CMPXCHG8B很少使用,没有造
成什么事故。
3.1.2. 指令集
指令类型
JavaVM
IA32
Load/Store
1) 数据和运算栈之间单个移动
2) 常数移入运算栈
1) MOVE
2) CMOVEXX
3) 交换,琐操作
4) PUSH/POP
5) PUSHA/POPA
6) IN/OUT
元算指令
add , sub , mul , div , neg , rem , shl , or , and , xor
比Java多多了,主要多在显式并行上
类型转换
基本类型之间可以互相转换
有(由于类型很多,转换指令也有很多)
方法调用
4条指令
一大堆,主要多在权限切换(调用门)、长短跳传不同上。
3.1.3. 异常
虽然JavaVM有异常的支持,不过很简单。它不区分中断、陷阱和故障
。也不能明确指出出错代码的PC,并返回那里重新执行。
3.1.4. 执行态
Java VM没有用户态和系统态执行区分。当然也没有MMU(管理内存分
页、分段的内存管理单元).除非被Java高级语言限制,java VM汇编
代码也能完成一些恶意操作。
3.1.5. 小结
总而言之,Java VM很简单。SUN总是认为通过编译优化Java可以达到
C++速度。显然是谎言。如果要编译成本地代码,显然要丢失移植性
。如果不编译成本地代码,效率问题如何解决?有一种及时编译的设
计。对于很小的应用也许可行。对于规模的应用呢?要知道优化编译
很费CPU和内存。像IA64体系的优化方案,要编译很多遍才能优化完
成。要运行时刻编译是不是天方夜谭。
4. Java高级语言和C++、JScript比较
4.1. 效率,谎言
很多书上写Java是很快的语言。这时一定要看清楚是比谁快。语句传
了几本书难免有些误差,比较对象经常有意无意丢失。一般认为Java
比JScript快。的确快很多,不只十倍。我也承认Java比JScript快。
但有人说Java和C++效率接近。这就是骗人了。他们也能做出试验证
明,试验结果好像也能证明结论。他们的实验大概都是形如这样。
Java, C++测试代码:
for ( I = 0 ; I> , (boolean)& and | , instanceof。但是我们分析一下。由
于java不支持运算符重载,只好单独实现(字符串 +)。由于java 不
区分有符号和无符号数据,所以使用>>>来表达无符号右移、由于jav
a中的boolean和整形之间没有联系,又不支持运算符重载,所以对bo
olean类型单独实现& and |。至于instanceof的确是Java 独创,不
过这个运算符的用处还要考虑。我在引用某变量时居然能不知道它的
类型?
6.6. 兼容以不兼容为代价
使用java 必须一切从头开始。java不能继承原有的工作。而且它也
不能很好的和其他语言混合编程。这就和C++区别大了。首先C++继承
了大部分C语言代码。其次,C++可以和Pascal , Fortran , Basic,
T-SQL等其他语言方便混合。尤其方便的是ASM语言和 C++混合。发挥
不同语言的长处。俗话说“朋友多,天地宽”吗。而 java只能孤军
奋战了。
7. 结束语
写这篇文章用了一天半的时间。又在Java上花了这么多时间,真是心
痛。但愿有些效果。
1. 写这篇文章的目的
学了一些关于Java的东西,个人认为它很不好用。为了减少上当人数
特写此文。
尽管 java 宣称它是100%面向对象,而C++不是。但是宣称100%面向
对象本身就不是什么面向对象的思想。面向对象的本质目的是提高生
产率。讨论一种语言是否100%面向对象就好像讨论我们的社会性资性
社一样滑稽。其实学习面向对象不一定非要使用java不可。我反而认
为120%面向对象的C++是不错的选择。
Java号称跨平台,其实这是只一个梦想,也不妨用骗局这个词来形容
。软件的移植性仅仅和虚机相关吗?照此理论是不是可以说符合IA32
体系的软件在任何IA32体系上都能正常运行。那我怎么没看见SCO:
:lf 在 NT上运行?显然,除了虚机,软件二进制规范(执行文件格
式、连接方法)、运行时间库和系统调用也是软件移植问题因素。而
java规范中显然不包括完整的运行时间库和系统调用,甚至二进制规
范也有不兼容的地方(比如本原接口和固有接口)。软件总不能脱离
它的运行环境,不兼容就从这里开始。
要提高软件生产效率。应当认认真真的研究系统结构、二进制规范、
系统调用结构才是解决问题的方法。靠概念游戏这种投机取巧的方法
是行不通的。
我说java不好,甚至不必对其侧目,你信吗?我估计信的人不多。我
只是想说“上当之后别怪我没说”。
另外如果您在Java中发现了甜头也不妨告诉我。互相学习吗:)。
2. Java究竟是什么?
Java是一种虚拟硬件系统结构,是一种软件二进制规范,是一种编程
语言。当我们看到Java一词时,它可能表达上述三个含义钟的任何一
个。尽管这三个东西可以独立存在,不过实际上他们总是在一起出现
。所以也很少有人分的那么明确。使用Fortran语言编写Java虚机上
的代码理论上是可行的。但是有谁乐意做这件事呢?
作为虚拟硬件体系结构,
Java虚机和ALPHA、PowerPC、SPARC、IA32、51、960是同一概念上的
东西。也许您会奇怪?他们怎是同样的东西呢?IA32不就是PIII、PI
V那一大块吗?其实不然、我们知道386、P5、P6、P7的内部结构非常
不同。属不同的微体系。但是他们实现了相同的IA32指令集合。IA32
也不一定非要通过硬件实现,通过软件也可以。这种软件CPU产品广
泛出现在操作系统和CPU密集软件的开发、调试工具上。主要用于在C
PU出现之前调试软件。Java指令集同样也可以通过硬件实现。只是在
半导体工业激烈竞争的时代,没有大公司(含SUN)愿意把这么做。
SUN常常说M$很害怕java。他们之间的确存在很强的竞争关系。倒不
是Java高级语言的问题,我认为是Java二进制规范和 Windows操作系
统存在竞争。不妨考察Java中的(.class文件格式、装入方法、执行
过程、JDBC接口、J3D接口)和Windows中的(PE文件格式、DLL文件格
式、装入、连接方法、ODBC、Direct3D)。就知道竞争多么强烈。和N
T/IA不同。Java.exe执行程序包含虚机规范和二进制规范。在NT/IA
中是分离的产品。
人们总喜欢把Java高级语言和C++类比,他们之间的确存在很过相似
的地方。不过我认为C++和Java不存在什么竞争。它们使用在不同的
场合。他们的区别(内存管理、对象类型、线程规范)决定他们的用
途。用形似而神不似来形容C++和Java吧。仅从高级语言方面来看。J
ava真正竞争来自ECMAScript 。也就是JScript和VBScript。
3. Java虚机和IA32比较
Java VM和IA32最大的区别是Java VM的主要实现不考虑效率问题。由
此派生出寄存器少,指令结构简单(同样功能生成的程序代码长),
寻址空间小,寻址方法少、数据类型少等。除了上述问题,Java VM
没有涉及指令(显式或隐式)并行问题。
3.1. 基本特性差别
3.1.1. 数据类型比较
Java VM
IA32
整数类型
byte
short(16bit) char(UnionCode)
int
long (64bit)
{不存在无符号算术运算指令,另外注意这里没有boolean类型}
byte
Word(16bit)
DoubleWord(32bit)
QuotaWord(64bit)
DoubleQuotaWord(2*64bit)
BCD/PackedBCD
BitField
{存在有符号和无符号两种运算指令}
浮点类型
float(32bit)
double(64bit)
float(32bit)
double(64bit)
long double(80bit)
Packed double(2*64bit)
地址
returnAddress*
8bit , 16bit , 32bit , 48bit都有
没有显示的看到returnAddress
类型的宽度,不过。通过指令goto(0xa7)和goto_w(0xc8)来看。retu
rnAddress是可以是16位或32位的。
关于double和Long的原子问题:在目前的java规范中,double和long
作为两个独立的32 位数据独立存取。这样可能产生同步问题。历史
上Intel的CMPXCHG8B(Pentum pro以上CPU提供)指令就存在过类似
问题,一度被指责是CPU设计问题。好在CMPXCHG8B很少使用,没有造
成什么事故。
3.1.2. 指令集
指令类型
JavaVM
IA32
Load/Store
1) 数据和运算栈之间单个移动
2) 常数移入运算栈
1) MOVE
2) CMOVEXX
3) 交换,琐操作
4) PUSH/POP
5) PUSHA/POPA
6) IN/OUT
元算指令
add , sub , mul , div , neg , rem , shl , or , and , xor
比Java多多了,主要多在显式并行上
类型转换
基本类型之间可以互相转换
有(由于类型很多,转换指令也有很多)
方法调用
4条指令
一大堆,主要多在权限切换(调用门)、长短跳传不同上。
3.1.3. 异常
虽然JavaVM有异常的支持,不过很简单。它不区分中断、陷阱和故障
。也不能明确指出出错代码的PC,并返回那里重新执行。
3.1.4. 执行态
Java VM没有用户态和系统态执行区分。当然也没有MMU(管理内存分
页、分段的内存管理单元).除非被Java高级语言限制,java VM汇编
代码也能完成一些恶意操作。
3.1.5. 小结
总而言之,Java VM很简单。SUN总是认为通过编译优化Java可以达到
C++速度。显然是谎言。如果要编译成本地代码,显然要丢失移植性
。如果不编译成本地代码,效率问题如何解决?有一种及时编译的设
计。对于很小的应用也许可行。对于规模的应用呢?要知道优化编译
很费CPU和内存。像IA64体系的优化方案,要编译很多遍才能优化完
成。要运行时刻编译是不是天方夜谭。
4. Java高级语言和C++、JScript比较
4.1. 效率,谎言
很多书上写Java是很快的语言。这时一定要看清楚是比谁快。语句传
了几本书难免有些误差,比较对象经常有意无意丢失。一般认为Java
比JScript快。的确快很多,不只十倍。我也承认Java比JScript快。
但有人说Java和C++效率接近。这就是骗人了。他们也能做出试验证
明,试验结果好像也能证明结论。他们的实验大概都是形如这样。
Java, C++测试代码:
for ( I = 0 ; I> , (boolean)& and | , instanceof。但是我们分析一下。由
于java不支持运算符重载,只好单独实现(字符串 +)。由于java 不
区分有符号和无符号数据,所以使用>>>来表达无符号右移、由于jav
a中的boolean和整形之间没有联系,又不支持运算符重载,所以对bo
olean类型单独实现& and |。至于instanceof的确是Java 独创,不
过这个运算符的用处还要考虑。我在引用某变量时居然能不知道它的
类型?
6.6. 兼容以不兼容为代价
使用java 必须一切从头开始。java不能继承原有的工作。而且它也
不能很好的和其他语言混合编程。这就和C++区别大了。首先C++继承
了大部分C语言代码。其次,C++可以和Pascal , Fortran , Basic,
T-SQL等其他语言方便混合。尤其方便的是ASM语言和 C++混合。发挥
不同语言的长处。俗话说“朋友多,天地宽”吗。而 java只能孤军
奋战了。
7. 结束语
写这篇文章用了一天半的时间。又在Java上花了这么多时间,真是心
痛。但愿有些效果。
|
1.我们老祖宗说过,合久必分,分久必合。软件工程本身是希望从工程学的角度来控制工程的进度,混杂各种技术不是什么好现象,C++恐怕种类也不少,目前还有谁只写ansi C++的?看到漫天飞的makefile,各个版本的lib,不知名的头文件(),遍地的define。。。,恐怕晕的不止我一个,多有耐心的人都要消耗时间来协调各个部分的程序(呜呜,我是低手,别臭我),写了许久,还是某个平台的(确实有人可以写出移植方便的程序,但我辈低手尚我此种眼界和经验)。提到IA32真考倒了,java和jvm最好还是分开讲,信任一群公司的联盟可以提供更好的jvm,好象不只是我这么想。当然,java很多东西做不了,可以尝试通过JNI、CORBA、Socket等技术来调用万能的C++啊。十八班武器,那个没有自己长短处?不过现在做底层应用的,还是以C为主。不信,看看那些做通讯,电子的,哪个是在用C,而且将来也不一定会转到C++。
2.java是什么?这个问题问的好,三年前,两年前,一年前,半年前,大家的理解都不同,本人第一次对这个问题有感觉有触发是在回答一份ibm调查问卷的时候。
java.sun.com/products下面那些东西,有谁看完了?我是看了几个,但起码知道跑java的设备目前已经存在了,虽然是手持设备或通讯类产品,而且不是只能跑java,但起码那也叫硬件。将硬件跟软件支持分开,这才是适应不断升级硬件、软件的最优结合方式,拘泥于技术的细节,忽略方向,这样子很被动的。
3.被他的例子击中要害。没话讲,一是不熟悉,二是我也基本同意他的看法,除了3.1.3,小小细节就不必拖出来讲了。
4.
4.1是个老话题了。的确,java效率通常要低于c++,但是它是挂在jvm上运行的,比通常的C++运行多了个壳,而且用循环来比较的话,恐怕这种举例更不公平,显然C++对于y = x * z优化跟java的处理有不同。如果一味强调编译器优化的某项特性,那java这边也可以做优化啊。运行态编译就那么不可行?别忘了,服务器上的程序没有哪个是运行一次就被重新执行的,而执行过一次,运行态编译就会体现它的优点,一个C++程序运行一次3秒,一个java程序运行一次6秒,这就说java慢?好,那么那个c++程序运行10000次就是30000秒,那个java还是这么简单乘法吗?请考虑统计数据采样的重要性。统计本身就是们学问,加减乘除都要有凭据的。对于两者效率差多少,个人意见:在不同的应用场合下来测试,这样可能客观点。
4.2预编译java谁说没有?SQLJ白出来那么久了。运算符重载在java就有一个"+",如果C++中有反射的话,相信灵活性会有更大程度的提高。模板类都是C++的精华,我也非常喜欢,那是C++中的奇迹,ATL和STL活在一群热爱C++的程序员里面,但是其它语言又有谁支持了?类型约束,呵呵,如果程序员连类型都写错,那么在C++不需要改吗?多继承是个老话题,不过从com/dcom、corba这些技术,恐怕接口比多继承更受欢迎吧。毕竟超过二层的多继承在C++应用实例也不常见,主要原因是没必要,而且程序难调。AWT的确不是很受欢迎,4年前,人们都以为AWT就是java全部,结果多少人放弃java,但现在情况就完全不同了。java可以将程序压缩放在jar文件中,以减少文件尺寸和方便管理,不过pe的也有压缩加壳技术,但是终究不是系统级支持。
4.3扯多点东西,那位老大一定对信号量等同步技术非常重视,在java中实现非常简单明朗,C++也麻烦,那么关于资源如何释放对于程序员就只是个编程的习惯,相信在java中忘记关掉stream的人在C++也可能犯同样的错,而且结果也会相同。允许C++程序员在析构函数多写几行关闭,为什么一定认为java程序员会忘了呐?如果java是骗局,那么这是一场跨国多巨头联合超级大骗局。
5.java发展时间不长,比c++是年青太多了,年青到基本框架到处都在搭建,jvm的版本也是很多,我现在使用的是1.2.2_005,对个人影响也许不大,但这个对公司的影响确实比较大,没有哪个公司愿意为jdk1.1.x和jdk1.2.x写两套软件,但这个就好象c++的库版本管理混乱一样,没有哪种技术一开始不需要伤筋动骨的改造,perl的下一版都在重写呐。
6.
6.1好象软件工程要求你在写代码前先干点什么,这个应该不算java的问题。是采用如何的方式学习和应用语言开发的问题。在工程里面说明一遍,然后再在header里面写一清遍,恐怕算是浪费体力吧。javadoc强烈推荐大家使用,可以根据代码生成象jdk那种结构清晰的文档,写完程序,这种文档也可以作为补充。
6.2呵呵,又是多继承。实例举多了,不利于帮助了解事物的本质。
6.3析构,呵呵,析构中再调用其它的析构,好处可以自己定制析构,但是对于调试程序恐怕也会带来多一些麻烦,这个世界上的程序员还是要靠debug来吃饭的。析构到底有那么神奇,令仁兄接二连三提起?
6.4许多人都讨论过一个大对象好,还是一堆小对象好,那么本人的看法是如果一个大对象完成所有工作,那么就将问题局部化,调试范围集中在一个文件,但不利于多人开发,而且功能升级也不方便,重用的可能更小;如果多个小对象,可以分工明确,功能升级有可能减少代码的修改量,最大可能重用组件,对于项目管理的确是个挑战,看似简单的小对象之间的架构才是component比oo多出来的精髓,但使用不当会令工作事倍功半。这个问题对c++和java都成立,但是由于语言的风格不同,所以受重视的程度有不同,许多人在学习java的过程里面都会思索、比较这两种模式。
6.5移植的东西就很难讲。ibm和oracle都要在palm上搞数据库,ibm是改写的,oracle是重写的,那么哪个服务器软件不是一大堆for各个版本的不同操作系统。这些就是摆在眼前d的实际问题。不知不觉,64位又要大行其道了。
Fortran77和basic现在也有人用,甚至cobol用的人都不少,为什么?商业社会不允许随便放弃过去,推C++的时候面临的是同样问题,怎么就这么快忘了呐?
java的基本类型比较少,这个是事实,之间转换也不是非常灵活,但是c++中,类似整除和取余更是通过函数实现的(顺便提下,基本上c++中每一个内置函数都有功能相同名字、类型不同的,这些恐怕也不是什么好现象吧)。细节问题,不至于影响对java发展方向的评价。
全局变量这种东西可以放在一个类中包装啊,c++也是希望减少使用全局变量、宏编译,联合体出现的年代,String都不是数据类型,操纵起来也要处处小心。现在用联合体的场合一般是厂家提供的api需要,自己写程序用联合体的不多。用联合的语言就一定要支持指针,这是java所不愿走的路。
instanceof确实非常有用,因为java可以通过非常多的形式拿到类的实例,如果不知道是什么类或者实现了什么接口(别咬文嚼字,接口本身就是一种特殊的类),可以让java的灵活程度大大加强。比起dll的动态加载,java的动态加载就是天生的,不需要那么多乱七八糟的规矩,而且可以通过jar来集中管理同属一类的java class。
反射是java的一大特色。
6.6呵呵,java可以骑着c/c++啊,jni是吃白饭的?通过jdbc可以调用数据库中的东西,jndi可以访问目录,jms可以访问消息队列,jts可以访问交易系统,javacard可以在sim卡上跑,corba可以调用任何支持corba的东西,socket可以调用任何支持ip的语言,rmi虽然只能用java,但是可以非常透明的得到实例,这是其它语言不具备的优势,适合网络分布计算。呵呵,这些只是非常普及的java技术之一小部分,它虽然不是什么崇高的理论,但是起码它能让许多计算机在一起工作,为应用服务,这才是我们最关心的问题。
7.偏系统底层开发,我宁可用C,中间层开发倒是java,界面用些简单工具就算了。至于c++,恐怕只是当初在接触面向对象时看到的一个诱人的梦了。
看了这篇贴子,有些感发,断断续续写了4个小时,才将思绪理的清楚一点,望各路高手指正。
to w102272:
希望能帮我贴回你转贴的地方。 thank u.
:)
oicq: 1766598
mail: cxgtommy@sina.com
2.java是什么?这个问题问的好,三年前,两年前,一年前,半年前,大家的理解都不同,本人第一次对这个问题有感觉有触发是在回答一份ibm调查问卷的时候。
java.sun.com/products下面那些东西,有谁看完了?我是看了几个,但起码知道跑java的设备目前已经存在了,虽然是手持设备或通讯类产品,而且不是只能跑java,但起码那也叫硬件。将硬件跟软件支持分开,这才是适应不断升级硬件、软件的最优结合方式,拘泥于技术的细节,忽略方向,这样子很被动的。
3.被他的例子击中要害。没话讲,一是不熟悉,二是我也基本同意他的看法,除了3.1.3,小小细节就不必拖出来讲了。
4.
4.1是个老话题了。的确,java效率通常要低于c++,但是它是挂在jvm上运行的,比通常的C++运行多了个壳,而且用循环来比较的话,恐怕这种举例更不公平,显然C++对于y = x * z优化跟java的处理有不同。如果一味强调编译器优化的某项特性,那java这边也可以做优化啊。运行态编译就那么不可行?别忘了,服务器上的程序没有哪个是运行一次就被重新执行的,而执行过一次,运行态编译就会体现它的优点,一个C++程序运行一次3秒,一个java程序运行一次6秒,这就说java慢?好,那么那个c++程序运行10000次就是30000秒,那个java还是这么简单乘法吗?请考虑统计数据采样的重要性。统计本身就是们学问,加减乘除都要有凭据的。对于两者效率差多少,个人意见:在不同的应用场合下来测试,这样可能客观点。
4.2预编译java谁说没有?SQLJ白出来那么久了。运算符重载在java就有一个"+",如果C++中有反射的话,相信灵活性会有更大程度的提高。模板类都是C++的精华,我也非常喜欢,那是C++中的奇迹,ATL和STL活在一群热爱C++的程序员里面,但是其它语言又有谁支持了?类型约束,呵呵,如果程序员连类型都写错,那么在C++不需要改吗?多继承是个老话题,不过从com/dcom、corba这些技术,恐怕接口比多继承更受欢迎吧。毕竟超过二层的多继承在C++应用实例也不常见,主要原因是没必要,而且程序难调。AWT的确不是很受欢迎,4年前,人们都以为AWT就是java全部,结果多少人放弃java,但现在情况就完全不同了。java可以将程序压缩放在jar文件中,以减少文件尺寸和方便管理,不过pe的也有压缩加壳技术,但是终究不是系统级支持。
4.3扯多点东西,那位老大一定对信号量等同步技术非常重视,在java中实现非常简单明朗,C++也麻烦,那么关于资源如何释放对于程序员就只是个编程的习惯,相信在java中忘记关掉stream的人在C++也可能犯同样的错,而且结果也会相同。允许C++程序员在析构函数多写几行关闭,为什么一定认为java程序员会忘了呐?如果java是骗局,那么这是一场跨国多巨头联合超级大骗局。
5.java发展时间不长,比c++是年青太多了,年青到基本框架到处都在搭建,jvm的版本也是很多,我现在使用的是1.2.2_005,对个人影响也许不大,但这个对公司的影响确实比较大,没有哪个公司愿意为jdk1.1.x和jdk1.2.x写两套软件,但这个就好象c++的库版本管理混乱一样,没有哪种技术一开始不需要伤筋动骨的改造,perl的下一版都在重写呐。
6.
6.1好象软件工程要求你在写代码前先干点什么,这个应该不算java的问题。是采用如何的方式学习和应用语言开发的问题。在工程里面说明一遍,然后再在header里面写一清遍,恐怕算是浪费体力吧。javadoc强烈推荐大家使用,可以根据代码生成象jdk那种结构清晰的文档,写完程序,这种文档也可以作为补充。
6.2呵呵,又是多继承。实例举多了,不利于帮助了解事物的本质。
6.3析构,呵呵,析构中再调用其它的析构,好处可以自己定制析构,但是对于调试程序恐怕也会带来多一些麻烦,这个世界上的程序员还是要靠debug来吃饭的。析构到底有那么神奇,令仁兄接二连三提起?
6.4许多人都讨论过一个大对象好,还是一堆小对象好,那么本人的看法是如果一个大对象完成所有工作,那么就将问题局部化,调试范围集中在一个文件,但不利于多人开发,而且功能升级也不方便,重用的可能更小;如果多个小对象,可以分工明确,功能升级有可能减少代码的修改量,最大可能重用组件,对于项目管理的确是个挑战,看似简单的小对象之间的架构才是component比oo多出来的精髓,但使用不当会令工作事倍功半。这个问题对c++和java都成立,但是由于语言的风格不同,所以受重视的程度有不同,许多人在学习java的过程里面都会思索、比较这两种模式。
6.5移植的东西就很难讲。ibm和oracle都要在palm上搞数据库,ibm是改写的,oracle是重写的,那么哪个服务器软件不是一大堆for各个版本的不同操作系统。这些就是摆在眼前d的实际问题。不知不觉,64位又要大行其道了。
Fortran77和basic现在也有人用,甚至cobol用的人都不少,为什么?商业社会不允许随便放弃过去,推C++的时候面临的是同样问题,怎么就这么快忘了呐?
java的基本类型比较少,这个是事实,之间转换也不是非常灵活,但是c++中,类似整除和取余更是通过函数实现的(顺便提下,基本上c++中每一个内置函数都有功能相同名字、类型不同的,这些恐怕也不是什么好现象吧)。细节问题,不至于影响对java发展方向的评价。
全局变量这种东西可以放在一个类中包装啊,c++也是希望减少使用全局变量、宏编译,联合体出现的年代,String都不是数据类型,操纵起来也要处处小心。现在用联合体的场合一般是厂家提供的api需要,自己写程序用联合体的不多。用联合的语言就一定要支持指针,这是java所不愿走的路。
instanceof确实非常有用,因为java可以通过非常多的形式拿到类的实例,如果不知道是什么类或者实现了什么接口(别咬文嚼字,接口本身就是一种特殊的类),可以让java的灵活程度大大加强。比起dll的动态加载,java的动态加载就是天生的,不需要那么多乱七八糟的规矩,而且可以通过jar来集中管理同属一类的java class。
反射是java的一大特色。
6.6呵呵,java可以骑着c/c++啊,jni是吃白饭的?通过jdbc可以调用数据库中的东西,jndi可以访问目录,jms可以访问消息队列,jts可以访问交易系统,javacard可以在sim卡上跑,corba可以调用任何支持corba的东西,socket可以调用任何支持ip的语言,rmi虽然只能用java,但是可以非常透明的得到实例,这是其它语言不具备的优势,适合网络分布计算。呵呵,这些只是非常普及的java技术之一小部分,它虽然不是什么崇高的理论,但是起码它能让许多计算机在一起工作,为应用服务,这才是我们最关心的问题。
7.偏系统底层开发,我宁可用C,中间层开发倒是java,界面用些简单工具就算了。至于c++,恐怕只是当初在接触面向对象时看到的一个诱人的梦了。
看了这篇贴子,有些感发,断断续续写了4个小时,才将思绪理的清楚一点,望各路高手指正。
to w102272:
希望能帮我贴回你转贴的地方。 thank u.
:)
oicq: 1766598
mail: cxgtommy@sina.com
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。