地基篇:计算机的基础常识 和 JVM的基本了解

前言

这段时间很忙,我上两周都没有更新。今天开始补上。

继续Kotlin 地基篇,之前说过要聊JVM的技术常识,现在就来聊一下。

JVM语言的翻译过程

java运行过程-2.jpg

上面这个图就是Java语言的翻译过程。

在上篇文章中,我们说过,从翻译方式上讲,

Kotlin 既是编译型语言,(翻译成二进制文件)

也是编译-解释型语言。(通过JVM 来实现跨平台)

所以,

在Android 开发场景中,Kotlin和Java的翻译方式是一模一样的。

唯一的区别就是源代码是*.kt 文件,而不是 *.java 文件。

从上图可以看出,

JVM集成了在目标平台上执行的指令集,并由JVM处理了不同操作系统的区别。

以此来实现 JVM 语言的 ”Write Once, Run AnyWhere“

注意区别两个重要的时期:编译时和运行时。

编译时:*.java or *.kotlin 编译成 *.class 这种中间语言(IL)的时候。

运行时:在目标平台上执行的时候。

计算机操作系统的技术常识

单片机

微型计算机,单片机包括了计算机的所有必要部分。但是,他的计算能力比较PC这样的传统计算机要差很多,主要用于处理简单的任务。

CPU

中央处理器,有人将他理解为大脑。其实CPU应该理解为大脑的计算部分。因为大脑的存储由其他部分负责。

大脑本身应该相当于一个主机。

CPU 只能执行二进制机器代码。

指令集

CPU是基于指令集实现的硬件。指令集就是CPU可以执行的机器代码。不同的CPU架构,对应实现不同的指令集。

指令集可以看做是要求CPU 对外提供的功能。

C语言和汇编语言这类语言都可以直接控制硬件。通常这些控制硬件的软件叫做驱动

其他上层的应用软件直接调用驱动提供的API即可。

下面介绍几种常见的CPU架构与指令集的对应关系(所谓架构是指硬件电路的实现):

intel X86架构CPU可能实现了多个指令集x86,x86-64,MMX,SSE,SSE2,SSE3,SSSE3 ,而这些指令集中的指令让cpu完成的动作都比较复杂,所以也称为CISC

AMD amd64架构的cpu 兼容了x86指令集还拓增了3D-Now!指令集,用于加强对3D显示的支持。

ARM ARMv1~ARMv7架构的cpu实现了Thumb指令集和ARM指令集。这些指令集中的一条指令让cpu完成的动作都比较简单,所以也称为RISC指令集

指令集这个地方有个非常有意思的关联。

不同的CPU架构 支持 不同的指令集。

同样的高级语言,在不同指令集上的编译器不同。

所以,才有CPU厂商提供C/C++ 编译器的事情。他们提供的编译器会更加符合当前CPU 架构的执行。

比如Intel就提供C和C++的编译器。

不同指令集上的编译器不同,所以最终执行的二进制文件不同。

由此,引出了“移植” 和 “跨平台” 的需求。

再次强调,解释型语言由于直接在解释器上运行,所以天生就是跨平台的。

解释型语言也是后面发展出来的。

JVM 的设计思路也是借鉴了这一点。

操作系统

操作系统就是电脑硬件的最大驱动。提供了硬件和应用软件之间的桥梁。关键三大部分是:进程、内存管理、文件系统。

不同的操作系统很多支持不同的指令集。比如Windows 支持x86 。

下面看一张计算机的基本架构:

计算机简单模型.png

硬盘

长时间存储数据文件的地方。不删除的话,一般会一直在里面。

内存

和CPU关系最紧密的硬件。

CPU可以直接运行内存中的数据和程序。内存的大小和CPU的计算能力是一个计算机能够同时执行多少任务的关键。

内存只是一个临时运行程序的区域,用完就会释放空间。当然,在你不写内存泄漏代码的前提下。

对于程序员来说,对内存的理解和使用是最重要的。其他部分,了解就好。

总结

计算机处理数据大概就通过以上几个部分:数据(硬盘)——>内存——>CPU——>CPU通过指令处理数据

JVM的体系结构

JVM 主要分为三个子系统:类加载器运行时数据区执行引擎

JVM图示.png

类加载器:它主要功能是处理类的动态加载,还有链接,并且在第一次引用类时进行初始化

运行时数据区:它约定了在运行时程序代码的数据比如变量、参数等等的存储位置。

执行引擎:运行时数据区存储着要执行的字节码,执行引擎将会读取并逐个执行。

后记

技术常识是扎实进步的关键。不然人家稍微聊两句你就歇菜了。

下一篇,我会着重聊一下,JVM 中的 运行时数据区。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享