题目1
请从编译功能的角度简要说明 JDK 与 JRE 的主要区别。
· 如果我们只有一个.java 源文件,要运行该程序,最少需要安装的是 JDK 还是 JRE?请说明理由;
· 如果我们只有一个已经编译好的 .class 字节码文件,最少需要安装的是 JDK 还是 JRE?请说明理由。
· 结合上述问题与前置课程知识,思考C++/Golang/Java三种语言在编译开销与运行性能上的取舍。
(1)从编译功能的角度来看,JDK与JRE的主要区别在于:
JDK包含 JRE + 编译器 javac + 调试工具等,既能编译源代码,也能运行字节码。
JRE只包含运行环境(JVM + 核心类库),只能运行字节码,不能编译源代码。
(2)如果我们只有一个.java 源文件,则需要先编译为 .class字节码文件才能运行。编译器在JDK中才有,JRE没有,因此最少需要安装JDK。
(3)如果我们只有一个已经编译好的 .class 字节码文件,则无需编译可直接运行,而JRE可以运行字节码,因此最少需要安装JRE。
(4)C++/Golang/Java三种语言在编译开销与运行性能上的取舍:
C++:编译为本地机器码,编译时间较长,生成的可执行文件大且依赖平台。
优点:启动快,运行性能极高。
缺点:跨平台性差,开发周期中频繁修改→重新编译→耗时大。
Golang:编译为本地可执行文件,但编译器设计追求快速。
优点:编译快、部署方便(单一可执行文件),运行性能接近 C++。
缺点:相比 Java 缺少成熟的虚拟机级优化(如 JIT),长时间运行性能优化略逊。
Java:先编译为 .class 字节码,再由 JVM 解释/即时编译(JIT) 运行。
优点:跨平台性强(一次编译,到处运行),JIT 能在运行期优化热点代码,长期性能可接近 C++。
缺点:首次运行时需要类加载 + JIT,启动速度较慢,编译开销分布在运行期。
综合取舍:
C++:编译慢、运行快 → 适合性能极限要求(如游戏引擎、系统软件)。
Go:编译快、运行快 → 适合服务端开发,快速迭代和部署。
Java:编译适中、运行性能动态优化 → 适合跨平台、大型系统、长期运行的服务。
题目2
简要描述深度学习框架(以PyTorch为例)的编译流程,并思考其与传统程序的编译结果与优化目标相比,有哪些相同点与不同点?
编译结果
相同点:
①都会生成可执行的目标代码(或库),供运行时调用。
②都需要经过中间表示(IR)和优化步骤。
不同点
传统程序:结果是固定的二进制文件/可执行程序,逻辑确定。
深度学习框架:结果可能是动态库 + JIT/AOT 生成的特定算子代码,运行时仍可变化和优化。
优化目标
相同点
①都追求高效执行和资源利用。
②都会使用常见的优化手段(如常量折叠、循环展开、内联)。
不同点
传统程序:优化重点在于指令执行效率、寄存器分配、分支预测、整体运行时间与代码体积。
深度学习框架:优化重点在于并行计算效率、算子融合、内存/显存带宽利用率、硬件特化(CPU/GPU/TPU)。
题目3
给定表达式a = 3 + 4 * 2,仿照教材图1.4画出此表达式的语法树。

214

被折叠的 条评论
为什么被折叠?



