什么是“编译型”和“解释型”语言?

返回

面试常见问题:“Java 是编译型语言还是解释型语言?”
要把这个问题讲清楚,先得搞明白这几类语言各自是什么意思。

什么是“编译型语言”?

编译型语言指的是:源代码在运行之前,先通过“编译器”整体翻译成机器能直接执行的机器码可执行文件,然后再运行。

  • 执行流程
    源代码 →(编译器)→ 机器码可执行文件 →(运行)→ CPU 执行

  • 典型特点

    • 运行前就能发现很多错误:比如类型不匹配、未声明变量等(具体取决于语言和编译器能力)。
    • 运行速度通常更快:已经是机器码了,启动后少了“边解释边翻译”的开销。
  • 常见例子

    • C、C++、Rust 等

什么是“解释型语言”?

解释型语言一般指:程序在运行时,由“解释器”读取源代码(或某种中间表示),一边解析一边执行,而不是先整体编译成独立的机器码可执行文件。

  • 执行流程
    源代码 →(解释器 / 运行环境)→ 边读边翻译边执行 → CPU 执行

  • 典型特点

    • 运行依赖解释器 / 运行时环境:比如没装 Python 就不能直接跑 .py
    • 很多错误会在运行到那一行时才暴露,尤其是动态类型语言(也跟工具链有关)。
  • 常见例子

    • Python、PHP、Lua 等

什么是“混合型”(编译 + 解释)?

现代很多语言(包括 Java)采用的是编译 + 解释/JIT 混合模式

  • 基本思路

    1. 先把源代码编译成中间形式(比如字节码);
    2. 再由虚拟机来执行这份中间形式;
    3. 运行中如果发现某段代码频繁被执行(热点代码),就用 JIT(即时编译器) 把它编译成本地机器码,加速后续执行。
  • 执行流程(以 Java 为例)
    源代码 →(编译器 javac)→ 字节码 .class
    →(JVM 解释执行字节码)→ 发现热点
    →(JIT 即时编译)→ 机器码加速执行

  • 这种模式的好处

    • 保留了跨平台:字节码本身与具体 CPU 无关;
    • 又能在长时间运行的服务里,通过 JIT 把热点路径“磨”得很快,性能接近 C/C++。

严格来说,Java 既不像传统 C 那样“纯编译型”,也不像早期脚本语言那样“纯解释型”,而是:
先编译成字节码,再由 JVM 解释执行 + JIT 编译的一种混合模式。