Assignment Week1-1

Created
Sep 5, 2024 03:13 AM
姓名: 罗孝俊 学号:22371094

Textbook P21

  1. 源程序:由高级语言或中间语言编写的处理系统的输入程序
    1. 目标程序:源程序经过翻译程序变换为的能在计算机上执行的程序
      翻译程序:将源程序变换为语义等价的目标程序
      汇编程序:将编译生成的中间程序变换为语义等价的目标程序的程序
      编译程序:将源程序变换为语义等价的目标程序或者中间语言程序
      解释程序:能对编译得到的中间语言进行解释执行的程序(有时对源语言的代码也能直接解释执行)
      遍:翻译程序对源程序扫描一次得到的
  1. 词法分析程序:对源程序的字符序列转换为token序列
    1. 语法分析程序:分析token序列,生成抽象语法树,以描述源代码结构
      语义分析、生成中间代码程序:分析源代码的语义正确性,例如类型判断、作用域解析等,然后生成中间代码
      代码优化程序:优化中间代码的逻辑,使其转换后的目标代码的执行速度更快
      目标代码生成程序:生成具体平台的目标代码(机器码或者字节码)
      符号表管理:符号表是保存每个标识符及其属性信息的数据结构,可由于语义分析
      出错处理:监测处理编译的每个阶段源程序的错误
  1. 前端:与源代码和中间代码相关的编译过程
    1. 后端:与目标代码相关的编译过程
      好处:对编译过程解耦,使得源程序→中间代码的工作与中间代码→目标代码的工作相互独立
  1. C++
      • 支持面向对象编程、泛型编程和函数式编程
      • 允许直接操作内存,支持手动内存管理
      • 编译型
      C#
      • 支持面向对象编程、泛型编程和函数式编程
      • 支持垃圾回收机制,简化内存管理
      • 强类型语言,内置对多线程编程的支持
      • 编译解释型(编译成CIL后再通过CLR解释执行或者JIT即使编译为机器码)
      JavaScript
      • 轻量级、解释型语言
      • 动态类型语言
      • 基于原型的面向对象编程语言
      • 解释型语言:通过浏览器或Node.js的引擎解释执行
      TypeScript
      • Javascript的超集,增加了静态类型和类型检查功能
      • 编译解释型语言:编译成JavaScript后再解释执行
      Java
      • 强类型语言,支持面向对象编程,跨平台
      • 自动内存管理
      • 支持多线程编程和网络编程
      • 生态系统强大,拥有丰富第三方库和框架
      • 编译解释型:编译成字节码,再通过JVM解释执行
 

选题一

以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 会进行最后的垃圾回收并释放所有已分配的内存。
  • 程序退出时,系统资源也会被自动释放。