关于java
文章来自 shichang // Welcome!
主页
|
About Me
|
归档
|
标签
1995年,sun公司发布JAVA1.0版本,至今已经发展了二十三年,java分为三个部分: - java SE(标准版,主要写桌面程序,现在被C#,QT和HTML取代) - java EE(企业版,java语言最强大的领域) - java ME(精简版,主要活跃于嵌入式开发,现在被安卓和IOS取代) 同样作为面向对象语言,java在抽象程度上比c++要高,对于业务编程,用java比用c++开发周期大大减少,互联网技术更新换代速度快,用java语言能更快适应环境的变化。 ### JAVA的跨平台特性 Write Once,Run Anywhere java程序的运行过程是先由前端解释器将java程序解释成二进制字节码文件(即*.class*文件),再将字节码文件加载进虚拟机JVM中执行。虽然不同平台虚拟机的内部实现机制有所不同,但是字节码的标准都只有一个。虽说是可以在不同平台上都能运行,但是这些平台上都必须要安装对应的虚拟机,虚拟机将字节码文件解释成能在自己平台上运行的可执行机器码 ### 为什么说java跨平台而不说c++ c++语言和java比较起来偏底层一点,c++程序的运行是直接由编译器将程序编译成二进制可执行文件(机器指令码比如汇编语言),这个可执行文件操作系统可以直接执行。不同的平台支持的可执行文件的格式不一样,比如说windows下是*.exe*文件,而linux下是*.sh*文件,在windows下编译出的c++程序在linux上是不能直接执行的。c++未经编译的源代码,是可以跨平台的。 <br> Java中提供了一种内存模型,用来屏蔽掉了不同平台下的各种硬件和操作系统的内存访问的差异,使得Java程序在不同的平台下都能获得相同的内存访问效果。C++直接使用物理机器和操作系统的内存模型,在不同的平台上内存访问就会出错。 ### HotSpot VM HotSpot VM是目前来说性能最好的虚拟机,最开始由一个小公司研发,后该公司被sun公司收购。在sun公司的官方jdk和jre中都默认安装了该虚拟机。该虚拟机具有一个热点探测功能:探测程序中频繁使用的方法块和,将其标记为“热点代码块”,然后通过内部的双重即时编译器将热点代码块直接编译成机器码进行执行,大大提高程序性能。双重即时编译器:在虚拟机中既有解释器,也有编译器,可以直接指定虚拟机中编译器的工作模式,完全解释模式和完全编译模式,当然顾名思义,一个停止,完全让另一个工作。 ### 前端编译器和语言无关性 前端编译器的工作内容是将程序源代码编译成字节码文件,默认的编译器都是jre中的*javac.exe*。在Eclipse中前端编译器由 Eclipse公司自己研发的*Eclipse Compiler for Java*编译器即 ECJ编译器。前端编译器的具体功能是: - 词法分析:将Java源码中的关键字和标识符等内容转换为符合标准的Java Token序列,然后按照指定的顺序进行匹配校验 - 语法分析:将词法解析后的Token序列整合为一个结构化的抽象语法数,比如try-catch-finally,if-else,do-while之类的 - 语义分析:将语法分析得到的语法树扩充得更加完善,完善后的语法树可以用来生成字节码文件 - 生成字节码:执行字节码编译 由于java的跨平台特性和字节码的规范唯一性,其实对于虚拟机来说,外部语言的种类是无所谓的,虚拟机只在乎加载的字节码文件是否是符合规范的。所以对此,其他的语言也都可以通过特定的编译器编译成符合java虚拟机规范的字节码文件,比如Ruby语言和JRuby编译器,JavaScript语言和Rhino编译器 ### java比C++慢 即使java虚拟机中使用了即时编译器,可以将使用频率比较高的代码段直接编译成机器语言,但是总体来说java还是比c++的运行效率慢很多(同等规模),原因有以下几点: - java中程序会被进行各种各样的检查,为了保证安全性。 - java中由虚拟机进行垃圾回收,而不是由程序员手动管理,缺失了灵活性。
Pre:
docker + shadowsocks代理搭建
Next:
死锁