姓名: 罗孝俊 学号:22371094
Textbook P21
- 源程序:由高级语言或中间语言编写的处理系统的输入程序
目标程序:源程序经过翻译程序变换为的能在计算机上执行的程序
翻译程序:将源程序变换为语义等价的目标程序
汇编程序:将编译生成的中间程序变换为语义等价的目标程序的程序
编译程序:将源程序变换为语义等价的目标程序或者中间语言程序
解释程序:能对编译得到的中间语言进行解释执行的程序(有时对源语言的代码也能直接解释执行)
遍:翻译程序对源程序扫描一次得到的
- 词法分析程序:对源程序的字符序列转换为token序列
语法分析程序:分析token序列,生成抽象语法树,以描述源代码结构
语义分析、生成中间代码程序:分析源代码的语义正确性,例如类型判断、作用域解析等,然后生成中间代码
代码优化程序:优化中间代码的逻辑,使其转换后的目标代码的执行速度更快
目标代码生成程序:生成具体平台的目标代码(机器码或者字节码)
符号表管理:符号表是保存每个标识符及其属性信息的数据结构,可由于语义分析
出错处理:监测处理编译的每个阶段源程序的错误
- 前端:与源代码和中间代码相关的编译过程
后端:与目标代码相关的编译过程
好处:对编译过程解耦,使得源程序→中间代码的工作与中间代码→目标代码的工作相互独立
- C++
- 支持面向对象编程、泛型编程和函数式编程
- 允许直接操作内存,支持手动内存管理
- 编译型
- 支持面向对象编程、泛型编程和函数式编程
- 支持垃圾回收机制,简化内存管理
- 强类型语言,内置对多线程编程的支持
- 编译解释型(编译成CIL后再通过CLR解释执行或者JIT即使编译为机器码)
- 轻量级、解释型语言
- 动态类型语言
- 基于原型的面向对象编程语言
- 解释型语言:通过浏览器或Node.js的引擎解释执行
- Javascript的超集,增加了静态类型和类型检查功能
- 编译解释型语言:编译成JavaScript后再解释执行
- 强类型语言,支持面向对象编程,跨平台
- 自动内存管理
- 支持多线程编程和网络编程
- 生态系统强大,拥有丰富第三方库和框架
- 编译解释型:编译成字节码,再通过JVM解释执行
C#
JavaScript
TypeScript
Java
选题一
以C#为例
C# 程序从编写到执行的过程
C# 程序的执行过程包括以下几个阶段:源代码 -> 编译 -> 中间语言(IL)生成 -> JIT 编译 -> 运行。
1. 编译过程(C# -> IL):
- C# 的源代码通过 C# 编译器(如 Roslyn)编译为中间语言(IL,Intermediate Language),生成
.exe或.dll文件。 - 在C#中,DLL(Dynamic Link Library)文件是一种可重用的代码库,它包含了已编译的函数、类、数据和资源,可以被多个应用程序共享和重用
- IL 是一种面向栈的低级语言(依赖栈存储和执行数据结构),专为 .NET CLR 设计。它不是特定于某一平台的机器语言,而是可以跨平台执行的语言。
- 编译器同时生成程序的元数据(metadata),包含关于程序结构的信息(如类型、方法、继承关系等)。
3. 执行过程(IL -> JIT 编译):
- 当程序运行时,.NET CLR(公共语言运行时) 会加载生成的 IL 代码,并将其交给 Just-In-Time(JIT)编译器。
- JIT 编译器会在运行时将 IL 转换为目标平台的机器码。这个过程可以按需编译,即当一个方法第一次被调用时,JIT 才会将其编译为机器码。
- 通过 JIT 编译,C# 能够在不同平台上运行,CLR 能够将 IL 编译为适合当前平台的机器指令。
4. CLR 执行与托管代码:
- CLR 提供了 C# 程序运行时的支持,它不仅负责 IL 到机器码的编译,还负责管理程序的生命周期、内存分配和回收、安全性检查、线程管理等。
- 托管代码意味着程序运行时,CLR 会接管很多底层任务,包括:
- 内存管理:自动进行垃圾回收,释放不再使用的对象。
- 异常处理:通过 CLR 的异常机制来捕获和处理运行时异常。
- 类型安全:确保运行时类型与编译时类型一致,防止类型不匹配。
5. 垃圾回收(Garbage Collection):
- C# 的垃圾回收器(GC)在后台运行,自动释放不再使用的对象。
- GC 会定期扫描堆内存,标记不再被引用的对象并释放其占用的内存。这避免了手动内存管理的复杂性,也降低了内存泄漏的风险。
6. 执行结束与资源回收:
- 当程序执行完毕后,CLR 会进行最后的垃圾回收并释放所有已分配的内存。
- 程序退出时,系统资源也会被自动释放。