你写完一段代码,点一下“运行”,它就直接动起来了——这大概率是脚本语言干的活;要是先得点“编译”,等几秒蹦出个.exe或.class文件,再双击执行,那八成是编译语言。
最直观的区别:要不要“提前打包”
编译语言(比如C、C++、Go)像做一道硬菜:先把所有食材切好、腌好、配好料,再下锅猛火炒熟,端上桌就能吃。这个“炒熟”的过程就是编译——把人写的代码(源码)一次性翻译成CPU能直接执行的机器指令,生成可执行文件。
脚本语言(比如Python、JavaScript、Bash)更像边看菜谱边炒:你写一行,解释器读一行,当场翻译、当场执行,不生成独立的可执行文件。你改个变量名,保存后刷新网页,效果立马可见。
一个对比小实验
假设都写一句“打印你好”:
在C里,你要这么写:
#include <stdio.h>
int main() {
printf("你好");
return 0;
}
然后得用gcc编译:gcc hello.c -o hello
生成一个叫hello的可执行文件,再运行:./hello
而Python只用一行:
print("你好")
保存为hello.py,直接敲:python hello.py
——搞定。连编译步骤都没有。
为啥有的语言非要编译?
因为快。编译过的程序跳过了“边读边翻”的环节,CPU拿过来就能跑,适合对性能要求高的场景,比如操作系统、游戏引擎、高频交易系统。
脚本语言省事灵活,改起来快,适合写自动化任务、网页交互、数据分析脚本。你用Python三行删掉几百个重命名文件,或者用JavaScript让按钮点击后变颜色,都不用等编译。
别被名字骗了:界限越来越模糊
Java编译成字节码,还得靠JVM解释执行;TypeScript写完要编译成JavaScript;Python代码其实也会被编译成.pyc字节码缓存——只是你平时看不见。所以现在更多说的是“执行模型”:是提前全量翻译(AOT),还是运行时逐行解释(interpreter),或是混合(JIT,比如V8引擎跑JS)。
选语言,不用死磕“编译 or 脚本”,先想清楚:是要嵌入路由器跑十年不重启?还是今晚就得把日志自动归档发邮件?场景定了,路自然就出来了。