Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

编译原理-笔记

概述

阅读一下龙书🐲。能增加计算机基础知识。

第一章 引论

定义一门语言的规则,按照规则编写代码,将代码翻译成机器能运行的程序叫做编译器(compiler)。研究编译器的编写将涉及到程序设计语言计算机体系结构形式语言理论算法软件工程

介绍内容:

  • 语言翻译器的不同形式;
  • 在高层次上论述一个典型编译器的结构;
  • 程序设计语言和硬件体系结构的发展趋势;这些趋势将影响编译器的形式。
  • 介绍关于编译器设计和计算机科学理论的关系的一些事实,并给出编译技术在编译领域之外的应用。
  • 简单论述论述研究编译器时用到的重要程序设计语言概念。

语言处理器

编译器就是阅读某种语言(在阅读过程中能检查语法是否正确),并且翻译成等价的目标语言的程序。

flowchart LR
    A["源代码"] --- B[编译器] --- C["目标程序"]

Figure 1-1 编译器

目标程序就是机器语言程序,用户就可以直接调用。

flowchart LR
    A["输入"] --- B[目标程序] --- C["输出"]

Figure 1-2 编译器

stateDiagram-v2
 Idle --> Running : 用户点击开始按钮 
 Running --> Paused : 收到暂停指令
 Paused --> Running : 继续执行
 Running --> Finished : 任务完成

Figure 1-2 状态机
解释器(interpreter)也是语言处理器。不会翻译生成目标程序。解释器直接用用户提供的输入执行源代码中的指定的操作

flowchart LR
	A[源代码]
	B[输入]
	C[解释器]
	D[输出]
	A --> C
	B --> C
	C --> D

Figure 1-3 一个解释器

graph TD
    A[expr] --> B1[expr1]
    A --> B2(➕)
    A --> B3[term]
    A --> B4["{print(➕)}"]
	B1 --> C1[expr2]

Figure 2-14 把9-5+2翻译成95-2+的语义动作

  • 在将用户输入加工成输出处理过程,编译器产生的目标程序比解释器快很多。
  • 解释器的错误诊断效果要比编译器更好。(解释器是逐行执行源代码)

java程序是结合了编译、解释两个过程。

flowchart LR

    %% ---------- 上半部分:纵向 TB ----------
    subgraph PART1[翻译阶段]
        direction TB
        A[源代码]
        B[翻译器]
        C[中间程序]
        A --> B --> C
    end

    %% ---------- 下半部分:横向 LR ----------
    subgraph PART2[执行阶段]
        direction LR
        D[输入]
        E[虚拟机]
        F[输出]
        D --> E --> F
    end

    %% ---------- 上下连接 ----------
    C --> E

Figure 1-4 一个混合编译器

flowchart TB
	linkStyle default corners 90
	
    A[源代码
Source Code]     B[词法分析
Lexical Analysis]     C[语法分析
Syntax Analysis]     D[语义分析
Semantic Analysis]     E[中间代码生成
Intermediate Code]     F[优化
Optimization]     G[目标代码生成
Target Code Generation]     H[可执行程序
Executable Program]     A --> B --> C --> D --> E --> F --> G --> H

Figure 1-4 一个语言处理系统

第二章 一个简单的语法制导翻译器

2.1 引言

一个语言的语法(syntax)描述了该语言的程序都正确形式;而该语言的语义(seantics)则定了程序的含义,即每个程序在运行时做什么事情。将会在 2.2 语法定义 给出广泛使用的表示方法来描述语法(synta),这个方法就是上下文无关文法或者BNF(Backus-Naur范式)。用现有的语义表示方法来描述一个语言的语义的难度大于描述语言的语法的难度。

💡人去描述语义非常困难,而且用BNF去描述也是非常困难。所以这里提出了新的工具来描述。

flowchart TB

    %% 节点
    A[源代码
Source Code] B[词法分析
Lexer] C[语法分析
Parser / AST] D[符号表
Symbol Table] E[代码生成器
Code Generator] F[目标代码
Output Code] %% 主流程 A --> B --> C --> E --> F %% 符号表的关联 C -->|定义/查询符号| D E -->|读取符号信息| D

2.2 语法定义