重拾Java(三)

来源:互联网 发布:台式机品牌 知乎 编辑:程序博客网 时间:2024/05/17 09:40

06-9-16:
Java虚拟机:
就是讲Java既是编译型的也是解释型的语言.Java的运行时解释器用来执行编译过了的Java字节码.这个运行时系统象执行了所有的正常的活动的真实的CPU一样,但是它时安全的,虚拟的.它执行一个基于指令集,象操作系统一样管理内存.它创建和操作元数据类型,加载和激活代码块的引用.最重要的是,它都是严格的依照开放的规范来做所有的这些事情,这些规范能够别任何想要产生任何兼容虚拟机的人所实现.虚拟机与语言定义提供了一个完全的规范.Java说明了所有的元数据类型的大小和数学特性,而没有把他们留在直到平台的实现.

Java解释器相对较轻较小.能够被任何一种特殊的平台想要的形式实现.这个解释器能够作为一个分离的应用程序运行,或者被嵌入到其他的软件中,比如浏览器.这就意味着Java的代码是可移植的.同样的Java应用程序字节码能够运行在任何提供Java虚拟环境的平台上.

Java代码的基本单位是类.编译好的Java类是一个统一格式的二进制,包含了Java字节码和其他的类信息.类能够离散的保存,保存在文件中,或者本地保存或者保存在一个网络的服务器中.类能够动态的被定位和加载在运行时.

除了特殊平台的运行时系统,Java有许多的包含依靠结构的方法的基础类.这些本地方法,作为Java虚拟机和真实世界的网关.他们用本地的编译好了的语言实现,提供了底层次的访问,比如网络,窗口系统和宿主文件系统.大多数的Java是由Java自身引导编写的,包括Java的编译器,Web浏览器组件和复杂的GUI库.

在历史上,解释器被认为非常的慢,但是Java不是一个传统的解释型语言.除了把源代码搞成可以移植的字节码,Java也被小心的设计,以便运行时系统能够更进一步优化他们的性能通过编译字节码到本地机器码.这叫做JIT或者是动态编译.有了JIT,Java代码能够运行得与本地代码相同得快,而且保持他的可移植性和安全性.

在语言性能的比较上,这可能会引起混淆.仅仅有一个本质上的性能缺陷,就是编译好了的Java代码要经历安全和虚拟机数组越界检查.其他的任何的东西都被优化成为本地代码,就像静态编译的语言一样.除此之外,Java包括更多的结构化的信息,提供更多的空间来优化.这些都是以时间作为代价的.

传统的JIT编译器优化代码需要时间.所以JIT能够产生体面的结果,但是可能陷入一个重要的执行时间.为了解决这个问题,Sun的编译技术,叫做HotSpot,使用了一个技巧叫做adaptive compilation.如果你看一下真正花去时间的是什么,就能证明是一边一边的执行相关一小部分代码.虽然这一部分代码只是整个程序的一小部分,但是他的行为决定了整个程序的性能.Adaptive compilation也允许Java运行时新的优化,因此,在相同的情况下,要求Java的代码运行得要比C/C++快.

为了充分得利用这个,HotSpot作为了一个正常的Java字节码解释器,但是不同的是,他用来衡量代码哪部分代码是被重复的执行的.一旦他知道哪部分代码是影响性能的,HotSpot就把这段代码搞成本地代码.既然这些代码仅仅是一小部分,这些时间也就能够承受得起.事实上,Sun的默认的JVM能够运行为两种模式,客户端和服务器端.
当然这些有用的信息也可以以共享的,只读的类的形式永久性的保存下来,以减少启动的时间和运行负担.

Java与其他语言的比较:
很简单的比较了流行语言,脚本语言与Java的区别.

安全的设计:
讲了最吸引人的Java安全性是使得新型的动态移植软件成为可能.Java提供了许多层保护,从缺陷代码到恶意行为比如病毒和木马.

简单,简单,简单...:Java不允许编程定义操作符重载(+-).Java没有源代码预处理器(#define).Java使用定义好了的包结构来管理类文件.这儿也没有必要有头文件(.h);Java支持单继承类,但是允许多继承接口.(在C++中没有接口的概念,只有抽象类-带有纯虚函数的类;C#中有接口的概念,但是平时,我用接口很少,所以对于接口的好处我并没有深刻的体会到,包括上次面试的时候,被考官问起这个问题,我也是书面上的回答他.今天有时间查查书,看到了在C++中,实现重载必须要有虚函数的支持.)

类型安全和方法绑定:通常语言是被分成静态和动态,即变量的信息是编译时被知道还是运行时知道的.严格的静态语言比如c/c++,他们的数据类型是在编译的时候就明确了.这样在运行前,编译器就知道许多的错误.但是静态语言灵活性差,他们不支持高层次的建构list和collections.他们也不可能支持动态导入新的数据类型.

另外一个属性是绑定方法.静态语言在编译时绑定方法的定义,除非coder另外指明.而Java提供了C++和Smalltalk的好处;他是静态类型的,late-binding语言.每个Java的对象有一个定义良好的类型,并且在编译时就确定了.然而,Java也是一个完全的运行时类型.Java运行时系统保持跟踪所有的对象,决定他们的类型和关系.不象C/C++,类型转换也是在运行时检查的.

增加的开发:Java携带了数据类型和方法签名信息在源代码和编译好的字节码中.这就意味着Java类能够被增加开发.你的自身的Java源代码能够和你的编译器没有见过的其他源码一样被安全的编译.换句话说,你能够编写新的引用二进制类文件的代码,而不会丢失类型安全.

Java不会陷入基类丢失问题.在C++中,一个基类的实现可以被有效的冻结,因为他有许多的父类;改变基类可能需要重新编译所有的父类.这对于类库的开发就是个很大的问题(同样这个问题对于游戏开放也是个很大的问题,因为一个游戏的代码也是非常的庞大,再加上庞大的游戏引擎,通常一个游戏的编译都需要一个小时,如果每个类还要编译,那么对于游戏的调试都是十分不方便的)Java通过动态的定位类中的域,来避免这个问题.只要一个类保持一个源结构的有效的形式.

动态内存管理:Java去除了指针,增加了对象垃圾收集和高层次的数组.

错误处理:Java的根本是网络设备和嵌入式系统.对于这些应用.拥有健壮的和智能的错误管理.Java有一个强大的异常处理机制.异常提供了一个更加自然和优雅的方式来处理错误.允许你把正常代码和出错代码分开处理.

当一个异常发生时,程序流就到了预先设计好的catcher代码块中(突然想起,开发中的一个问题,就是我们通常把异常捕捉放在调用函数的地方,还是放在函数里面,这个问题我一直没有找到一个很好的解决方案),

线程:现在的程序需要高度的并行性.Java内建了对线程的支持.并发是漂亮的,大多数情况下,线程需要异步.而Java支持基于monitor和condition的异步模型,一种访问资源的锁和解锁系统.异步,指明了方法和代码块的安全和序列化访问.在线程间同样也有简单的,原始的方法明确wait和signal.Java5.0引入了高层次的并发包.这个包提供了强大的工具,专注于多线程编程通用的模式,比如线程池,任务协调和高级锁定.

可伸缩性:类趋于更小,模块组件化,他们能够被物理上的分离,动态检索,压缩存储,甚至是不同的分布式方案的高速缓存.在类层次上,Java提供了包,一个结构化的层次,把类按功能分组成为一个单元.
(下面翻译一段网上使用包的好处:你和你的coder能够很容易的决定哪些类和接口是相关的;你和你的coder能够知道在哪里可以找到提供某种相关函数的类和接口;一个包中的类名不会与另一个包中的类发生冲突;)