刚学 Python 的人常问,为啥写完就能跑,不用点那个生成按钮。其实你电脑里装的那个 Python 程序就是解释器,它读一行翻一行,翻完立刻执行,跟同声传译一个路子。
编译器走的是另一条路,先把全部代码翻成机器码存成文件,再拿去运行。C 语言就是这么干的,编译一次到处跑。解释器不生成中间文件,打开脚本就逐行翻译,改完保存再跑,立刻看到效果,调试起来特别顺手。
逐行跑起来的代价是速度慢一截
同样的循环算一亿次,C 几秒跑完,纯 Python 解释执行可能要几十秒。因为它每行都要先理解再执行,类型检查、名字查找这些活全在运行时做。早期版本连字节码缓存都没有,每次启动都从头翻一遍,慢得理所当然。
现在的解释器也没那么傻。Python 启动时会先把源码翻成字节码缓存在 pyc 文件里,第二次跑直接加载,省了一道工序。Java 更进一步,虚拟机里带即时编译,热点代码跑着跑着就被编译成机器码,后面越跑越快。
选解释型还是编译型看你要什么
写脚本、做数据分析、搭原型,解释型语言的即改即跑是真香,报错还能停在出错那行,现场看变量。做操作系统、游戏引擎、高频交易,编译型语言的性能和类型检查才是刚需,一点延迟都亏不起。
- 学编程入门:从解释型起步,反馈快,不容易劝退
- 线上高并发服务:编译型打底,热点路径别拿解释器硬扛
- 两者混搭:用解释型写胶水,性能瓶颈用编译型模块补
还有个常见误会,觉得解释器不要环境。恰恰相反,目标机器必须装对应版本的解释器,版本差一级都可能跑不起来,打包发布时记得把环境一起带上。
再举个日常的例子,打开一个网页,浏览器里的脚本引擎就是个解释器,边读边跑,页面才能立刻动起来。而浏览器本身是编译出来的程序,跑在机器码上。天天在用的东西,上下两层正好一个解释一个编译,这么一想就不抽象了。
顺带说个中间形态,字节码加虚拟机构成的方案,Java 和 C# 走的都是这条路。源码先编译成一种中间表示,再由虚拟机解释或者即时编译成机器码执行,兼顾了跨平台和性能,算是两头的折中。
一句话:要改得快用解释器,要跑得快用编译器,大项目里两者混着用才是常态。