一切都要从二进制、字节码说起

二进制

自古以来,就有太极生两仪,两仪生四象,四象生八卦的文化传说。天与地,明与暗,是与非,有与无,宇宙万物貌似都是在这两个极端之间存在的。然而在计算机的世界里,这个世界又是怎样存在的呢,对的,就是用二进制来表示的。

转化

十进制转二进制

250除二取余数,后面的余数居最高位,得11111010

十进制转八进制

250除八取余数,后面的余数居最高位,得372

二进制转八进制

11111010补全前面的位数,9位(3的倍数)得011 111 010,得372

表示

数据在计算机中是通常是用二进制表示的,但是当加减运算时,是通过补码的方式来表示的,表示方式有原码与反码,补码。

  • 正数的原码与反码,补码都相同,即它的二进制数
  • 负数的补码稍微复杂一些。【所有的数据运算都是采用补码进行的】

负数补码的推算

  • 方法一:直接推算法

    利用原码加上补码等于0的特性,比如:5的二进制为0101+(-5的补码)=0(十进制),得-5的补码为1111 1011

  • 方法二:公式推算法

    负数的补码=正数的二进制取反+1, 比如5的二进制取反为11111010,+1之后,得1111 1011

计算机语言

介绍完二进制后,我们来了解一下有哪些计算语言

定义

是指用于人与计算机之间通讯的一种特殊语言,是人与计算机之间传递消息的媒介。

分类

低级语言
机器语言

直接用二进制指令表达。指令是用0和1组成的一长串代码。有一定的位数,并分成若干段,各段的编码表示不同的含义。

汇编语言

使用一些特殊的符号代替机器语言的二进制码(又称符号语言),计算机不能直接识别,需要用一种软件将汇编语言翻译成机器语言,依赖于硬件体系,开发难度较大。

高级语言

高级语言是相对于低级语言来说的,高级语言是按照人的思维编写出来的语言,比如C语言、C++、JAVA、Python等,其可读性高,但执行效率较低级语言低,编写的程序叫作源程序。

那么问题来了,对于高级语言,如果程序想运行,必须翻译成计算机能识别的低级语言才行,那么,高级语言是怎么翻译的呢?这就要借助编译器或者解析器了。

翻译语言

分类

编译型语言

如图所示,程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候(.exe),就不用再进行翻译了。这类语言编写的程序启动稍慢,执行稍快。比如C语言、C++

解释型语言

不需要编译,运行时使用一个专用的解释器去翻译,每一条语句都是执行的时候才翻译,所以这类程序每执行一次就要翻译一次,这类语言编写的程序启动稍快,执行稍慢。比如Python

混合型语言

混合型语言,比如java,对源码进行编译后能得到class字节码文件,然后JVM拿到文件后会进行解释成C++语言,然后通过C++编译器编译成汇编语言。具体情况如下图:

适用场景

  • 运行速度要求高,优选编译型。比如C语言做游戏开发
  • 跨平台性,优选解释型,java主要用于做企业平台

字节码

用IDE编写好JAVA源代码之后,会自动编译成class文件(字节码文件),里面存放的是Class类的信息【这里并不是将程序编译成机器语言,可以将字节码文件看作中间语言,在程序运行时,由JVM将字节码再翻译成机器语言】

跨平台性

正是由于有class字节码的存在,才使得编程语言迈入一个新的世纪,java语言成为跨平台的语言。跨平台就是一次编译,到处执行( Write Once ,Run Anywhere)。只要机器安装好了JVM,一切编译好的class文件就能够运行。而像C语言就不行,必须在指定的操作系统上运行的。JVM只是一个中间桥梁,操作系统要运行java程序,就必须安装一个对应版本的虚拟机。程序执行的时候,JVM会将class文件load进内存中,翻译成机器语言执行,从源码编译成字节码,再由字节码转机器语言的过程,java语言规范起了奠定性作用。

因此

跨平台性 = java语言规范 + class文件 + JVM虚拟机

目前支持跨平台的语言有

运行机制

jvm会加载class文件进内存,java一般默认是混合模式编译,即解释器+热点代码编译,起始阶段采用解释执行,对于多次调用的方法或者循环,采用JIT即时编译。

我们可以手动配置jvm使用什么模式:

-Xmixed 默认为混合模式,开始解释执行,启动速度较快,对热点代码实行检测和编译

-Xint 使用解释模式,启动很快,执行稍慢

-Xcomp 使用纯编译模式,执行很快,启动很慢

Java模型

JVM:Java虚拟机(Java Virtual Machine)它是运行所有Java程序的虚拟计算机,好比是街机游戏的模拟器。

JRE:Java运行环境(Java Runtime Environment)如果要运行Java程序,就需要JRE,JRE里包含JVM和java类库。

JDK:Java开发工具(Java Development Kit)包含开发Java程序的所有工具(javac、java),JDK里包含JRE和开发调试工具。