编译vs解释
编译: 编译器把源码文件翻译成机器代(类比家里吃饭,把全部菜做好才开始吃)
-
c++为例子
- 一个exe可执行文件有多个cpp文件编译、链接构成。每次编译cpp源码会转换成obj中间文件(代码、数据、名称)。
- 当exe内的所有obj都编译好了,统一link成exe文件(lib:静态库文件,link时会把对应obj对应的lib库文件**装载(抽取)**到exe(obj里面的代码名称改为地址)文件
- 动态库( lib:存放的dll函数本体的内存地址 dll:存放动态库的真正代码)exe可执行文件( 存放了动态库的lib函数地址 )在运行时,一旦检测到dll的内存地址,则此时此刻才调入装载动态代码到内存。
解释:解释器每运行一条源码则翻译成机器代码运行。(类比吃火锅)
-
java为例子
- 一个java源文件先经过java编译器生成二进制字节码
- 生成的中间代码(java的二进制字节码)会经过解释器逐条的执行(转成机器指令)
java编译器
语法分析器: 识别源码的每一个单词进行一个个标记(即一串" 145plok87 "为一个字符序列,有三个标记【最长一致原则】)
词法分析器: 词法分析器将从标记中生成程序员真正表达的语义,生成(XML、语法树)
语义分析器: 检查有无语义错误(对代码进行语义解释)
java解释器
JIT(即使编译器): 把程序中的热点代码编译成机器码,编译的字节码可供多次使用而不用重复的编译与解释。对热点代码进行智能的优化
热点:被程序多次调用的方法、循环体。