软件技术基础

绪论

  • 软件项目管理

  • 软件逻辑设计

  • 软件编译原理

  • 软件运行环境

  • 计算机问题:输入到对应输出的一个数学功能;每次同样的输入计算机给出同样的输出;问题定义时需要给出对计算机解决问题时所能用的资源的规定,比如说运行时间、内存等

计算机软件开发过程的六个步骤(了解)
  • 问题的理解:清楚问题的输入、要求和输出;
  • 算法设计:包括软件架构设计、模块分解、选择具体算法策略、用适当的方式描述和逐步细化算法步骤;
  • 数据结构设计:一方面要选择或设计能有效表示和存储应用问题中所涉及的数据对象的数据结构,同时还要选择或设计能支持算法策略实现的数据结构;
  • 算法分析:发现有改进完善之处,返回第二步,重新选择或设计算法与数据结构;

(至此为软件逻辑设计)

  • 程序设计:设计具体的数据存储访问方案、数据结构实现细节、基于某种操作系统设计程序实现细节,在计算机上调试和运行程序。
  • 程序实现:用某种计算机程序设计语言,定义数据结构、数据存储、基于某种操作系统编写实现算法的代码,编译代码并在计算机上调试和运行程序,并不断优化程序设计。

(至此为软件程序设计:运行平台,数据储存,程序编译)

  • 数据结构的作用:存放要处理的数据,实现算法策略
  • 杂乱的数据不能表达和交流信息
  • 数据之间是有联系的
  • 数据之间是有结构的(线树图)
  • 算法设计就是要研究各类数据结构上的各种运算方法,从而解决计算问题。(算法)
  • 程序架构:如何在操作系统上开发软件?操作系统具备什么功能?程序对操作系统的依耐性?采用什么样的程序架构?
操作系统的主要功能(了解)
  • 操作系统是一组控制和管理计算机硬件和软件资源,合理地对各类作业进行调度,以及方便用户使用的程序的集合。

  • 处理机管理:按照一定的算法把处理机分配给进程(线程),并对其进行有效的管理和控制。(进程管理:控制、调度、同步、通信)

    • 进程控制:为作业创建进程、撤消已结束的进程,以及控制进程在运行过程中的状态转换。
    • 进程调度:操作系统内的进程运行需经调度才能执行完成,即把CPU分配给哪个进程使之运行。
    • 进程同步:进程同步的主要任务是为多个进程的运行进行协调。
      • 进程同步的两种协调方式:进程互斥方式,这是指诸进程(线程)在对临界资源进行访问时,应采用互斥方式;进程同步方式,指进程相互合作去完成共同的任务时,诸进程之间的协调
    • 进程通信:进程是指进程之间的信息交换。有机器内与机器间
  • 存储器管理:为多道程序的运行提供良好的环境,方便用户使用存储器,提高存储器的利用率以及能从逻辑上扩充内存。

    • 内存分配:为每个作业分配内存空间
      • 内存分配方式:静态分配方式,每个作业运行之前分配好内存空间,在作业的整个运行期间不再改变;动态分配方式中,每个作业在运行前或运行中,均可申请新的附加内存空间,以适应程序和数据的动态增涨。
    • 内存保护:确保每道用户程序都只在自己的内存空间内运行,彼此互不干扰。
      • 内存保护的实现方式:设置两个界限寄存器,越界检查都由硬件实现。
    • 内存映射:地址空间 ——目标程序或装入程序限定的空间,称为“地址空间”。单元的编号称为逻辑地址,又称为相对地址;内存空间——由内存中的一系列单元所限定的地址范围称为“内存空间”,其中的地址称为“物理地址”;地址映射——运行时,将地址空间中的逻辑地址转换为内存空间中与之对应的物理地址,称为地址映射 。
    • 内存扩充:借助于虚拟存储技术从逻辑上去扩充内存容量,使用户所感觉到的内存容量比实际内存容量大得多间。
      • 扩充内存必须具有内存扩充机制
        • 请求调入功能。在程序运行过程中,若所需的程序和数据尚未装入内存,可由OS从磁盘中将所需部分调入内存,继续运行。
        • 置换功能。将内存中的一部分暂时不用的程序和数据调出到磁盘上,然后再将所需调入的部分装入内存。
  • 设备管理:完成用户进程提出的I/O请求;为用户进程分配其所需的I/O设备;提高CPU和I/O设备的利用率;提高I/O速度;方便用户使用I/O设备。

    • 缓冲:
      • 有效地缓和CPU和I/O设备速度不匹配的矛盾 ,提高CPU的利用率。
      • 对于不同的系统,可以采用不同的缓冲区机制。
  • 设备分配

    • 设备分配的基本任务,是根据用户进程的I/O请求,按照某种设备分配策略,为之分配其所需的设备。
    • 为了实现设备分配,系统中应设置设备控制表、控制器控制表等数据结构,用于记录设备及控制器的标识符和状态,以供进行设备分配时参考。
    • 不同的设备类型(独占、共享)而采用不同的设备分配方式。
  • 设备处理

    • 设备处理程序又称为设备驱动程序。
    • 设备处理其基本任务:是用于实现CPU和设备控制器之间的通信,即由CPU向设备控制器发出I/O命令,要求它完成指定的I/O操作;反之由CPU接收从控制器发来的中断请求,并给予迅速的响应和相应的处理。
    • 处理过程 :检查请求的合法性→设备空闲否?→向控制器发I/O命令→启动I/O执行。
  • 文件管理:是对用户文件和系统文件进行管理,以方便用户使用,并保证文件的安全性。

    • 存储:对诸多文件及文件的存储空间,实施统一的管理。基于某种数据结构对存储空间进行分配和回收的功能。
    • 组织:为每个文件建立目录项,并对众多的目录项加以有效的组织与管理,以实现按名存取等功能。
    • 文件读/写管理:根据用户的请求,从外存中读取数据或将数据写入外存。
    • 文件保护:防止未经核准的用户存取文件、防止以不正确的方式使用文件
  • 用户接口:提供友好的用户接口以方便用户使用,系统调用是用户程序取得操作系统服务的唯一途径

    • 图形用户接口(GUI, Graphic User Interface )
      • 采用图形化的操作界面,用非常容易识别的各种图标(icon)来将系统的各项功能、各种应用程序和文件,直观、逼真地表示出来。用户可用鼠标或通过菜单和对话框,来完成对应用程序和文件的操作 。
    • 命令接口:用户可通过该接口向作业发出命令以控制作业的运行。
    • 命令接口分类
      • 联机用户接口:这是为联机用户提供的,它由一组键盘操作命令及命令解释程序所组成。
      • 脱机用户接口:用户用JCL把需要对作业进行的控制和干预,事先写在作业说明书上,然后将作业连同作业说明书一起提供给系统。当系统调度到该作业运行时,再调用命令解释程序,对作业说明书上的命令,逐条地解释执行。
      • 系统调用接口:该接口是为用户程序在执行中访问系统资源而设置的,是用户程序取得操作系统服务的唯一途径。它是由一组系统调用组成,每一个系统调用都是一个能完成特定功能的子程序,每当应用程序要求OS提供某种服务(功能)时,便调用具有相应功能的系统调用。不同的系统其调用形式不同。
软件程序编译(了解)
  • 程序需要编译成计算机能理解的代码才能在操作系统上运行
  • 操作系统依赖的程序编译方式:输入的是用高级语言书写的源程序,输出的是用机器语言表示的目标程序
    • 翻译程序有操作系统依赖库
  • 不依赖操作系统的程序编译方式:跨平台开发
    • 输入的是用高级语言书写的源程序;编译只编译成中间语言;中间语言可以在语言的虚拟机上执行。虚拟机充当“翻译官”的角色,不同的平台虚拟机不同。(平台这里指的是操作系统)
  • 源语言、工具语言、目标语言;源程序、编译程序、目标程序
    关系图
  • 冯.诺依曼语言体系的特点:数据或指令以二进制形式存储;“存储程序”的工作方式;程序顺序执行;存储器的内容可以被修改
数据库管理系统(了解)
  • 数据结构确定后,软件的主要工作之一:管理操作结构化的数据
  • 手工管理->文件系统->数据库系统
    • 数据能为多用户共享;数据冗余度较小;可以交互方式或程序方式操作;
    • 问题:异地共享一处数据,容易造成网络通信”堵塞”
  • 分布式数据库DDBS

第二单元

  • 线性表的逻辑存储结构(掌握)

    • 按顺序存储
  • 线性表的顺序和链式存储结构(掌握)

    • 顺序存储结构:地址连续
    • 链式存储结构:地址随机
  • 重点(掌握)两种存储结构的插入删除运算,两种存储结构的优缺点

  • 能运用线性表解决软件应用问题(掌握)

  • 掌握算法复杂度渐进分析方法,最常用的算法复杂度关系式(掌握)
    在这里插入图片描述 在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 参考求解2-4 算法复杂度分析PPT上的例题

  • 掌握分治递归算法思想(了解)

  • 能用分治算法求解排序问题,时间复杂度。简单的插入、交换、选择排序时间复杂度(掌握)

  • 掌握树的各种基本概念

    • 结点的度:拥有所有的子树的个数称为该结点的度
  • 重点掌握二叉树、满二叉树、完全二叉树的定义

    • 不存在度大于2的结点、有序树
    • 满二叉树:深度为k,且有2^k-1个结点的二叉树
    • 完全二叉树:深度为k,结点数为n的二叉树,当且仅当每个结点的编号都与相同深度的满二叉树中从1到n的结点一一对应时,称为完全二叉树。
      在这里插入图片描述
  • 重点掌握二叉树的存储结构、二叉树的遍历递归遍历和层次遍历

    • 先序遍历:先访问根结点,然后分别先序遍历左子树、右子树
    • 中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树
    • 后序遍历:先后序遍历左、右子树,然后访问根结点
    • 层次遍历:从上到下、从左到右访问各结点
  • 重点掌握树的存储结构(掌握)

  • 给定先序和中序遍历恢复二叉树(掌握)

  • 图的定义(了解)

    • 二叉排序树(BST)
  • 图的存储结构,以及两种存储结构的适应性和时间复杂度(掌握)

  • 图的深度和广度优先遍历

  • 贪心算法的思想,能够运用贪心算法设计思想设计算法解决计算问题,活动安排问题(掌握)

    • 局部最优,可能不是总体最优
  • 运用贪心算法求解单源最短路径(Dijkstra方法),以及时间复杂度(掌握)

第三单元
  • 进程的定义(掌握)
    • 引入进程的目的:使多道程序能够正确地并发执行,以保证程序运行结果的可再现性。
    • 典型的进程定义:
      • 一个正在执行中的程序。
      • 一个正在计算机上执行的程序实例。
      • 能分配给处理器并由处理器执行的实体。
      • 一个具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集。
      • 可并发执行的程序在一个数据集合上的运行过程。
    • 进程的基本特征
      • 动态性:本质特性;一个正在计算机上执行的程序实例,存在生命周期
      • 并发性:重要特性;任何进程都可以同其他进程一起向前推进
      • 独立性:各进程的地址空间相互独立,除非采用进程间通信手段
      • 异步性:按各自独立的、不可预知的速度向前推进
      • 结构性:进程=进程控制块(PCB)+程序段+数据段
    • 进程特点:
      • 资源所有权:一个进程包括一个保存进程映像的虚地址空间,拥有对资源的控制或所有权。
      • 调度/执行的基本单位:一个具有状态和优先级,可被被操作系统调度并分派的实体。
    • 进程与程序
      • 一个正在计算机上执行的程序实例
      • 进程=进程控制块+程序段+数据段
      • 引入进程的目的是使多道程序能够正确地并发执行
      • 程序是静态实体,进程具有动态性
      • 进程与程序之间不存在一一对应关系
  • 进程的三、五状态转换模型,重点掌握进行的挂起状态,挂起原因,阻塞与挂起的区别(掌握)
    • 进程的轨迹:执行指令序列,用于描述单个进程的行为
    • 每个进程仅允许最多连续执行6个指令周期,之后被中断(避免独占)
    • 进程的三种基本状态
      • 就绪状态:当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行过程。
      • 执行状态:进程已获得CPU,其程序正在执行。
      • 阻塞状态:正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,把这种暂停状态称为阻塞状态,有时也称为等待状态。
        三状态变化
    • 进程的五种状态
      • 执行状态、阻塞状态、就绪状态
      • 新建状态: OS 已完成为创建一进程所必要的工作;已构造了进程标识符;已创建了管理进程所需的表格;但还没有允许执行该进程 (尚未同意);因为资源有限,OS所需的关于该进程的信息保存在主存中的进程表中,但进程自身还未进入主存,也没有为与这个程序相关的数据分配空间,程序保留在辅存中。
      • 终止状态: 它不再有执行资格; 表格和其它信息暂时保留
        五状态
    • 挂起状态:内存紧张时,无就绪进程,处理机空闲(I/O操作速度远低于CPU计算速度,导致所有进程阻塞);进程被交换到外存,状态可能变为挂起状态
      • 对换技术(Swapping):内存中分没有就绪进程或内存空间非常紧张时,系统将一个或多个进程的全部或部分程序和数据从内存中换出到磁盘,以腾出部分内存空间。
      • 挂起状态:使执行的进程暂停执行,静止下来,不再参与CPU的竞争,我们把这种静止状态称为挂起状态。
      • 进程挂起的原因:进程全部阻塞,处理机空闲;系统负荷过重,内存空间紧张;操作系统的需要,操作系统可能需要挂起后台进程或一些服务进程,或某些可能导致系统故障的进程;终端用户的请求;父进程请求
      • 被挂起进程的特征:不能立即执行;挂起条件独立于阻塞条件;使之挂起的进程:自身、OS、父进程;激活挂起进程的进程:实施挂起操作的进程
      • 阻塞与挂起:阻塞与否:进程是否等待事件;挂起与否:进程是否被换出内存
      • 四种状态组合:
        • 就绪:进程在内存,准备执行
        • 阻塞:进程在内存,等待事件
        • 就绪/挂起:进程在外存,只要调入内存并获得CPU即可执行
        • 阻塞/挂起:进程在外存,等待事件
          状态组合
  • 进程的构成与PCB(了解)
    • 进程的构成(进程映像):程序段+数据段+进程控制块(PCB)
    • 进程控制块的作用:进程存在的唯一标志;PCB(process control block)常驻内存
    • 进程控制块中的信息:
      • 进程标示符:唯一地标识一个进程
        • 内部标识符:操作系统为每个进程赋予的一个唯一整数,便于系统控制
        • 外部标识符:由创建者提供,通常是由字母、数字组成,往往是由用户(进程)在访问该进程时使用。
      • 处理机状态信息:主要是由处理器的各种寄存器中的内容组成的
        • 通用寄存器(用户可视寄存器):暂存信息
        • 指令计数器: 要访问的下一条指令的地址
        • 程序状态字PSW:状态信息,如条件码、执行方式、中断屏蔽标志等
        • 用户栈指针:存放过程和系统调用参数及调用地址
      • 进程调度信息:与进程调度和进程对换有关的信息
        • 进程状态:指明进程的当前状态
        • 进程优先级:进程使用户理器的优先级别
        • 进程调度所需的其它信息:如进程已等待CPU的时间总和、进程已执行的时间总和等;
        • 事件:指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因。
      • 其它信息:
        • 程序和数据的地址:指进程的程序和数据所在的内存或外存地址
        • 进程同步和通信机制:指实现进程同步和进程通信时必需的机制,如消息队列指针、信号量等。
        • 资源清单:进程所需的全部资源及已经分配到该进程的资源的清单
        • 链接指针
    • PCB的组织方式:索引/链接(单一/多级,相同状态)
  • 能运行Fork()创建进程(了解)
    • fork(): 创建一个新进程
      • 创建一个新进程:pid = fork()
      • 父进程和子进程均在下一条语句上继续运行;父、子进程的fork返回值不同
        • 在子进程中返回时,pid为0;
        • 在父进程中返回时,pid为所创建的子进程的标识。
      • 除了子进程标识符和其PCB结构中的某些特性参数不同之外,子进程是父进程的精确复制
      • 运行是无关的,所以运行顺序也不固定;固定顺序需要进程间通信
    • exec(): 执行一个可执行程序
      • 通过exec()调用族,加载新的程序文本,让fork后的子进程执行一个新的程序
    • exit(): 终止
    • sleep():暂停一段时间
    • pause():暂停并等待信号
    • wait():等待子进程暂停或终止
    • kill(): 发送终止信号到某个或一组进程
    • ptrace() :设置执行断点(breakpoint),允许父进程控制子进程的运行
  • 线程的定义(掌握)
    • 线程的属性:
      • 轻型实体:除了一点必不可少的资源(如线程控制块TCB、程序计数器、寄存器和堆栈)外,线程基本上不拥有系统的资源。
      • 独立调度和分派的基本单位
      • 可并发执行:同一个进程中的多个线程以及不同进程中的多个线程均可并发执行。
      • 共享资源:同一个进程中的各线程可以共享该进程所拥有的全部资源,如进程的地址空间、已打开的文件、定时器和信号量等。
    • 基本操作
      • 派生(Spawn):当系统创建一个进程时,同时也为该进程派生一个线程,同一进程中的线程可以再派生其它线程。
      • 阻塞(Block):当线程需要等待某事件时,它将被阻塞,释放处理机执行其它线程。
      • 解除阻塞(Unblock):当线程的阻塞事件发生,其状态转换为就绪,并插入到就绪队列,等待调度执行。
      • 结束(Finish):线程执行完毕,释放其私有资源。
  • 进程和线程的区别(掌握)
  • 三类线程(用户级、内核级、混合)(掌握)
    • 用户级线程:线程的创建、撤销和切换等操作全部由应用程序完成;操作系统内核不知道线程的存在,仍以进程为调度单位;Infomix支持用户级线程
      • 优点:线程的管理和控制仅在用户级进行,切换开销小;调度更灵活;线程库独立于系统内核
      • 缺点:用户级线程中的系统调用常常会引起线程及整个进程阻塞,削弱了线程的并发性;一个多线程应用程序不能利用多处理技术
    • 内核级线程:线程的创建、撤销和切换等操作由系统内核完成;操作系统以线程为调度单位;Windows 2000/XP、Linux和OS/2等操作系统采用了内核级线程技术
      • 优点:内核可以同时把同一个进程的多个线程调度到多个处理器;如果进程中的一个线程被阻塞(包括页面故障),内核可以调度同一进程中的其他线程;内核例程也可以是多线程的
      • 缺点:同一进程中线程切换需在内核中完成,开销大;在内核中创建和撤销线程的代价大
    • 混合线程:线程的创建、撤销、调度和同步等操作在用户级应用程序中完成;多个用户级线程被影射到一个或较少的某些内核级线程;Solaris操作系统采用了混合线程模式
  • 竞争临界资源引起的问题和互斥的条件(掌握)
    • 资源共享:互斥;进程合作:同步
    • 进程同步:使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性
    • 临界资源(Critical Resouce ):必须互斥使用的资源为临界资源。
    • 临界区(critical section):访问临界资源的那段代码称为临界区
    • 竞争临界资源引起的问题——忙等、饥饿和死锁
      在这里插入图片描述
    • 临界区使用原则(互斥条件):空闲让进,忙则等待,有限等待,让权等待
  • 重点掌握信号量方法,运用信号量P,V进行互斥与同步,解决生产者消费者问题(掌握)
    • 软件方法:由进程通过执行相应的程序指令,实现与其他进程的互斥与同步。难以实现且开销大。
    • 硬件方法:通过屏蔽中断(单CPU)或采用专门的机器指令控制互斥与同步。硬件约束条件强且可能导致进程饥饿与死锁现象。
    • 信号量基本原理:
      • 两个或多个进程可以通过传递信号进行合作,可以迫使进程在某个位置暂时停止执行(阻塞等待),直到它收到一个可以“向前推进”的信号(被唤醒)。
      • 将实现信号灯作用的变量称为信号量,常定义为记录型变量s,其中一个域为整型,另一个域为队列,其元素为等待该信号量的阻塞进程(通常为FIFO)。
    • 信号量的两个原子操作:wait(s)和signal(s),有时也称作P(s)和V(s)
      P与V
      • s.count > 0表示目前临界资源的可用数量,即还可执行wait(s)而不会阻塞的进程数。每执行一次wait(s)操作,意味着请求分配一个单位的资源。
      • s.count ≤ 0表示已无可用的临界资源,请求该资源的进程被阻塞。此时,s.count的绝对值等于该信号量阻塞队列中的等待进程数。
      • 执行一次signal操作,就意味着释放一个单位的资源。若s.count ≤ 0,表示s.queue队列中还有被阻塞的进程,需要唤醒该队列中的第一个进程,将它转移到就绪队列中。
    • wait、signal的应用
      • 进程进入临界区之前,首先执行wait(s)原语,若s.count < 0,则进程调用阻塞原语,将自己阻塞,并插入到s.queue队列排队。
      • 一旦其它某个进程执行了signal(s)原语中的s.count + 1操作后,发现s.count ≤ 0,即阻塞队列中还有被阻塞进程,则调用唤醒原语,把s.queue中第一个进程修改为就绪状态,送就绪队列,准备执行临界区代码
    • 利用信号量实现前驱关系
      前驱关系实现
    • 互斥信号量:用于申请或释放资源的使用权,通常初始化为1
      • 两个并发进程共享临界资源
        • s.count=1,表示无进程进入临界区
        • s.count=0,表示已有一个进程进入临界
        • s.count= - 1,则表示已有一进程正在等待进入临界区
      • n个进程共享临界资源:-(n-1)≤s.count ≤1
    • 资源信号量:用于申请或归还资源,可以初始化为大于1的正整数,表示系统中某类资源的可用个数。
      • 取值范围:依赖于临界资源数量和并发进程数量
    • 信号量的P、V操作可能分散在整个程序中,使用难度高。
    • 管程是一个程序设计语言结构,采用了集中式的进程同步方法,提供了与信号量同样的功能,但更易于控制
    • 组成:局部数据,过程,初始化过程
    • 一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据。
    • 进程只能互斥得使用管程,即当一个进程使用管程时,另一个进程必须等待。当一个进程使用完管程后,它必须释放管程并唤醒等待管程的某一个进程。管程有多种实现方式
    • 使用信号(Hoare)/使用通知和广播
    • 管程的特点
      • 局部数据变量只能被管程的过程访问,任何外部过程都不能访问。
      • 一个进程通过调用管程的一个过程进入管程。
      • 在任何时候,只能有一个进程正在管程执行,调用管程的任何其它进程都被阻塞,以等待管程可用。
    • 生产者,消费者问题
      • 生产者与消费者是一个广义的概念,可以代表一类具有相同属性的进程(如游戏中的金币、血)。
      • 生产者和消费者进程共享一个大小固定的缓冲区。
      • 一个或多个生产者生产数据,并将生产的数据存入缓冲区。
      • 一个或多个消费者从缓冲区中取数据,即消费数据。
    • 假设缓冲区的大小为n(存储单元的个数),它可以被生产者和消费者循环使用
    • 分别设置两个指针in和out,指向生产者将存放数据的存储单元和消费者将取数据的存储单元。
    • 生产者/消费者模型:缓冲区:固定大小;生产者:满则等待,空则填充;消费者:空则等待,有则获取
    • 各个生产者、消费者独立自主向前推进:
      • 指针in和out初始化指向缓冲区的第一个存储单元
      • 生产者通过in指针向存储单元存放数据,一次存放一条数据
      • 每存放一条数据后,in指针向后移一个位置
      • 消费者从缓冲区中逐条取走数据,一次取一条数据,相应的存储单元变为“空”
      • 每取走一条数据后,out指针向后移一个存储单元位置。
    • 生产者/消费者必须互斥:生产者和消费者不能同时读/写一个存储单元;多个生产者不能同时写缓冲区;多个消费者不能同时取缓冲区数据
    • 生产者/消费者必须同步:生产者不能向满缓冲区写数据;消费者也不能在空缓冲区中取数据
  • 进程间通信方式,重点掌握消息传递机制,如何用消息传递机制实现互斥。(掌握)
    • 进程通信(Inter Process Communication, IPC):进程之间的信息交换;共享存储区+消息传递
    • 进程通信方式:
      • 低级通信:以信号、信号量作为通信工具,由于其所交换的信息量少而被归结为低级通信。
      • 高级通信:指用户可直接利用操作系统所提供的一组通信命令, 高效地传送大量数据的一种通信方式。
    • 共享存储区:虚空间A->内存空间->虚空间B
    • 消息传递:格式化消息为单位(消息头+消息体)
    • 消息传递的同步:
      • 当发送进程调用Send原语发送消息时,若没有空闲的消息缓冲区,则发送进程阻塞
      • 当接收进程调用Receive原语接收消息时,如果没有消息可接收,则接收进程阻塞,直到一条消息到达
    • 三种同步方式:
      • 不阻塞发送
        • 如打印服务,每当进程需要打印时,都可以以消息形式发出请求,然后继续执行,无须阻塞等待打印完成。
        • 容易导致消息的无限发送;必须在程序中考虑让接收进程发回应答消息,证实其是否收到消息(增加并发程序的设计难度)
      • 阻塞接收
        • 并发程序设计中常采用该方式。
        • 若消息丢失,或发送进程发送消息之前失败,则接收进程将永久阻塞。
    • 消息传递中的寻址
      • 寻址方式:直接寻址和间接寻址。
        • 若采用直接寻址,send原语中必须指定目标进程的具体标识号
        • receive原语中的source地址有两种处理方法:
          • 接收进程显式地指定发送方进程标识号,这就要求接收进程必须事先清楚将接收哪个进程发来的消息。
          • 接收进程可以不必指定接收哪个进程的消息
      • 间接寻址
        • 采用间接寻址传递消息时,消息不再从发送方直接发送到接收方,而是通过发送进程与接收进程共享的一个数据结构进行中转,该数据结构通常称为邮箱。
        • 发送进程将消息发送到指定的邮箱中,接收进程从邮箱中接收消息。
      • 邮箱:不限制进程数,允许多个发送进程向邮箱发送消息,同时,也允许多个接收进程从邮箱接收消息
      • 利用消息传递实现互斥
        • 互斥:不允许两个或两个以上的进程同时进入临界区
        • 多个并发执行的发送进程和接收进程共享一个邮箱box,且box的初始状态为仅包含一条空消息
        • 采用“不阻塞发送,阻塞接收”方式传递消息
        • 若邮箱中存在一条消息,则允许一个进程进入临界区。
        • 若邮箱为空,则表明有一个进程位于临界区,其它试图进入临界区的进程必须阻塞。
        • 只要保证邮箱中最多只有一条消息,就能保证只允许一个进程进入临界区,从而实现进程互斥使用临界资源。
  • 静态链接,装入时链接,运行时链接的区别,以及各自的优缺点(掌握)
    • 高级语言的源代码转化为进程的3个基本步骤
      • 编译:由编译程序(Compiler)将用户源代码编译成若个目标模块。
      • 链接:由链接程序(Linker)将编译后形成的一组目标模块,以及它们所需要的库函数链接在一起,形成一个完整的装入模块。
      • 装入:由装入程序(Loader)将装入模块装入内存。
    • 名空间:程序中由符号名组成的程序空间
    • 逻辑空间:目标程序占据一定的地址空间,每条指令的地址和指令中要访问的操作数地址统称为逻辑地址
    • 内存空间(物理空间):每个存储单元有可唯一标识的编号,称为内存地址(或物理地址),内存地址的集合即内存空间
    • 地址映射(Mapping):将逻辑地址转换为运行时由机器直接寻址的物理地址
    • 链接方式(链接的时机)
      • 静态链接(Static linking):在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块(又称执行模块),以后不再拆开
        • 问题:相对地址的修改(链接成一个装入模块时修改模块的相对地址)、变换外部引用地址(将每个模块中所用的外部调用符号也都变换为相对地址)
        • 不利于代码共享,不利于模块的独立升级;可能链接一些不会执行的模块,浪费存储空间和处理机时间
      • 装入时动态链接(Load-time Dynamic Linking):目标模块在装入内存时,采用边装入边链接的链接方式
        • 优点:便于各个模块的独立升级、实现模块的共享
        • 缺点:可能链接一些不会执行的模块,浪费存储空间和处理机时间;模块装入后不能移动位置
      • 运行时动态链接(Runtime Dynamic Linking):对某些目标模块的链接,是在程序执行中需要该目标模块时,由操作系统去找到该模块并将之装入内存,随后把它链接到调用者模块上
        • 优点:未被用到的目标模块不会被调入内存和被链接到装入模块上
  • 绝对装入方式和可重定位装入方式的优缺点(了解)
    • 装入的任务:将可装入模块装入内存、地址重定位(将执行文件中的逻辑地址转化为内存物理地址的过程)
    • 装入方式分类(地址映射建立方式)
      • 绝对装入方式:编译程序产生绝对地址的目标代码,程序中的逻辑地址与实际内存地址完全相同;对编译的程序采用符号地址,使用时再将这些符号地址转换为绝对地址
        • 实现简单,无须进行逻辑地址到物理地址的变换
        • 缺点:程序每次必须装入同一内存区;程序员必须事先了解内存的使用情况,根据内存情况确定程序的逻辑地址;不适于多道程序系统
      • 可重定位装入方式:采用相对地址,程序可以装入到内存的任何位置,其逻辑地址与装入内存后的物理地址无直接关系;必须进行重定位,即装入程序根据装入的位置将逻辑地址转换为物理地址。
      • 可重定位(静态重定位)装入方式
      • 运行时重定位(动态重定位)装入方式
第四单元
  • 编译模型、编译的步骤以及每个步骤的任务

    • 翻译:将一种语言编写的程序转换成完全等效的另一种语言编写的程序的过程称为翻译;在计算机中,翻译由一个程序来实现,称为翻译程序

    • 编译:将高级语言程序翻译为低级语言的程序称为编译。

    • 翻译程序与编译程序:翻译是由一个程序来实现的,该程序称为翻译程序(翻译器)

    • 宿主语言:编写编译程序的语言称为宿主语言;

      • 源语言、目标语言、宿主语言通常是不同的语言;
    • 宿主机:运行翻译程序的机器

    • 自驻留:编译程序能生成可供其宿主机执行的机器代码

    • 交叉编译: 编译程序生成的不是宿主机的机器代码,而是别的机器代码

    • 自编译: 编译程序是用源语言写的

    • 编译执行:直接翻译执行

    • 解释执行

      • 解释:不将源程序翻译成目标程序,而是一边分析,一边执行,这种翻译方法称为解释;实现解释的程序,称为解释程序
      • 优缺点:
        • 特别适合于动态语言和交互式环境,便于人机对话
        • 解释器边解释边执行,重复执行的程序需要重复翻译,比编译执行花费更多时间,执行效率低;
    • 编译步骤

      • 词法分析:输入字符串,根据词法规则识别出单词符号
      • 语法分析:根据语法规则,将单词符号构成各类语法单位,并进行语法检查
      • 语义分析:根据语义规则,理解语句功能,进行初步编译
      • 优化:对中间代码进行时间,空间优化,以使代码更有效(原则:程序的等价变换原则)
      • 目标代码生成:生成机器语言程序或汇编语言程序

      实用的编译程序不一定总是分成5个阶段
      目标程序不一定能立即执行,可能还要经过连接、装入等阶段
      编译的各阶段均需要和符号表管理程序、出错处理程序打交道

      • 符号表管理:完成符号表的建立,查找,更新
      • 出错处理:发现、指出、限制
        编译步骤
  • 编译的前端和后端的区分

    • 在现代编译器中,通常将编译过程划分为前端和后端两大部分,分别加以实现
    • 前端和后端通过中间代码连接,可极大的提高编译器设计与实现的效率
    • 前端:主要是与源语言相关的部分;词法、语法分析、语义分析和中间代码生成等
    • 后端:主要是与目标语言相关的部分;包括优化、目标代码生成等
  • 语言的定义,生成(文法)或识别(语法图)

    • 语言=语法(规则)+语义(规则)
    • 语法:用以构造语言(程序)及其成分(语法单位)的规则的集合
      • 字母表:语言允许使用字符的集合,其元素称为字符(终结符:= !)
      • 符号:由字符组成的有限串(字/字符串)
      • 字汇表:由符号组成的集合,其元素称为字(如关键字表 :if,for,𝜖)
      • 词法规则:规定什么样的字符序列可以构成语言的有效符号(单词符号)
      • 语法规则:确定一个符号序列是否为一个句子,并提供句子的结构(什么样的符号序列是合法的 )
      • 语义规则:一组规则,用它可以定义一个程序的意义
        • 描述方法:自然语言描述:存在二义性;形式化方法:操作语义,代数语义
      • 生成定义(通用准确):文法,标识符(非终结符);语言:所有句子的集合
      • 识别定义(直观清晰):语法图
        • 识别原则:若一个终结符序列是合法的;那么,必须从语法图的入口边通过语法图而到达出口边;而且在通过的过程中,恰恰能识别该终结符序列。
        • 语言:语法图能识别的所有终结符序列的集合。称为语言
      • 定义语法单位的意义属于语义问题
    • 语义:用以规定语法正确的语法单位的含义的规则的集合
    • 自然语言,属性文法:三元式、四元式。
    • 语义:定义语言的语法单位的作用和意义的规则组合
  • 上下文无关文法定义,推导与规约,最左推导,最右推导,语法树

    • 上下文无关文法:转化为全VT的字符 上下文无关文法
    • 字母表E构成字符集,连接积
    • 文法是描述语言的语法结构的形式规则, 必须准确,易于理解,且描述能力强
    • 产生式:前者至少有一个非终结符
      • 英文大写字母表示非终结符;小写字母表示终结符;希腊小写字母表示串
    • 粗箭头派生,细箭头是产生式,粗*0至若干步,粗+1至若干步
    • 递归(推导反过程)
    • 最左推导过程:替换最左非终结符
    • 最右推导(规范推导):替换最右非终结符
    • 语法树(推导树):以图的方式表示推导过程
      • 有序标记树
  • 句型和句子,能够用文法生成句子,并画出语法树

    • 只含终结符的句型就是一个句子;一个句子是句型;一个句型不一定是句子
  • 词法分析的功能,词法分析输出形式

    • 功能:扫描源程序的字符串;按照词法规则;识别出单词符号作为输出;对识别过程中发现的词法错误,则输出有关的错误信息
    • 词法分析器:读取源程序,识别单词;过滤注释和空白,将错误消息与源程序的位置关联
    • 与语法分析器:单独一遍/子程序
    • 输出形式:
      • 单词的种类
        • 标识符:用来命名程序中出现的变量、数组、函数、过程、标号等
        • 基本字:也可称关键字或保留字, 如if、while、for、do、goto等
        • 常数:各种类型的常数, 如216、3.14159、TRUE等
        • 运算符:如+、-、*、/等
        • 界符:如;、:、//等
      • 单词的输出形式:二元式
        • 单词类别:区分单词所属的类(整数编码)
        • 单词的属性: 单词的值
      • 单词类别的划分
        • 基本字、运算符、界符:一字一码
          • 基本字:由程序语言定义的具有固定意义的标识符
          • 运算符:如 +,-,*,/等
          • 界符 如 , ;()等,
          • 他们对具体语言个数都是是确定的。
        • 标识符:单列一种,标识符是以字母开头的“字母/数字”串。用来表示各种名字,如变量名,函数名等
        • 常数:按类型分类,常数的类型一般有整型、实型、布尔型、字符型等
  • 词法分析扫描缓冲区结构,什么是超前搜索

    • 词法分析器
      词法分析器的结构

    • 输入缓冲区:源程序->输入缓冲区

    • 预处理程序:取消注解,剔除无用的空白、跳格、回车、换行等

    • 扫描缓冲区:

      • 从输入缓冲区输入固定长度的字符串到另一个缓冲区(扫描缓冲区);
      • 词法分析可以直接在此缓冲区中进行符号识别
      • 扫描缓冲区结构(双缓冲区):
        • 双缓冲区结构:设置左右两个缓冲区,当左缓冲区读完后,新读入的字符存入右缓冲区;反之,存放在左缓冲区;
        • 起点指针(lexeme Begin):用来指示正在扫描的单词的起点;
        • 搜索指针(forward):用于向前搜索,寻找单词的结束;
    • 符号的识别

      • 根据语言规定的词法规则,进行识别;
      • 对不同类型的单词符号,有不同的识别要求;
      • 词法分析技术——超前搜索
        • 为了判定一个单词符号的类别,必须扫描到某一地方,而该单词符号并没有这么长,这种扫描方式叫做“超前搜索”。
        • 双缓冲区及超前搜索例子(E = M*C**2)
        • 每个缓冲区容量为N个字符,‘起点指针’指向当前单词的开始处,‘搜索指针’用于向前搜索,寻找单词的结束,‘搜索指针’前移前需要确定是否达到末尾
        • 如果是,读取N个新字符到另一缓冲区
        • 如果剩余字符不足N个,添加eof字符(或其他不会在源程序中出现的字符)
        • 搜索指针,一直向前扫描,直到发现一个单词 (超前搜索)
        • 单词确定后,‘搜索指针’指向该词素结尾字符
        • 生成单词并记录或返回给语法分析器后, ‘起点指针’指向
          下一个字符。
      • 各种符号识别
        • 基本字的识别
        • 标识符的识别:读到非字母数字
        • 常数的识别:根据常数的格式;大多数常数后都有运算符或界符
        • 运算符的识别:需要超前搜索,如**(是乘号还是乘方?)
        • 界符的识别:需要超前搜索,如/*(是除法还是界符?)
  • 语法分析的两大类别:自下而上和自上而下

    • 语法分析的功能:输入二元式流符号串,输出正确句子的语法树,报告语法错误

      LL/LR,前一个L意味着从左向右,后一个L代表从上到下推导

    • 自上而下的语法分析:

      • 从文法开始符出发,能否找到一个最左推导序列,使得S=>*w ?或者从根结点S开始,能否构造一棵语法树,使得该语法树的叶结点自左至右的连接正好是w
      • 回溯分析法:不确定的分析方法
        • 从文法的开始符号S出发;选取S的候选式进行推导,接着按最左推导进行下去;如果推导失败,再换用其他的候选式;(必然导致回溯)若穷尽所有的候选式都失败,则表明w不是G的句子,w存在语法错语。
        • 可能产生回溯的原因
          • 公共左因子:是指在文法的产生式集合中,某个非终结符的多个候选式具有相同的前缀。
          • 左递归:S → \rightarrow Sa|b,一直推出Saaaa…
          • ϵ \epsilon ϵ产生式:空字符产生
        • 特点
          • 回溯分析法是一种不确定的方法。
          • 使用试探的方法穷举每一种可能,当分析不成功时则回退到适当位置再重新试探其余可能的推导。
          • 穷尽所有可能的推导,仍不成功才能确认输入串不是该文法的句子
        • 回溯分析法的缺陷:
          • 选择候选式进行推导是盲目的
          • 若文法存在左递归,语法分析还可能产生无限循环。
          • 引起时间和空间的大量消耗。
          • 无法指出语法错误的确切位置。
        • 解决办法:
          • 回溯分析法是一种低效的语法分析方法,在实际的编译器中很少使用
          • 针对产生回溯的原因,提出消除回溯的方法
          • 引进确定的语法分析方法——递归下降分析法和预测分析法。
      • 递归下降分析法:确定的分析方法
        • 提取公共左因子 S → S B 1 ∣ S B 2 ∣ . . . ∣ S B n ∣ δ S\rightarrow SB_1 |SB_2 |...|SB_n|\delta SSB1SB2...SBnδ变为 S → S B ∣ δ , B → B 1 ∣ . . . ∣ B n S\rightarrow SB|\delta,B\rightarrow B_1|...|B_n SSBδ,BB1...Bn

        • 左递归消除

          • 直接左递归 S → S a 1 ∣ . . . ∣ S a n ∣ b 1 ∣ . . . ∣ b m S\rightarrow Sa_1 |...|Sa_n|b_1|...|b_m SSa1...Sanb1...bm变为 S → b 1 S ′ ∣ . . . ∣ b n S ′ , S ′ → a 1 S ∣ . . . ∣ a n S ∣ ϵ S\rightarrow b_1S'|...|b_nS',S'\rightarrow a_1S|...|a_nS|\epsilon Sb1S...bnS,Sa1S...anSϵ
          • 间接左递归:转化为直接左递归
          • 自学First集合和Fellow集合构造
        • 递归下降分析(LL)器:没有公共左因子和左递归
          递归下降分析器实例

          • 分析程序由一组递归过程组成
          • 每个过程对应文法的一个非终结符
          • 对相应的产生式的右部进行分析
          • 分析程序称为递归下降分析程序(器),其方法称为递归下降分析法
      • 预测分析法:确定的分析方法
        • 判断条件生成预测分析表,预测分析法由由下推栈、预测分析表和控制程序组成

        • 下推自动机的实现模型,实际预测每个候选式的匹配作用

        • 使用预测分析表,根据如下指导推导过程的进行,并在输入串后加上#做标记

          • 栈顶符号,例如: X
          • 当前输入符号, 例如:a
        • 预测分析表

          • 形式: M { A , a } M\{A,a\} M{A,a}矩阵, A ∈ 𝑉 𝑁 A\in 𝑉_𝑁 AVN a ∈ 𝑉 𝑡 ∪ { # } a\in 𝑉_𝑡∪\{\#\} aVt{#}
          • 内容:A→α:表示采用A→α匹配输入符号a, 或出错标志(空白):表示A不可能匹配a。
          • 目的:记录预测的结论。
            预测分析表实例
        • 分析方法

          • 预测分析器的控制程序根据如下来决定下一步应采取的动作
            • 下推栈的栈顶符号x
            • 当前的输入符号a
            • x=a=#:则符号串和栈均已为空;则输入串ω是该文法的一个合法句子,分析过程结束
            • x=a ≠ \neq =#:栈顶符号与输入符号匹配,则x出栈,输入指针指向下一个符号;这一次匹配成功,继续下一次匹配
            • .若X为非终结符,则查分析表。
              • M [ x , a ] M[x,a] M[xa]中存放 x → α x→α xα,则x出栈,将α串逆序压入栈中(α的前缀处于栈顶位置)。
              • M [ x , a ] M[x,a] M[xa]中为出错标志,则调用出错处理程序error()。
    • 自下而上的语法分析:从输入串出发,寻找归约序列,逐步进行归约,直至开始符号S

      • 基本方法:移进–归约,在移进的过程中,观察栈顶是否形成某个产生式的一个候选。
        • 采用栈,将输入符号移进栈中
        • 如果栈顶(一个或多个符号)形成某个非终结符号的候选式
        • 则进行归约:
          • 将候选式出桟
          • 归约后的非终结符号移进栈
        • 重复进行上述过程,直到输入串扫描结束。
        • 如果栈内只剩下开始符号S,则输入串是文法合法的句子。
      • 关键问题:如何判断栈顶符号串是否形成可归约串?如何进行归约?
        • 当对不同的归约串进行归约,即形成了不同的自下而上语法分析方法。
      • 两种冲突:移进与归约的冲突,归约与归约的冲突
      • 两种方法:算符优先分析法:最左素短语;LR分析法:句柄
        在这里插入图片描述
        在这里插入图片描述

    语法分析与语义分析
    带注释的语法树:语义树(从上至下实现),是无向图
    依赖图:有向图,代表节点间顺序关系,没有循环才正确
    语法制导翻译:一遍扫描,语法分析同时分析语义,自下而上则在归约时直接计算(语义计算本身就需要从下往上)
    自顶向下翻译需要深度优先遍历进行翻译
    状态栈,符号栈,语义栈
    语义子程序:中间代码生成程序

  • 语义值是什么

    • 语义值:赋予每个文法符号以各种不同的“值”:类型,种属,地址或代码等
      • 如果同一文法符号在一个产生式出现多次,使用右下角标区分。
      • 对应每个产生式的语义动作写在产生式后的花括号内
    • 通常,语义子程序是某种中间代码生成程序,随着语法分析的进行,中间代码也逐步生成;事实上,语法制导翻译方法既可以用来生成各种中间代码,也可用来直接产生目标指令,甚至可以用来对输入符号串解释执行
  • 一遍扫描处理法:自上而下顺便分析

  • 语义的LR分析过程和之上而下的分析过程

  • 中间代码:三地址表示法,四元式、三元式、间接三元式

  • 更够用四元式或三元式描述句子的语义

    • 中间代码
      • 编译程序的任务是将源程序翻译成目标程序。
      • 语义分析需要:操作各符号的语义值、完成源程序中各个语句的翻译、将源代码翻译成目标代码。
    • 通常情况下,语义分析生成某种中间代码:由于通用性和优化的考虑,目标代码并不是最终的与硬件相关的汇编代码或机器代码
    • 三地址代码:x:=y op z -> (op,y,z,x)
    • 三元式:序号代表结果,仅有三元:op,arg1,arg2
    • 四元式(临时变量)、后缀式、语法树
    • 在语法分析的过程中,由各个产生式对应的语义子程序对源代码进行翻译(生成中间代码)的方法称为语法制导翻译
    • 语义分析的结果:A:=-B*(C+D)
      语义分析
  • 语义变量和语义函数

    • i.NAME:表示符号 i 对应的变量的名称。
    • E.PLACE:表示符号E对应的变量在符号表中的位置(普通变量)或整数编码(临时变量)。
    • newtemp():生成一个新的临时变量,返回其整数编码。
    • entry(i):在符号表中查找符号 i ,如果存在,则返回它在符号表中的位置。
    • emit (x = y op z) 或emit(RESULT,OPD1,oper,OPD2):
      • 生成一个新的三地址语句,添加到中间代码表的结尾。
      • 指针ip指向中间代码表的结尾,
      • emit将新的三地址语句添加到ip指向的位置,然后ip自动加1,指向新的结尾。
    • error():语义函数,表示出错
  • 说明语句:不产生可执行指令,仅负责填表,将被说明对象的类型及相对存储位置记入各自的符号表中。

  • 说明语句的语义变量及过程:

    • T.type:数据类型
    • T.width:数据宽度,变量需要的内存单元字节数
    • enter:语义过程,根据变量名,将对应的类型和相对地址记入符号表中。
  • 相对位移量/相对存储位置OFFSET,全部变量相对位移量,初值为0,是全局变量(相对于说明语句),用于计算下一个变量相对地址
    说明语句的翻译方案

  • 其他说明语句:

    • 第一种:
      • D→integer namelist│real namelist
      • namelist→namelist,i│i
      • 改写为:
      • S → MD
      • M→ε
      • D→D,i│integer i│real i
    • 第二种:
      • D→namelist :integer | namelist:real
      • namelist→namelist,i | i
      • 要引进namelist.QUEUE来存放变量名
  • 简单赋值语句的翻译

    • 语义变量及过程
      • 表达式结果存放于变量或临时变量
      • 使用E.Place代表存放结果的变量在符号表的位置或临时变量的整数序号
      • 采用变量名或临时变量名表示
      • X.a:文法符X相应属性a,如i.name,E.place
    • 语义变量及过程
      • newtemp( ):语义函数:返回一个可用的临时变量的序号
      • 采用临时变量名代表,表示为t1, t2, …
    • entry(i): 语义函数:对变量 i 查符号表,返回i在符号表中的位置(入口)
      • 采用变量名表示,未查到,返回0 ,表示该变量没有定义,属于语义错误(语义检查)
    • ip:指令指针,初始化为1,也可以是指定的初值。
    • emit(OP,ARG1,ARG2,RESULT) :语义过程产生四元式并填入四元式表中;同时ip:=ip+1(四元式编号增加1)
      • 也可以表示为 emit(RESULT,ARG1,OP,ARG2),分别对应
        • (+,c,d,t2) 四元式
        • t2:=c+d 三地址代码
  • 翻译方案(语义子程序):

  • 类型转换(语义检查)

第五单元
  • 数据库、数据库系统、数据库管理系统
    • 数据库(Database,简称DB)是长期储存在计算机内、有组织的、可共享的大量数据集合

      • 数据按一定的数据模型组织、描述和储存;可为各种用户共享;冗余度较小;数据独立性较高;易扩展
    • 数据库管理系统/DBMS的:一个能够让用户定义、创建和维护数据库以及控制对数据库访问的软件系统

      • DBMS 组成:查询处理器和存储管理器。
        • 查询处理器主要有四部分:DDL编译器、DML 编译器、嵌入式DML的预编译器及查询运行核心程序;
        • 存储管理器主要有四个部分:授权和完整性管理器、事务管理器、文件管理器及缓冲区管理器
      • DBMS功能:数据库定义功能:提供数据定义语言(DDL,Data Define Language)对各级数据模式精确定义。
      • DBMS的功能 : 数据操纵功能:提供对数据库中的数据进行追加、插入、修改、删除、检索等操作。
      • DBMS的功能 :数据库运行控制功能:提供数据控制语言(DCL,Data Control Language)。数据库的恢复、并发控制、完整性控制、安全性控制
      • DBMS的功能 :数据库的维护功能:包括数据库的初始数据的载入、转换功能、数据库的转储功能、数据库的重组织功能和性质监视、分析功能等。
      • DBMS的功能 :数据字典:数据字典(Data Dictionary,记为DD)。DD中存放着数据库三级结构的描述。对于数据库的操作都要通过查阅DD进行
    • 数据库系统(Database System,简称DBS):在计算机系统中引入数据库后的系统构成。在不引起混淆的情况下常简称为数据库

  • 数据库管理体系结构分类
    • 数据库系统是用一种称为“关系”的表来组织数据的
    • 数据库系统:和编译系统一级,高于OS
    • 组成部分:硬件系统、数据库集合、数据库管理系统相关软件、数据库管理员、用户
    • 集中式、客户机/服务器式、并行式、分布式、基于互联网
  • 模式的体系结构:外,概念,内
    • 型(Type):对某一类数据的结构和属性的说明
    • 值(Value):是型的一个具体赋值
    • 模式(Schema):数据库逻辑结构和特征的描述,是型的描述,反映的是数据的结构及其联系,模式是相对稳定的
    • 模式的一个实例(Instance):模式的一个具体值,反映数据库某一时刻的状态,同一个模式可以有很多实例,实例随数据库中的数据的更新而更新
    • 模式(也称概念模式或逻辑模式,数据库的总框架)
      • 数据库中全体数据的逻辑结构和特征的描述
      • 所有用户的公共数据视图,综合了所有用户的需求
      • 一个数据库只有一个模式
    • 模式的地位:是数据库系统模式结构的中间层,与数据的物理存储细节和硬件环境无关,与具体的应用程序、开发工具及高级程序设计语言无关
    • 模式的定义:
      • 数据的逻辑结构(数据项的名字、类型、取值范围等)
      • 数据之间的联系
      • 数据有关的安全性、完整性要求
      • DBMS提供数据定义语言DDL来描述逻辑模式
      • 表结构的定义
    • 外模式(也称子模式、用户模式、视图):数据库用户(包括应用程序员和最终用户)使用的局部数据逻辑结构和特征描述,介于模式与应用之间(多个外模式)
      • 各种不同,使用的程序设计语言都可以不同
    • 内模式(也称存储模式):是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式,一个数据库只有一个内模式
      结构
  • 数据模型
    • 概念模型(CDM):面向现实世界建模,主要用来描述现实世界的概念化结构,与具体DBMS无关
    • 逻辑模型(LDM):面向用户建模,用户从数据库所看到的数据模型
    • 物理模型(PDM):面向具体的DBMS,面向机器,描述数据在存储介质上的组织结构
    • 三要素:数据结构,数据操作,数据的约束条件
  • 关系模型的基本概念,关系操作运算
    • 关系模型:最基本的规范条件(第一范式,1NF):关系的每一个分量必须是一个不可分的数据项,即不能表中有表。
    • 关系模式的集合称为数据库模式,对应的关系实例的集合称为数据库实例
    • 关系(Relation)是笛卡尔积的一个有意义的子集,是一张二维表,存放实体本身的数据与实体之间的联系
    • 元组(Tuple):表中的一行,表示一个实体
    • 属性(Attribute):表中的每一列在关系中称为属性
    • 域(Domain):属性的取值范围称为域
    • 分量(Component):元组中的一个属性值
    • 操作(集合操作):查找(选择、投影、连接、除、并、交、差),更新(插改删)
    • 关系数据约束:数据模型中固有的约束
    • 三类完整性约束
      • 实体完整性:主码不能取空值
      • 参照完整性:通过外码实现,避免孤子记录
      • 用户定义的完整性:各类商业规则
    • 关系数据模型的优点:建立在严格的数学概念的基础上的;数据结构简单、清晰;更高的数据独立性,更好的安全保密性;丰富的完整性
    • 关系数据模型的缺点:对“现实世界”实体的表达能力弱。;存取路径对用户透明,查询效率往往不如非关系数据模型;关系模型只有一些固定的操作集;不能很好的支持业务规则。
  • 主码与候选码
    • 键(Key):关系中能唯一区分不同元组的属性或属性组合,或者称为关键字、码;不能取“空值”:实体完整性规则
    • 候选健(Candidate Key):凡在关系中能够唯一区分确定不同元组的属性或属性组合,称为候选健,关系中能够成为关键字的属性或属性组合可能不是唯一的,包括在候选键中的属性成为主属性
    • 主键(Primary Key,PK):当一个关系中有多个候选健的时候,从中选定一个作为关系的主键;关系中主键是唯一的,每个关系中有且只有一个主键
    • 外键(Foreign Key,FK):关系中某个属性或属性组合并非该关系的键,但却是另一个关系的主键,称此属性或属性组合组合为本关系的外键
    • 笛卡尔积运算,选择运算,投影运算
    • 条件连接( θ \theta θ连接):在两个关系的笛卡尔积上进行的选择运算。
    • 自然连接:从两个关系的广义笛卡儿积中选取在相同属性列B上取值相等的元组,并去掉重复的行
      • 没有公共属性,自然连接就是笛卡尔积。
    • 左连接,右连接
    • 关系代数表达式的优化准则:
      • 提早执行选择运算。
      • 合并笛卡尔积与其后的选择运算为连接运算。
      • 将投影运算与其后的其他运算同时进行,以避免重复扫描关系。
      • 将投影运算和其前后的二目运算结合起来,以避免为去掉某些字段再扫描一遍关系。
      • 执行连接前对关系适当地预处理.就能快速地找到要连接的元组。
      • 存储公共子表达式
  • SQL语法:
    • 数据库、表、数据的相关操作(建立与删除)

    • 增删查改

      • ALTER TABLE 〈基表名〉
        [ ALTER COLUMN <列名> <数据类型>],
        [ ADD <新列名> <数据类型> <约束规则>],
        [ DROP <列名>],
        [ DROP <约束规则>];
      • DROP TABLE <表名> [RESTRICT|CASCADE];
        RESTRICT:拥有表的对象(Check、Foreign Key、视图、触发器、存储过程、函数等)时禁止删除;
        CASCADE:级联删除表的所有对象
        -SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] …
        [INSERT INTO <新表名>]
        FROM <表名或视图名>[, <表名或视图名> ] …
        [ WHERE <条件表达式> ]
        [ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
        [ ORDER BY <列名2> [ ASC|DESC ] ];
        SELECT子句:指定要显示的属性列
        FROM子句:指定查询对象(基本表或视图)
        WHERE子句:指定查询条件
        GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。
        HAVING短语:筛选出只有满足指定条件的组
        ORDER BY子句:对查询结果表按指定列值的升序或降序排序
      • SELECT <查询列表>
        [ INTO <新表名> ]
        FROM <基表1|视图1> [ AS 别名1 ]
        {< LEFT | RIGHT | FULL > [ OUTER ] JOIN}
        <基表2|视图2> [AS 别名2 ]
        ON <连接条件>
      • INSERT INTO <基表名> [(<列名表>)]
        VALUES(<值表>)
      • UPDATE<基表名>
        SET <列名1>=<表达式2>,<列名2>=<表达式2>…
        [WHERE <条件表达式>]
  • 数据库设计理论

五元组(三元组RUF)R(U, D, DOM, F)
R:关系名
U:组成该关系的属性名集合
D:属性组U中属性所来自的域
DOM:属性向域的映象集合
F:属性间数据的依赖关系集合

  • 不好模式造成的问题
    • 数据冗余:浪费存储空间,引起异常。
    • 操作异常:更新异常;删除异常;插入异常
  • 函数依赖,码,模式分解
    • 数据依赖的类型:函数依赖;多值依赖
    • 函数依赖:属性(列)之间的联系;属性之间在语义上的关联特性;两个属性或属性集之间的约束
      • 完全函数依赖:X、Y是某关系不同属性集;不存在X’⊂X,使得 X’→Y成立;
      • 部分函数依赖:X、Y是某关系不同属性集;存在X’⊂X,使得 x’→Y成立;
      • 传递函数依赖:X、Y、Z是某关系不同属性集;如果X→Y, Y→Z, X→Z且不存在Y → X;条件Y → X说明,X和Y不是一一对应;
      • 模式分解:解决函数依赖,冗余等问题
        • 无损连接分解:通过连接被分解后的小表可以获得原始表的内容
  • 范式的概念、如何区分不同的范式,各个范式的规范
    • 范式(Normal Forma,NF)是一种关系的状态,是衡量关系模式的标准。
    • 1NF:每个属性值都是不可再分的原子值,规范化的关系
    • 2NF:每个非主属性(不是组成候选码的属性)完全函数依赖于候选码
      • 2NF分解算法:将关系模式R分解成2NF模式子集
        在这里插入图片描述
    • 3NF:每个非主属性都不传递依赖于R的候选码
      在这里插入图片描述
    • 如果R是3NF模式,那么R也是2NF模式。
    • BCNF:每个属性都不传递依赖于R的候选码
      在这里插入图片描述
    • 关系模式分解一般应具有3个特性:达到BCNF,或3NF;无损分解;保持函数依赖。
    • 表达性、分离性和最小冗余性。
      • 表达性:数据等价和语义等价;即无损分解和保持依赖集
      • 分离性:关系中只存储有直接联系的属性值;清除冗余和异常现象
      • 最小冗余性:模式个数和模式中属性总数应最少;
  • 数据库应用设计方法
    • E-R模型的概念、结构及使用其构造数据库的方法
      • E-R模型:面向问题的概念模型;用简单的图形方式(E-R图)描述显示世界中的数据;E-R图不涉及数据在数据库中的表示和存取方法;非常接近人的思维方式
      • 多值属性:分解/弱实体
    • 数据库设计方法
    • 直观设计方法(手工试凑法):依赖于设计者的经验和技巧,设计质量难以保证。
    • 新奥尔良(New Orleans)设计方法:需求分析、概念设计、逻辑设计和物理设计。
    • 基于实体-关系(E-R)模型的数据库设计方法:在需求分析的基础上,用E-R图构造一个反映现实世界实体之间联系的企业模式转换成基于某一特定的DBMS的概念模式。
    • 3NF设计方法 :在需求分析的基础上,确定数据库模式中的全部属性和属性间的依赖关系,将它们组织在一个单一的关系模式中,然后再分析模式中不符合3NF的约束条件,将其进行投影分解,规范成若干个3NF关系模式的集合
    • 面向对象的数据库设计方法 (ODL):使用面向对象的概念和术语来描述和完成数据库的结构设计,并可方便地转换为面向对象的数据库
    • 用于数据库设计的计算机辅助软件工具(CASE)
    • 数据库设计的各个阶段及主要工作
      • 需求分析阶段:明确系统需要完成何种工作任务
      • 概念设计阶段:数据库概念设计将用户的需求抽象为用户与开发人员都能接受的概念模型,是用户现实需求与数据库产品之间的纽带。
      • 逻辑设计阶段:该阶段把抽象的概念结构进一步转换为可以被具体的DBMS产品所能支持的数据模型。
      • 物理设计阶段:确定的物理存储结构,以及存取方法方法能否满足用户最终的需求。
      • 实现阶段:进行数据库的构建工作。包括针对数据库的应用程序开发和调试,以及现实数据的录入和试运行等基本工作
      • 运行与维护阶段:保证数据库系统的效率,以及根据实际运行情况和用户的需求变动进行调整
    • 数据字典
      • 数据项:记录了数据对象的基本信息,是不可再分的基本数据单位,描述了数据的静态特性
      • 数据结构:反映了数据之间的组合关系,也可以是由多个数据结构的复合。
      • 数据流:是对数据动态特性的描述,表示了数据结构沿着系统的事务和处理过程中的传输流向
      • 数据存储:是在事务和处理过程中,数据所停留和保存过的地方
      • 数据处理过程:仅是对处理相关信息的简要描述

软件开发:

  • 主要:API开发(注意并发性)
  • 定义使用语言,由此设计此法语法分析实现解释程序;用户可以写解释脚本使用解释程序调用API

编译原理

程序设计语言的产生:人机通信,人机交流
程序设计语言的发展:

  • 机器语言 :二进制、机器相关
  • 汇编语言:助记符、机器相关
  • 高级语言:接近自然语言、机器无关
    • 直观、自然、易于理解;易读、易写、易于交流、出版和存档;一般都是独立于机器的,易于移植

汇编程序:输入的是用汇编语言书写的源程序,输出的是用机器语言表示的目标程序
编译程序:输入的是用高级语言书写的源程序,输出的是用机器语言表示的目标程序
三种语言,三种程序

语言发展进程

  • 强制式语言:冯.诺依曼体系
    • .冯.诺依曼体系结构:一个存储器,一个控制器,一个处理器
    • 冯.诺依曼体系的特点
      • 数据或指令以二进制形式存储
      • “存储程序”的工作方式:程序顺序执行,存储器的内容可以被修改
  • 命令式语言上的概念:
    • 变量:存储单元及它的名称由变量的概念来代替,可以代表一个或一组单元,可以修改。
    • 赋值:计算结果必须存储。
    • 重复:因语句顺序执行,指令存储在有限的存储器中,完成复杂计算时必须重复执行某些指令序列。
  • 变量:对一个(或若干个)存储单元的抽象,赋值语句则是修改存储单元内容的抽象。
    • 变量除名字外,具有四个属性:作用域生存期类型
      • 作用域:是指可以访问该变量的程序范围
        • 静态作用域绑定:按照程序的语法结构定义变量的作用域。
        • 动态作用域绑定:按照程序的执行动态地定义变量的作用域。
      • 生存期:一个存储区绑定于一个变量的时间区间
      • 值:变量对应存储区单元的内容
      • 类型:与变量相关联的值的类以及对这些值进行的操作的说明
    • 虚拟机:由软件实现的机器
  • 程序单元:程序执行过程中的独立调用单元,如子程序、分程序、过程等。
    • 单元的表示:在编译时,单元表示是该单元的源程序;运行时,单元表示由一个代码段和一个活动记录组成,称为单元实例
    • 活动记录:执行单元所需要的信息,以及该单元的局部变量所绑定的数据对象的存储区
  • 编译模型:
    • 翻译:将一种语言编写的程序转换成完全等效的另一种语言编写的程序
      • 在计算机中,翻译由一个程序来实现,称为翻译程序
    • 编译:将高级语言程序翻译为低级语言的程序称为编译
      • 宿主语言:编写编译程序的语言称为宿主语言;源语言、目标语言、宿主语言通常是不同的语言;

      • 宿主机:运行翻译程序的机器

      • 自驻留: 编译程序能生成可供其宿主机执行的机器代码

      • 交叉编译: 编译程序生成的不是宿主机的机器代码,而是别的机器代码

      • 自编译: 编译程序是用源语言写的

      • 编译执行:编译执行图

      • 解释执行:不将源程序翻译成目标程序,而是一边分析,一边执行,这种翻译方法称为解释。

        • 实现解释的程序,称为解释程序。
        • 便于人机对话,适合程序检查
      • 编译步骤:

        • 词法分析:输入字符串,根据词法规则识别出单词符号。
        • 语法分析:根据语法规则,将单词符号构成各类语法单位,并进行语法检查。
        • 语义分析:根据语义规则,进行初步编译。
        • 优化:对中间代码进行等价变换,以使代码更有效
        • 目标代码生成:生成机器语言程序或汇编语言程序

        说明:

        • 实用的编译程序不一定总是分成5个阶段
        • 目标程序不一定能立即执行,可能还要经过连接、装入等阶段
        • 编译的各阶段均需要和符号表管理程序、出错处理程序打交道
        • 符号表管理:完成符号表的建立,查找,更新。
        • 出错处理:发现、指出、限制
          一般编译步骤
        • 从分析源程序到建立一个可执行的目标程序,处理过程还需要其它工具程序的配合。
          • 预处理器、 汇编器、连接器、 装入器
      • 编译前端和后端

        • 在现代编译器中,通常将编译过程划分为前端和后端两大部分,分别加以实现。
        • 前端和后端通过中间代码连接,可极大的提高编译器设计与实现的效率。
          • 前端:主要是与源语言相关的部分,包括词法、语法分析、语义分析和中间代码生成等。
          • 后端:主要是与目标语言相关的部分,包括优化、目标代码生成等。
  • 数据类型:
    • 数据类型实质上是对存储器中所存储的数据进行的抽象。
    • 数据类型包含了一组值的集合和一组操作。
    • 将类型作为数据的抽象表示,可分为三个层次的抽象:内部类型、用户定义类型和抽象数据类型
    • 数据类型的作用:实现了数据抽象、使程序员从机器的具体特征中解脱出来、提高了编程效率
    • 语言的某种特定的数据抽象受到两个因素的影响:语言所面向的机器(只提供定点运算或同时提供浮点运算);语言所面向的应用领域。
    • 数据类型的分类
      ◼ 内部类型:语言定义的
       根据所面向的机器和应用定义了不同的数据类型
       又叫做语言定义类型 、基本类型
      ◼ 自定义类型:用户定义的
       自Pascal 语言开始,语言提供了由用户定义类型
      的方法。
       采用这类方法由用户自己定义的数据类型称为用户
      定义类型(自定义类型)
文法
  • 语法树(推导树)——以图的方式表示推导过程
    • 推导树是一棵有序的标记树
      • 每个结点的标记是文法G的非终结符或终结符;
      • 标记为A的内部结点从左到右有子结点 X 1 , X 2 , … , X n X_1,X_2,…, X_n X1,X2,,Xn,则 A → X 1 … X n A→X_1…X_n AX1Xn是一个产生式;
    • 语法树,也称推导树。
      推导树详细过程
      • 语法树的构造过程是从文法的开始符号出发,构造一个推导的过程。
      • 因为文法的每一个句型 (句子) 都存在一个推导,所以文法的每个句型(句子) 都存在一棵对应的语法树
    • 推导树的边缘:一棵推导树所有叶结点的从左到右的连接。
    • 文法的二义性:一个句子有两棵不同的推导树。
    • 由推导树确定短语

总结:词法(字,词,字母)+语法=文法

词法与语法
  • 词法分析

    • 词法分析的功能

      • 功能:
        • 扫描源程序的字符串
        • 按照词法规则
        • 识别出单词符号作为输出;
        • 对识别过程中发现的词法错误,则输出有关的错误信息。
      • 词法分析器在编译器中负责
        • 读取源程序
        • 识别单词
      • 其他任务:
        • 过滤掉源程序中的注释和空白
          • 空格,换行符,制表符
          • 输入中用于分割单词的其他字符
        • 将编译器生成的错误消息与源程序的位置关联
          • 记录遇到的换行符的个数
          • 给出错信息赋予一个行号
    • 词法分析器与语法分析器的关系:

      • 词法分析作为单独的一遍(适合验证词法分析器效能)
        独立词法分析器

        • 词法分析器不断读取输入串(源文件)
        • 直到识别出下一个符合单词模式的字符串(其他参考书中也叫做词素,lexeme)
        • 词法分析器根据此‘符合单词模式的字符串’生成下一个单词
        • 将单词流的输出形成一个输出文件,作为语法分析器的输入
      • 词法分析作为子程序(语法分析器指导)
        语法分析器指导

        • 语法分析器调用词法分析器
        • 指示词法分析器从它的输入不断读取字符
        • 直到识别出下一个‘符合某种单词模式的字符串’为止
        • 词法分析器根据其生成下一个单词(token)
        • 返回单词给语法分析器
    • 词法分析的输出形式

    • 状态转换图

      • 定义:简称转换图(transition diagram),是一张有限方向图,是设计词法分析器的有效工具;它由如下成分构成:
        • 结点(node):圆圈表示结点,代表状态(state)
        • 有向边(弧):连接结点,边上的标记字符表示该状态下可能接收或识别的字符;
      • 特性:有限的有向图,有向边上标记字符,唯一初态,• 若干终态(至少一个)
      • 识别的串:从初态出发到某一终态路径上字符的连接
      • 识别过程
        • 从初态开始;从输入串中读一个字符;
        • 判明读入字符与从当前状态出发的哪条弧上的标记相匹配,便转到相应匹配的那条弧所指向的状态;
        • 重复上一部分,均不匹配时便告失败;到达终
          态时便识别出一个单词符号。
      • 基本字也符合标识的模式区分:
        • 在符号表中预先填写保留字,并指明它们不是普通标识符。
        • 为关键字/保留字建立单独的状态转换图。
    • 符号表(分词程序不产生)

      • 在程序中,用户用标识符定义了不少名字来代表不同的数据对象,编译程序将这些名字保存在符号表中。
      • 符号表除了记录名字本身而外,还记录了与名字关联的各种属性信息。
      • 符号表在词法分析阶段的角色
        • 建立符号表,查填符号表
        • 将不重复的标识符、数字常数和字符常数的性质填入符号表中,如:名字、类型、数值等,
        • 并且将变量(或常数)在符号表中的入口地址写到其自身的单词(TOKEN)中。
      • 符号表的一般形式
        • 每个名字对应一个表项,一个表项包括名字域和信息域。
        • 其中,信息域通常设若干子域及标志位,其内容可以是和名字有关的任何信息:
          • 类型,种属,长度,相对地址,数组的内情向量,记录与分量的联系,形参标志,说明标志,赋值标志等。
          • 因名字的长度、信息域的组成及长度可能是各不相同的,一般采用间接表技术。
    • 自学DFS(确定有限状态自动机,不利于理解)和NFS(非确定有限状态自动机,适合设计词法规则):合法字母集->NFS->DFS->词法分析程序

      • 分析树剪枝法
  • 语法分析和语义分析

    • 计算程序结合语义语法分析
    • 语义值:类型,种属,地址或代码等
      • 如果同一文法符号在一个产生式出现多次,使用右下角标区分。
      • 对应每个产生式的语义动作写在产生式后的花括号内
    • 通常,语义子程序是某种中间代码生成程序,随着语法分析的进行,中间代码也逐步生成;事实上,语法制导翻译方法既可以用来生成各种中间代码,也可用来直接产生目标指令,甚至可以用来对输入符号串解释执行
  • 中间代码

    • 编译程序的任务是将源程序翻译成目标程序。
    • 语义分析需要:操作各符号的语义值、完成源程序中各个语句的翻译、将源代码翻译成目标代码。
    • 通常情况下,语义分析生成某种中间代码:由于通用性和优化的考虑,目标代码并不是最终的与硬件相关的汇编代码或机器代码
    • 三地址代码:x:=y op z -> (op,y,z,x)
    • 三元式:序号代表结果,仅有三元:op,arg1,arg2
    • 四元式(临时变量)、后缀式、语法树
    • 在语法分析的过程中,由各个产生式对应的
      语义子程序对源代码进行翻译(生成中间代
      码)的方法称为语法制导翻译
    • 语义分析的结果:A:=-B*(C+D)
      语义分析
  • 语义变量和语义函数

    • i.NAME:表示符号 i 对应的变量的名称。
    • E.PLACE:表示符号E对应的变量在符号表中的位置(普通变量)或整数编码(临时变量)。
    • newtemp():生成一个新的临时变量,返回其整数编码。
    • entry(i):在符号表中查找符号 i ,如果存在,则返回它在符号表中的位置。
    • emit (x = y op z) 或emit(RESULT,OPD1,oper,OPD2):
      • 生成一个新的三地址语句,添加到中间代码表的结尾。
      • 指针ip指向中间代码表的结尾,
      • emit将新的三地址语句添加到ip指向的位置,然后ip自动加1,指向新的结尾。
    • error():语义函数,表示出错
  • 说明语句:不产生可执行指令,仅负责填表,将被说明对象的类型及相对存储位置记入各自的符号表中。

  • 说明语句的语义变量及过程:

    • T.type:数据类型
    • T.width:数据宽度,变量需要的内存单元字节数
    • enter:语义过程,根据变量名,将对应的类型和相对地址记入符号表中。
  • 相对位移量/相对存储位置OFFSET,全部变量相对位移量,初值为0,是全局变量(相对于说明语句),用于计算下一个变量相对地址
    说明语句的翻译方案

  • 其他说明语句:

    • 第一种:
      • D→integer namelist│real namelist
      • namelist→namelist,i│i
      • 改写为:
      • S → MD
      • M→ε
      • D→D,i│integer i│real i
    • 第二种:
      • D→namelist :integer | namelist:real
      • namelist→namelist,i | i
      • 要引进namelist.QUEUE来存放变量名
  • 简单赋值语句的翻译

    • 语义变量及过程
      • 表达式结果存放于变量或临时变量
      • 使用E.Place代表存放结果的变量在符号表的位置或临时变量的整数序号
      • 采用变量名或临时变量名表示
      • X.a:文法符X相应属性a,如i.name,E.place
    • 语义变量及过程
      • newtemp( ):语义函数:返回一个可用的临时变量的序号
      • 采用临时变量名代表,表示为t1, t2, …
    • entry(i): 语义函数:对变量 i 查符号表,返回i在符号表中的位置(入口)
      • 采用变量名表示,未查到,返回0 ,表示该变量没有定义,属于语义错误(语义检查)
    • ip:指令指针,初始化为1,也可以是指定的初值。
    • emit(OP,ARG1,ARG2,RESULT) :语义过程产生四元式并填入四元式表中;同时ip:=ip+1(四元式编号增加1)
      • 也可以表示为 emit(RESULT,ARG1,OP,ARG2),分别对应
        • (+,c,d,t2) 四元式
        • t2:=c+d 三地址代码
  • 翻译方案(语义子程序):

  • 类型转换(语义检查)

数据库
  • 数据是一种符号序列,它的内容是事物特性的反映。
    • 数据是对现实世界的事物采用计算机能够识别、存储和处理的方式进行描述,或者说是计算机化的信息。
  • 数据的类型
    • 不仅包括数字、字母、文字和其他特殊字符;
    • 而且还包括图形、图像、声音等多媒体数据。
  • 数据库,数据库系统,数据库管理系统
    • DB:长期储存在计算机内、有组织的、可共享的大量数据集合。
      • 数据按一定的数据模型组织、描述和储存,可为各种用户共享,冗余度较小,数据独立性较高,易扩展
    • DBMS:一个能够让用户定义、创建和维护数据库以及控制对数据库访问的软件系统。
    • DBS
    • 表/实体集/关系
    • 数据列表
    • 关系数据库:数据库通过关系组织
    • 数据库结构:集中式
  • 外模式(应用程序),内模式(物理存储),概念模式(技术人员)
    • 外模式(也称子模式、用户模式、视图)
      • 数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述
      • 不同用户需求不同,看待数据的方式也可以不同,对数据保密的要求也可以不同,使用的程序设计语言也可以不同,因此不同用户的外模式的描述可以使不同的。
      • 数据库用户的数据视图,是模式的子集或变形,与某一应用有关的数据的逻辑表示
      • sql定义的视图
    • 内模式(也称存储模式)
      • 是数据物理结构和存储方式的描述
      • 是数据在数据库内部的表示方式
        • 记录的存储方式(顺序存储,按照B树结构存储,按hash方法存储)
        • 索引的组织方式
        • 数据是否压缩存储
        • 数据是否加密
        • 数据存储记录结构的规定
      • 要修改存储数据库的结构(例如,用倒排文件代替多链表),那么仅仅需要把这些修改反映在存储模式中
      • 一个数据库只有一个内模式
  • 模式(也称概念模式或逻辑模式,数据库的总框架)
    • 数据库中全体数据的逻辑结构和特征的描述
    • 所有用户的公共数据视图,综合了所有用户的需求
    • 一个数据库只有一个模式
  • 模式的地位:是数据库系统模式结构的中间层
    • 与数据的物理存储细节和硬件环境无关
    • 与具体的应用程序、开发工具及高级程序设计语言无关
  • 模式的定义
    • 数据的逻辑结构(数据项的名字、类型、取值范围等)
    • 数据之间的联系
    • 数据有关的安全性、完整性要求
    • DBMS提供数据定义语言DDL来描述逻辑模式。
    • 表结构的定义
  • 关系模型
    • 完整性规则:
      • 实体完整性:主码不能取空值
      • 参照完整性:通过外码实现,避免孤子记录
      • 用户定义的完整性:各类商业规则
    • 关系运算:
      • 并、差、交
      • 笛卡尔积运算(一行与所有行连接)、选择运算、投影运算(选择几列后去掉相同行)
      • 条件连接( θ \theta θ连接)、自然连接、等值连接、左连接(RLINS:R连S求)、右连接(RRINS:S连R求)
  • PHPstdio:有5.7mysql
    数据库考试:sql语句+亚图
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值