32.html

来自「写给JSP初级程序员的书」· HTML 代码 · 共 341 行 · 第 1/2 页

HTML
341
字号
        。也不能明确指出出错代码的PC,并返回那里重新执行。 <br>
        3.1.4. 执行态 <br>
        Java VM没有用户态和系统态执行区分。当然也没有MMU(管理内存分 
        页、分段的内存管理单元).除非被Java高级语言限制,java VM汇编 
        代码也能完成一些恶意操作。 <br>
        3.1.5. 小结 <br>
        总而言之,Java VM很简单。SUN总是认为通过编译优化Java可以达到 
        C++速度。显然是谎言。如果要编译成本地代码,显然要丢失移植性 
        。如果不编译成本地代码,效率问题如何解决?有一种及时编译的设 
        计。对于很小的应用也许可行。对于规模的应用呢?要知道优化编译 
        很费CPU和内存。像IA64体系的优化方案,要编译很多遍才能优化完 
        成。要运行时刻编译是不是天方夜谭。 <br>
        4. Java高级语言和C++、JScript比较 <br>
        4.1. 效率,谎言 <br>
        很多书上写Java是很快的语言。这时一定要看清楚是比谁快。语句传 
        了几本书难免有些误差,比较对象经常有意无意丢失。一般认为Java 
        比JScript快。的确快很多,不只十倍。我也承认Java比JScript快。 
        但有人说Java和C++效率接近。这就是骗人了。他们也能做出试验证 
        明,试验结果好像也能证明结论。他们的实验大概都是形如这样。 </font></p>
      <p><font size="2" color="#000000">Java, C++测试代码: <br>
        for ( I = 0 ; I&lt;100 ; I++ ) <br>
        { <br>
        RemoteCall( I );  //外部调用,调用一次用1s。 <br>
        } <br>
        结果: <br>
        Java 102s , C++ 100s。 <br>
        结论: <br>
        Java达到了C++ 98.0%的效率。 <br>
        这种测试违背了测量学中要把测试对象放到主要矛盾上这一基本原 
        理。方法的不正确当然带来了测试结果的不正确。有本事比比 <br>
        for ( I = 0 ; I&lt;10000; I++) <br>
        { <br>
        y = x * z;  //由Java语言或C++语言实现执行体    <br>
        } <br>
        我的结果是170倍。也就是PIII变成了286。如果使用指令并行优化 
        ,C++和Java的速度差异可以达到千倍以上。想用一下8088吗? <br>
        4.2. 功能缺失导致代码膨胀 <br>
        简单的说,Java比C++缺少编译预处理、缺少运算符重载、多继承和
        类模板。我认为取消这些概念很粗暴。和C++不同。对于大规模编程
        来说,Java的代码量不会比C少多少。甚至由于类型约束太强。有可 
        能比C的代码量还大。 <br>
        Java常称多继承比较困难,所以要取消。而且使用实现接口的方法可 
        以代替C++的多继承。但是,实现接口要自己写所有的接口实现代码 
        。不嫌烦就慢慢写吧。 <br>
        为什么要取消运算符重载?真是不可理解,既简单又好用。它居然说 
        难,且容易造成混乱。 <br>
        总之,处理这几个大方向的问题,还有很多小问题。据说AWT不好用, 
        感觉他们为了完成任务写程序。 <br>
        4.3. 简单的骗局 <br>
        自古便宜没好货。Java总是宣扬Java如何简单,主要宣扬的好处是垃 
        圾自动收集和线程同步。其实不然,由于Java没有释放关键字。使得 
        不能及时释放或定时释放不必的数据。要知道能够分配的不只是内存 
        ,还有数据库句柄、文件句柄、结果集等。这样不得不绕来绕去的完 
        成这些任务。其实C++的析构函数是自动调用的,也不用自己手动掉 
        用。遇到一些特殊情况,C++也能很好的解决。 <br>
        也许java的线程比较简单吧,不过C++中也可以继承线程类。由于本 
        人没有涉及线程编程。这里不好乱说。 <br>
        5. Java的兼容性 <br>
        相对本地代码来说,Java程序的确移植性比较好。归其原因不外有二
        。一来Java虚机只一种(不像天下有很多种CPU),二来Java二进制 
        规范只有一种(不像这么多种操作系统)。但是,Java代码真的可以随 
        心所欲的移植吗?其实不然,上述两条中的任何一种不再满足,都会 
        影响ByteCode的移植性。 <br>
        现在,Java的主要版本已经有1.0 , 1.1.7 , 1.2(2.0)三个。更残酷 
        的是1.1.7和1.2不兼容。一个很著名的例子。Websphere不能在Java1 
        .2上运行。另外WebLogic不能在1.0上运行。 <br>
        java的二进制规范呢?jview( MS java)就自立门户。他的.class装 
        入方法就和java for win32不同。另外它提出了其他的本地代码连接 
        方法。显然这里也会造成不兼容。 <br>
        除了上述两条重要的原因,还有就是程序的运行环境。比如操作系统 
        是否区分文件名的大小写。数据库是否中调用都能返回执行成功。EJ 
        B的代码是否有EJB 的运行服务器。等等。 <br>
        6. 在精通Java之前否定Java <br>
        本人只是对Java略知一二。为什么就非要否定java呢。其实,从一般 
        科学观点审视java。就会发现其中的问题。 <br>
        6.1. Java代码不符合从简单到复杂的认识规律 <br>
        代码比较: <br>
        Java Code Example: <br>
        import java.applet.*; <br>
        import java.awt.Gaphics; <br>
        public class HelloWorldApplet extends java.applet.Appple <br>
        { <br>
        public void init(){ <br>
        resize( 200 , 150 ); <br>
        } <br>
        public void paint( Graphics g){ <br>
        g.drawString(&quot;Hello World&quot; , 50 , 100); <br>
        } <br>
        } </font></p>
      <p><font size="2" color="#000000">C++ Code Example: <br>
        #include <br>
        class Hello :public Applet <br>
        { <br>
        public void init(); <br>
        public void paint(Graphics g); <br>
        }; </font></p>
      <p><font size="2" color="#000000;">Hello::init() <br>
        { <br>
        resize( 200 , 150 ); <br>
        } <br>
        ...... </font></p>
      <p><font size="2" color="#000000">我们看到,java开始就要求写函数的实现。而C++先要描述轮廓。再 
        写函数实现。 <br>
        6.2. Java对从一般到特殊的思维方法支持的不好 <br>
        从一般到特殊,是重要的思维方法。对应到计算机学科就是继承。而 
        今多继承的概念已经广为流传。比如我们说&quot;小花猫&quot;,就是继承&quot; 
        小&quot;、&quot;花&quot;、&quot;猫&quot;三个概念。如果在字典上看到小花猫这个词, 
        它一定不再描述&quot;小&quot;、&quot;花&quot;、&quot;猫&quot;这三个概念,而是继承他们 
        。但是java只能继承其中的一个。对另外连个还要仔细的描述。写起 
        来是不是很烦。 <br>
        6.3. Java设计不尊重&quot;任何事物都有产生、发展、消亡的过程&quot;这 
        一自然规律 <br>
        Java没有析构函数。这一点很讨厌。我只想重复一遍&quot;对象不都在内
        存空间中&quot;。 <br>
        6.4. Java 不能表达少数类之间的紧密相关 <br>
        java要求每个类使用一个文件。这种实现可能和它的自动编译执行方 
        式有关。注意这种限制不是实现上问题,而是规范中的语句。但是这
        种方法合适吗?请看下面C++的例子。将这两个类分开为两个文件是 <br>
        否真的好读? <br>
        struct menuitem{ <br>
        String strX; <br>
        int   iIndex; <br>
        }; </font></p>
      <p><font size="2" color="#000000">class menu{ <br>
        menuitem item[100]; <br>
        ... ... <br>
        }; <br>
        和这种情况类似,javadoc也不能对紧密相关的数据进行描述。 
        至于类模板。java更是不支持。自己一个一个的慢慢写吧。 <br>
        6.5. 批判Java的批判 <br>
        Java要诞生,必须批判原有C/C++语言的缺陷。列举其中一二。 
        &quot;C/C++语言中的整形数据不限制长度。这样一来当程序从32位系统 
        移植到16 位系统时会造成错误&quot;。可是仔细想想。这种移植的概率 
        究竟有多少? <br>
        &quot;Java不像C/C++,它完全不支持指针&quot;。按此理论,同样不支持指 
        针的Fortran77和basic是不是也很强壮。 <br>
        &quot;Java不允许隐式类型转换&quot;。如果整形和浮点数据之间的转换都要 
        写一下,是不是很烦。 <br>
        &quot;联合体、全局变量他们都不是面向对象的东西&quot;。面向对象一直就 
        没有什么定义。本着好用的东西就是好东西的原则,保留这些概念也 
        不错。像M_PI这类的常量或者项目中的确全局相关的准常量,使用全
        局变量是不是很方便?至于联合体,是优化存储效率用的,像 Java 
        这种不考虑效率的语言自然不会支持。 <br>
        &quot;java存在比C++多的运算符&quot;。好像是多一些,他们是(字符串 +), 
        &gt; &gt;&gt; , (boolean)&amp; and | , instanceof。但是我们分析一下。由 
        于java不支持运算符重载,只好单独实现(字符串 +)。由于java 不 
        区分有符号和无符号数据,所以使用&gt;&gt;&gt;来表达无符号右移、由于jav 
        a中的boolean和整形之间没有联系,又不支持运算符重载,所以对bo 
        olean类型单独实现&amp; and |。至于instanceof的确是Java 独创,不 
        过这个运算符的用处还要考虑。我在引用某变量时居然能不知道它的
        类型? </font></p>
      <p><font size="2" color="#000000">6.6. 兼容以不兼容为代价
        使用java 必须一切从头开始。java不能继承原有的工作。而且它也 
        不能很好的和其他语言混合编程。这就和C++区别大了。首先C++继承
        了大部分C语言代码。其次,C++可以和Pascal , Fortran , Basic,
        T-SQL等其他语言方便混合。尤其方便的是ASM语言和 C++混合。发挥 
        不同语言的长处。俗话说&quot;朋友多,天地宽&quot;吗。而 java只能孤军 
        奋战了。 <br>
        7. 结束语 <br>
        写这篇文章用了一天半的时间。又在Java上花了这么多时间,真是心 
        痛。但愿有些效果。 </font></p>

        </td>
      </tr>
    </td>
  </tr>
</div>
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?