计算机软考中级 知识点记忆 — 编译型与解释型语言对比(Java、C、C++、Python)个人笔记
语言 | 类型 | 编译/解释过程 | 执行方式 |
C | 编译型语言 | 编译器将源码编译成机器码(.exe / .out 等可执行文件)。 | 直接在计算机硬件上运行。 |
C++ | 编译型语言 | 编译器将源码编译成机器码。 | 直接在计算机硬件上运行。 |
Java | 半编译半解释型 | 编译器将源码编译为字节码(.class),然后通过 JVM 解释执行或 JIT 编译。 | JVM 虚拟机解释或即时编译执行。 |
Python | 解释型语言 | 通过解释器逐行解释并执行(CPython 使用字节码,解释执行)。 | 依赖于 Python 解释器。 |
📚 记忆方法:
- C/C++ → Compile(编译型):一次性编译成机器码。
- Python → Purely Interpreted(解释型):逐行解释执行。
- Java → Java Virtual Machine(半编译半解释型):编译成字节码,然后解释执行或即时编译。
💡 口诀:
- C 和 C++ 编完即用,Python 编完就跑,Java 编完字节码,JVM 才能跑! 🚀
编译过程的核心区别:
解释型语言与编译型语言的区别(执行过程)
特点 | 编译型语言(C、C++) | 解释型语言(Python、JavaScript) | |
编译过程 | 预处理 -> 编译 -> 汇编 -> 链接 -> 可执行文件。 | 词法分析 -> 语法分析 -> 字节码生成 -> 解释执行。 | |
执行方式 | 编译后生成机器码文件,直接运行。 | 逐行解释或即时编译后执行。 | |
可移植性 | 差(不同平台需重新编译)。 | 强(跨平台,只需安装解释器)。 | |
执行效率 | 高,生成的是机器码。 | 较低,解释执行或即时编译优化后较高。 |
编译器的工作过程:
词法分析 -> 语法分析 -> 字节码生成 -> 解释执行
1. 词法分析(Lexical Analysis)
目的:将源代码转换成一系列记号(tokens)。
- 输入:源代码的字符流(如 C、Java 或 Python 的源代码)。
- 输出:记号流,一系列标识符、关键字、运算符、常量等的序列。
工作原理: 词法分析器(Lexer)从源代码的字符流中读取字符,识别出其中的有意义的单元(记号),比如关键字、标识符、常量等,并将它们转化为记号(tokens)。
主要检查:输入字符是否按照一定规则生成;
2. 语法分析(Syntax Analysis)
目的:根据语法规则检查记号流的结构,并构建一个语法树。
- 输入:记号流(由词法分析产生的标记序列)。
- 输出:语法树或抽象语法树(AST),表示程序的结构。
工作原理: 语法分析器(Parser)根据编程语言的语法规则(通常由文法描述)来分析词法分析器输出的记号流,检查这些记号是否符合语法结构。如果符合语法规则,构建一个语法树,否则就会报错。
主要检查:主要对结构进行检查;
2.1 语义分析
主要检查:主要对语句进行检查 以及 类型;
3. 字节码生成 ==》中间代码生成(Bytecode Generation)
目的:将语法树转换为中间字节码。
- 输入:语法树(或抽象语法树)。
- 输出:字节码(或中间代码)。
工作原理: 字节码生成器根据语法树,生成一组中间代码或字节码,这种字节码是与具体平台无关的,它不依赖于特定的硬件和操作系统。字节码是为后续的解释或编译阶段做准备的。
例如,在 Java 中,源代码会被编译成字节码(.class
文件),然后可以在 Java 虚拟机(JVM)上运行。
记住:字节码生成的任务是将语法树“翻译”成一种平台无关的中间表示,便于后续执行。
4. 解释执行(Interpretation)==》代码优化和目标代码生成
目的:通过解释器直接执行字节码,或将其转换成机器码。
- 输入:字节码(或中间代码)。
- 输出:程序执行的结果。
工作原理: 解释执行器(Interpreter)负责将字节码逐条解释并执行。与传统的编译方式不同,解释执行并不是将程序完全转换成机器代码,而是逐行地解释和执行。
例如,在 Python 中,源代码会被直接解释执行,不需要显式地生成中间字节码文件(虽然 Python 实际上会生成一些中间字节码 .pyc
文件)。