Java 无用论2

宁静以致远_2020 2005-02-12 10:28:46
4. Java高级语言和C++、JScript比较
4.1. 效率,谎言
很多书上写Java是很快的语言。这时一定要看清楚是比谁快。语句传了几本书难免有些误差,比较对象经常有意无意丢失。一般认为Java比JScript快。的确快很多,不只十倍。我也承认Java比JScript快。但有人说Java和C++效率接近。这就是骗人了。他们也能做出试验证明,试验结果好像也能证明结论。他们的实验大概都是形如这样。

Java, C++测试代码:
for ( I = 0 ; I<100 ; I++ )
{
RemoteCall( I );  //外部调用,调用一次用1s。

结果:
Java 102s , C++ 100s。
结论:
Java达到了C++ 98.0%的效率。
这种测试违背了测量学中要把测试对象放到主要矛盾上这一基本原理。方法的不正确当然带来了测试结果的不正确。有本事比比
for ( I = 0 ; I<10000; I++)
{
y = x * z;  //由Java语言或C++语言实现执行体   
}
我的结果是170倍。也就是PIII变成了286。如果使用指令并行优化,C++和Java的速度差异可以达到千倍以上。想用一下8088吗?
4.2. 功能缺失导致代码膨胀
简单的说,Java比C++缺少编译预处理、缺少运算符重载、多继承和类模板。我认为取消这些概念很粗暴。和C++不同。对于大规模编程来说,Java的代码量不会比C少多少。甚至由于类型约束太强。有可能比C的代码量还大。Java常称多继承比较困难,所以要取消。而且使用实现接口的方法可以代替C++的多继承。但是,实现接口要自己写所有的接口实现代码。不嫌烦就慢慢写吧。
为什么要取消运算符重载?真是不可理解,既简单又好用。它居然说难,且容易造成混乱。总之,处理这几个大方向的问题,还有很多小问题。据说AWT不好用,感觉他们为了完成任务写程序。
4.3. 简单的骗局
自古便宜没好货。Java总是宣扬Java如何简单,主要宣扬的好处是垃圾自动收集和线程同步。其实不然,由于Java没有释放关键字。使得不能及时释放或定时释放不必的数据。要知道能够分配的不只是内存,还有数据库句柄、文件句柄、结果集等。这样不得不绕来绕去的完成这些任务。其实C++的析构函数是自动调用的,也不用自己手动掉用。遇到一些特殊情况,C++也能很好的解决。也许java的线程比较简单吧,不过C++中也可以继承线程类。由于本人没有涉及线程编程。这里不好乱说。
5. Java的兼容性
相对本地代码来说,Java程序的确移植性比较好。归其原因不外有二。一来Java虚机只一种(不像天下有很多种CPU),二来Java二进制 规范只有一种(不像这么多种操作系统)。但是,Java代码真的可以随 心所欲的移植吗?其实不然,上述两条中的任何一种不再满足,都会 影响ByteCode的移植性。现在,Java的主要版本已经有1.0 , 1.1.7 , 1.2(2.0)三个。更残酷的是1.1.7和1.2不兼容。一个很著名的例子。Websphere不能在Java1.2上运行。另外WebLogic不能在1.0上运行。java的二进制规范呢?jview( MS java)就自立门户。他的.class装入方法就和java for win32不同。另外它提出了其他的本地代码连接方法。显然这里也会造成不兼容。除了上述两条重要的原因,还有就是程序的运行环境。比如操作系统是否区分文件名的大小写。数据库是否中调用都能返回执行成功。EJB的代码是否有EJB 的运行服务器。等等。
6. 在精通Java之前否定Java
本人只是对Java略知一二。为什么就非要否定java呢。其实,从一般科学观点审视java。就会发现其中的问题。
6.1. Java代码不符合从简单到复杂的认识规律
代码比较:
Java Code Example:
import java.applet.*;
import java.awt.Gaphics;
public class HelloWorldApplet extends java.applet.Appple
{
public void init(){
resize( 200 , 150 );
}
public void paint( Graphics g){
g.drawString("Hello World" , 50 , 100);
}
}

C++ Code Example:
#include
class Hello :public Applet
{
public void init();
public void paint(Graphics g);
};

Hello::init()
{
resize( 200 , 150 );
}
......

我们看到,java开始就要求写函数的实现。而C++先要描述轮廓。再写函数实现。
6.2. Java对从一般到特殊的思维方法支持的不好
从一般到特殊,是重要的思维方法。对应到计算机学科就是继承。而今多继承的概念已经广为流传。比如我们说"小花猫",就是继承"小"、"花"、"猫"三个概念。如果在字典上看到小花猫这个词,它一定不再描述"小"、"花"、"猫"这三个概念,而是继承他们
。但是java只能继承其中的一个。对另外连个还要仔细的描述。写起来是不是很烦。
6.3. Java设计不尊重"任何事物都有产生、发展、消亡的过程"这一自然规律Java没有析构函数。这一点很讨厌。我只想重复一遍"对象不都在内存空间中"。
6.4. Java 不能表达少数类之间的紧密相关java要求每个类使用一个文件。这种实现可能和它的自动编译执行方式有关。注意这种限制不是实现上问题,而是规范中的语句。但是这种方法合适吗?请看下面C++的例子。将这两个类分开为两个文件是否真的好读?
struct menuitem{
String strX;
int   iIndex;
};

class menu{
menuitem item[100];
... ...
};
和这种情况类似,javadoc也不能对紧密相关的数据进行描述。至于类模板。java更是不支持。自己一个一个的慢慢写吧。
6.5. 批判Java的批判
Java要诞生,必须批判原有C/C++语言的缺陷。列举其中一二。"C/C++语言中的整形数据不限制长度。这样一来当程序从32位系统移植到16 位系统时会造成错误"。可是仔细想想。这种移植的概率究竟有多少?
"Java不像C/C++,它完全不支持指针"。按此理论,同样不支持指针的Fortran77和basic是不是也很强壮。"Java不允许隐式类型转换"。如果整形和浮点数据之间的转换都要写一下,是不是很烦。
"联合体、全局变量他们都不是面向对象的东西"。面向对象一直就没有什么定义。本着好用的东西就是好东西的原则,保留这些概念也不错。像M_PI这类的常量或者项目中的确全局相关的准常量,使用全局变量是不是很方便?至于联合体,是优化存储效率用的,像 Java这种不考虑效率的语言自然不会支持。
"java存在比C++多的运算符"。好像是多一些,他们是(字符串 +),
> >> , (boolean)& and | , instanceof。但是我们分析一下。由于java不支持运算符重载,只好单独实现(字符串 +)。由于java 不区分有符号和无符号数据,所以使用>>>来表达无符号右移、由于java中的boolean和整形之间没有联系,又不支持运算符重载,所以对boolean类型单独实现& and |。至于instanceof的确是Java 独创,不过这个运算符的用处还要考虑。我在引用某变量时居然能不知道它的类型?

6.6. 兼容以不兼容为代价
使用java 必须一切从头开始。java不能继承原有的工作。而且它也不能很好的和其他语言混合编程。这就和C++区别大了。首先C++继承了大部分C语言代码。其次,C++可以和Pascal , Fortran , Basic,T-SQL等其他语言方便混合。尤其方便的是ASM语言和 C++混合。发挥不同语言的长处。俗话说"朋友多,天地宽"吗。而 java只能孤军奋战了。
7. 结束语
写这篇文章用了一天半的时间。又在Java上花了这么多时间,真是心痛。但愿有些效果。



                           摘自---飓风Java学习网
...全文
300 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
headbutcher 2005-02-19
  • 打赏
  • 举报
回复
呵呵,看过了真的是抓狂。。。
以后看到小花猫都会流汗。
射天狼 2005-02-19
  • 打赏
  • 举报
回复
天天讨论这个语言好,那个语言坏,有什么意思~~~~~

语言之间没有什么可比性,如果高手的话,可以在短时间内从一种语言过度到另一种语言(关键要学习编程的思想)。

不要成天把流行的技术挂在嘴边,而要把过时的技术记在心里!
ywb1973 2005-02-13
  • 打赏
  • 举报
回复
虽然楼主脑子不好使,但勇气可嘉,帮你顶一下,以资鼓励。
dext 2005-02-13
  • 打赏
  • 举报
回复
再也不上 飓风Java学习网
误导!

6.2. Java对从一般到特殊的思维方法支持的不好
从一般到特殊,是重要的思维方法。对应到计算机学科就是继承。而今多继承的概念已经广为流传。比如我们说"小花猫",就是继承"小"、"花"、"猫"三个概念。如果在字典上看到小花猫这个词,它一定不再描述"小"、"花"、"猫"这三个概念,而是继承他们

这是继承吗?
用接口还差不多
wandou999 2005-02-13
  • 打赏
  • 举报
回复
@_@哎,争论来争论去也无意义啊
headbutcher 2005-02-13
  • 打赏
  • 举报
回复
任何一门语言,不可能没有缺点。
就楼主的说法,有很多也有失中肯。
C++和Java和有优缺点,这些大家在编程过程中会有所发现,因此就有取舍。
不是一个人说了算的。
yangbc 2005-02-13
  • 打赏
  • 举报
回复
楼上的,不要以为java在一个漫步者小玩具上应用就以为java多了不起。
航天器(暂且用你的称呼吧)指令程序用什么语言编写我不知道,但他极可能
用的不是可以在多种平台上随便移植的工具编写的,这样对系统性能的牺牲太大了
java生来就不是为了一个高效的应用而设计的,这一点无庸置疑了吧
其实用什么无所谓,能满足要求才是关键
ad8326 2005-02-13
  • 打赏
  • 举报
回复
c++ 好的话 怎么没用它写航天器的程序哪?
galois_godel 2005-02-13
  • 打赏
  • 举报
回复
go on

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧