1、电脑只能处理二进制数据,也就是给他处理的只能是机器语言,而你的高级语言必须进行编译才能执行,也就是转换成汇编语言,然后转换成机器语言给电脑执行。
用c语言进行编程,编译器会将你的c语言代码编译成汇编语言,再由汇编语言的编译器编译为机器语言,通常我们看到的可执行文件事实上就是机器语言的形式,进而让cpu理解和执行
源代码 ->汇编语言 ->机器语言,也就是二进制
2、汇编语言 指令 机器码三者的关系:
机器码是0和1组成的二进制序列,可读性极差
指令就是把特定的0和1序列,简化成对应的指令(一般为英文简写,如mov,inc等),可读性稍好
汇编语言包括指令和伪指令。伪指令是为了编程方便,对部分指令做的封装。
3、为什么使用java?
1、避免Native作为应用代码导致的因为设备多样化导致App生态了支离破碎,是从Nokia哪里的教训。
2、重新实现Dalvik,一是产权问题,二是JVM效率低。
3、Java在过去的发展累积下了很多为业务逻辑产生的人力资源链,而移动应用开发的人力分布基本重合,可以充分复用。
4、在系统层面为了保持效率以及系统开发一般都用c/c++开发
4、JDK、JRE、JVM
JDK里有:
bin:最主要的是编译器javac.exe
lib:java类库
jre:java运行环境
JRE里有:
bin:jvm
lib:jvm工作所需要的类库
JVM:
JVM并是不专为Java所实现运行的,只要其他编程语言的编译器能生成Java字节码,那这个语言也能实现在JVM上运行。
5、编译型语言、解释型语言
编译型语言:C/C++
编译过程是将源代码(高级语言,人类容易读,容易理解),转换为机器码(cpu能理解,能高效的执行)的过程.
解释型语言:JavaScript python 等
直接解释源代码,并且直接执行,没有编译过程
编译程序是整体编译完了,再一次执行,而解释程序是边解释边执行.
高级语言也分为编译型语言和解释型语言。
主要区别在于,前者源程序编译后即可在该平台运行,后者是在运行期间才编译。所以前者运行速度快,后者跨平台性好。
前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。
6、三种方式将java源代码转换为机器码:
1、第一种方法:用javac编译器将java源代码编译成我们常见的 .class文件,然后程序在运行时,JVM将需要用到的 .class文件加载到内存中,从class文件中逐行读出一条指令,JVM中解释器解释一条指令,接着执行一条指令,如我们上面所说,边解释边执行,从而达到将.class文件翻译为机器码
2、第二种方式:开始依然是由javac编译为.class文件 ,但是我们平时使用的大多数oracle JDK 提供的Hotspot JVM都提供了JIT(Just In Time)编译器,也就是我们平时所说的动态编译器. 根据二八定律,消耗大部分资源的只有那一小部分代码(热点代码).在程序运行时,JIT通过预热(收集信息找出热点)将热点代码转换为机器码.JIT为方法级,会将编译过程的字节码缓存在codeCache中.在这种情况下,部分热点代码就是编译执行而不是解释执行了.
3、 第三种方式:除了我们日常java使用模式,还有一种新的编译方式即AOT(ahead-of-time complication),直接将字节码编译成机器码,这样避免了JIT等方面的预热消耗.如oracle JDK9就引入了实验性的AOT特性,并增加了新的jaotc工具.
aot是编译期间,静态的,直接编译成类似类库的东西
7、dalvik虚拟机、art虚拟机
dalvik,基于jvm,运行.dex文件。Java虚拟机基于栈架构,Dalvik虚拟机基于寄存器架构。数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。从2.2开始支持JIT。
art,在应用安装时就预编译字节码到机器语言,这一机制叫Ahead-Of-Time (AOT)编译。系统性能的显著提升。更大的存储空间占用,可能会增加10%-20%。在Android5.0以后,谷歌彻底抛弃Dalvik,采用ART。