CPU 有两种指令集,汇编指令,和机器指令。不同架构的指令集是不一样的,比如intel和ARM。
编译是把程序转化为指令集的过程。
预处理,就是把代码里引入的其他代码,插入到这段代码中,形成一个代码文件。
编译,就是把代码转化为汇编指令的过程,汇编指令只是CPU相关的,也就是说C代码和python代码,代码逻辑如果相同,编译完的结果其实是一样的。
汇编,就是把汇编指令转为机器码的过程,机器码可以被CPU直接执行。
链接,就是将一段我们需要的已经编译好的其他库,与我们的汇编结果连起来,这样才是最终程序完整的形式,操作系统才可以运行。不同操作系统编译好的其他库形式不同,而且链接的方式也不同,得到最终程序的形式也不同,所以编译好的程序只能在特定的操作系统下运行。
JIT 即时编译
c++在执行过程中,直接可以编译得到机器可以直接运行的。但在实际的编程过程中需要考虑平台cpu架构[x86与x64]的适配。即使得到编译后的二进制文件通常情况下也无法在多个平台都可以运行起来。
相比之下java在推出的过程中为了达到 write once,run in anywhere。
因为这样一来实际的编程开发者无需考虑具体的cpu架构,更多的去关心实际的业务开发。通过先编译得到字节码也就是.class文件.然后通过jvm解释运行。虚拟机在中间解决了平台的差异,但是这样一来,相当于在中间插入了编译为字节码的过程,拉长整个执行流程。
每次在执行过程中通过编译降低了java的执行效率。而有些时候部分代码并不是每次都会做出修改,能不能不要每次都执行编译,而jit就是这样一个技术,帮助java代码执行编译执行过程中,减少编译的过程,部分的代码编译为机器码后通过一定的规则保留下来,次执行从而直接执行,从而提高整体java的运行效率。
参考文章
zhuanlan.zhihu.com/p/373584239 juejin.cn/post/684490… www.coonote.com/os/compiler…