没什么意思,就是随便唠唠
Java概述
印象中,SUM公司一开始想要给什么电子产品写程序,但是,当时的各种厂商生产的设备所使用的CPU不尽相同,因此,在机器A上能够完美运行的程序,移植到机器B上之后就不一定能正常运行了。当时主流的语言是C/C++,C程序编译之后的机器代码,是针对特定平台的,如果要移植到其他机器上,就需要再针对其他机器进行编译。这样的话,SUM公司如果用C/C++来编写程序,就需要用同一套代码,针对不同的平台进行编译,那可太噩梦了。因此,SUM公司就说“我们发现C/C++不能满足我们的需要。”之后,SUM公司就开发了一门新的语言,解决了跨平台的问题,这门语言一开始叫做Oak(橡胶)语言。后来将Oak语言进行商业化时,发现已经有Oak这个商标了,就将Oak语言改名为Java。
那么Java是如何解决跨平台的问题的呢? 没有什么问题是不能通过增加一个抽象层解决的,如果有,那就再增加一层抽象层。 C/C++c程序经过编译器编译链接之后,形成了操作系统可以直接运行的程序,C/C++属于编译型语言;而Python程序是经过解释器将Python程序逐行解释每一句源代码给操作系统执行,属于解释型语言。
编译型语言 | 解释型语言 | |
---|---|---|
优点 | 编译一次后,脱离了编译器也可以运行,并且运行效率高。 | 跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。 |
缺点 | 可移植性差,不够灵活。 | 一边执行一边转换,效率很低。 |
设计Java他娘的还真是个天才,Java程序首先需要经过编译器编译成字节码文件,也就是.class文件,然后再由解释器逐行将.class文件解释成操作系统所能运行的程序。因此,只要不同的平台都可以安装.class文件的解释器,就可以运行Java程序。由此,Java的跨平台特性就是这么来的。
在我们的日常生活中,使用语言与他人交流,进行信息的交换;跟不同的人打交道需要用不同的语言,十里不同音,百里不同俗,电脑也一样,我们在给电脑安排一些任务的时候,也是用“语言”跟电脑进行交流。电脑的基础是数字集成电路,它只认识“开”和“关”这两个字,也就是只认识“0”和“1”,不管怎么说,总之就是只能识别两个不同的符号,而且是一正一反,非此即彼的两个符号。
一开始的程序员也确实是用电脑的语言,也就是二进制语言跟电脑交流的,那时候,将纸带划分为一个个小格,打孔表示0,不打孔表示1。通过这种方式来给电脑进行编程,给电脑安排任务。但是这种语言对于我们来说,实在太难理解了,一长串的0和1不知道表示什么意思,而且不方便维护,要是打错了,把本来不需要打孔的地方打孔了,这个程序可能就需要再打到另外一个纸带上了。
后来,聪明的工程师们,将一些常用的计算机指令编用特定的单词字母进行映射。比如,“add ”代表“加”,“SUB”代表减,“add ax bx”表示将“ax”的值与“bx”的值相加,结果存放到“ax”中。这样,用一个短语,单词来表示复杂难懂的机器语言“010101110010101110001010101000101......(我乱打的)”,这就是汇编语言。汇编语言并不能直接被机器执行,需要一个“翻译”来将汇编程序转换为对应的机器指令才能被计算机所执行。汇编语言的产生,极大的方便了计算机的使用,促进了计算机行业的发展。为之后的计算机语言打下了坚实的基础。
汇编语言本质上是机器指令的符号表示,在那个年代,不同的CPU有不同的实现,不同的CPU机器指令存在不同,因此,在这个CPU上编写的汇编程序,在那个机器上可能无法执行。因此汇编语言不具有移植性。
汇编的不可移植性,限制了软件的进一步推广,因为要针对不同的CPU编写不同的汇编程序。因此,以C语言为代表的第三代编程语言就应运而生。第三代编程语言也叫做高级语言。高级语言与我们日常使用的语言相类似,更为甚者,面向对象的思想,也与我们所认识的世界高度契合。极大的方便了我们将现实生活中存在的问题,抽象出来,用高级编程语言进行描述,交给计算机来计算解决。
我能抽象出整个世界,但是我不能抽象出你,因为你在我心中是那么的具体,所以我的世界并不完整。我可以重载甚至覆盖这个世界里的任何一种方法,但是我却不能重载对你的思念,也许命中注定了,你在我的世界里永远的烙上了静态的属性。而我不慎调用了爱你这个方法,当我义无返顾的把自己作为参数传进这个方法时,我才发现爱上你是一个死循环。它不停的返回对你的思念压入我心里的堆栈,在这无尽的黑夜中,我的内存里已经再也装不下别人。我不停的向系统申请空间,但却捕获一个异常:我爱的人不爱我。为了解决这个异常,我愿意虚拟出最后一点内存,把所有我能实现的方法地址压入堆栈,并且在栈尾压入最后一个方法:将字符串“我爱你,你爱我吗?”传递给你。如果返回值为真,我将用尽一生去爱你,否则,我将释放掉所有系统资源。
Java属于高级语言,因此,Java程序并不能直接被机器所识别,而是通过编译器,将Java代码翻译成字节码文件,再通过解释器将字节码文件解释成目标机器所能识别的机器代码。在Java中,有一个叫做JVM(Java Virtual MAchine)的东西,JVM是将硬件系统进一步抽象了,它是虚拟出来的一台电脑,有自己完善的硬件结构,如处理器、堆栈、寄存器等,还具有相应的指令系统。相当于在物理机上再抽象了一层,屏蔽了不同的机器之间的差异。JVM读取到的字节码文件内容,再通过JIT翻译成目标奇迹所能立即执行的机器代码。在解释执行字节码文件的时候,还需要用到Java定义的一些类库等,因此,JVM和一些类库就组成了Java运行环境JRE。好了,到现在,字节码文件到机器代码之间的翻译之路已经走通了,那么,我们编写的Java代码是如何编译成字节码文件的呢?我们编写的Java代码,需要通过Javac这个编译器编译成字节码(.class)文件。编译器Javac以及一些优秀的工具类javadoc,jar等组成了Java开发环境————JDK。
JVM 是Java虚拟机,是运行Java字节码的地方。
JRE 是Java运行环境,JRE中包含了JVM和Java核心类等类库。
JDK 是Java开发工具包,包含了编译器JRE和Javac编译器以及一些常用的工具。