天天看点

2021-11-04 编译/解释、动态/静态、强类型/弱类型

jvm

"一次编译,到处运行"说的是Java语言跨平台的特征,Java的跨平台特征与Java虚拟机是密不可分的,可在不同的环境中运行,比如说Windows平台的Linux平台都有相应的JDK,安装好JDK后就有了Java语言的运行环境。其实Java语言本身与其他的编程语言没有特别大的差异,并不是Java语言可以跨平台,而是在不同的平台上都有可以让Java语言运行的环境而已,所以才有了Java一次编译,到处运行这样的效果。严格的讲。跨平台的语言不止Java一种,但是Java是较为成熟的一种.

1. 解释性、编译型

  • 解释性:代码没有编译的过程,读一行执行一行,eg:JavaScript
  • 编译型:运行之前需要将代码先编译成【机器指令】,再运行,eg:c语言

Java是存在编译过程的,但是它编译成的不是【机器指令】,而是【字节码】,字节码只能由JVM识别,硬件没办法识别,运行的过程是由jvm使用解释的方式执行的.(加一层:要么屏蔽复杂要么屏蔽不同)

但是为了提升效率,JVM推出了JIT(just in time complie 即时编译器),就是运行过程中,能将部分热点代码,直接编译成机器码,加快执行效率,甚至在Java9 中提出了AOT 编译器(Ahead Of Time,运行前编译)

So far, 在JVM中有三个非常重要的编译器,他们分别是:前端编译器,JIT编译器,AOT编译器。

  • 前端编译器:最常见的是javac编译器,将Java源代码编译成Java字节码文件。
  • JIT即时编译器:最常见的就是HotSpot虚拟机中的Client Complier 和 Server Complier,其将Java字节码编译成本地机器代码。(特点:吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能出发JIT的分层机制)
  • AOT编译器:将源代码直接编译为本地字节码。(特点:内存占用低,启动速度快,可以无需runtime运行,直接将runtime静态链接至最终的程序中,但是无运行时性能加成,不能根据程序运行情况做进一步的优化。)

而在JVM中,通过这几种不同的方式的配合,使得JVM的编译质量和运行速度达到最优的状态。

2021-11-04 编译/解释、动态/静态、强类型/弱类型

Java是解释型和编译型兼顾的语言

2. 动态类型、静态类型

  • 静态类型语言:变量定义时有类型声明的语言。

    (1) 变量的类型在编译时确定

    (2) 变量的类型在运行时不能修改

    这样编译器就可以确定运行时需要的内存总量。

    eg:C、Scala、Java、F#语言是静态类型语言。

  • 动态类型语言:变量定义时无类型声明的语言。

    (1) 变量的类型在运行时确定

    (2) 变量的类型在运行时可修改

    eg: Python、JavaScript、Ruby语言时动态类型语言

Java是一种静态类型的语言

3.强类型定义语言、弱类型定义语言

强类型定义语言:一旦一个变量被指定了数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。强类型定义语言是类型安全的语言。

弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反,一个变量可以赋不同数据类型的值。强类型定义语言在速度上可能略逊色与弱类型定义的语言,但是强类型定义语言带来的严谨性能有效的避免许多错误。

Java是一种强类型定义语言