想象你在看一本菜谱(源码),按步骤做菜:
-
先照着菜谱做
开始时,你一边看一边做(解释执行),每看一行就按上面写的去操作,速度一般。
-
发现常做的拿手菜
做着做着,你发现有几道你天天做、很拿手的菜。于是你把这几道菜的做法背下来,甚至记下省时间的小诀窍。
-
直接上手不看菜谱
下次再做这几道菜时,你早就把步骤记在脑子里,一气呵成,不用再翻菜谱了,速度飞快。
JIT(即时编译器)就像这个“高手厨师”:
-
它先用“照菜谱”方式慢慢执行代码(解释器),同时留意哪些地方重复出现、最常用。
-
一旦确认是“拿手菜”(热点代码),就把这部分“菜谱”直接翻译成本地语言(机器码),并保存下来。
-
下次碰到同样的操作,就直接用“背下来的诀窍”——运行已翻译好的机器码,省掉一遍“读菜谱”的时间。
JavaScript 引擎之所以“跑得像风”:
-
它只把最常用的那部分代码“背下来”并优化,其他代码仍然走普通流程,节省资源。
-
运行时不断学习:哪道菜用得最多、哪些步骤能合并、哪些能省略,不断提升效率。
-
最终常用代码如同“流水线作业”,在 CPU 上直接跑,速度能赶上甚至超过一些预先全部翻译好的语言。
通俗地说:
“JavaScript 引擎就像个会总结经验的厨师,只花力气优化拿手好菜,剩下的菜谱照着做,既快又省心。”