首页 > 其他分享 >编译原理论述

编译原理论述

时间:2024-02-07 17:33:25浏览次数:30  
标签:代码生成 语法分析 记号 语义 编译 代码优化 阶段 原理 论述

编译程序工作的几个阶段包括:

  • 词法分析(Lexical Analysis):也称为扫描(Scanning)或词法扫描(Lexical Scanning)。这个阶段的任务是从左到右一个字符一个字符地读入源程序,将其划分成一系列的记号(token)。每个记号由两部分组成,一个是记号本身,一个是记号的属性值(比如关键字、变量名、常量值、运算符等)。词法分析器输出的记号流中,除了包括程序中的各类记号外,还可能包括由源程序中的错误所产生的“错误”记号。
  • 语法分析(Syntax Analysis):语法分析的任务是在词法分析的基础上将程序划分成一系列由语法单位组成的高级语法结构——语法树(Parse Tree)。语法分析器以记号流作为输入,输出是语法树。语法分析器不仅需要考虑语法规则,而且还要处理语法分析过程中出现的错误,并给出错误提示。
  • 语义分析(Semantic Analysis):语义分析是对结构上正确的源程序进行上下文有关性质的审查,进行语义相关性检查,审查源程序是否真正有意义。语义分析器要对各类语义错误给出提示。
  • 中间代码生成(Intermediate Code Generation):这个阶段的任务是根据语义分析的结果,生成中间代码。所谓中间代码是一种简单、含义明确的低级语言,这种语言接近于机器语言,并且与具体的机器语言无关。生成中间代码的目的是为了使后面的代码优化和代码生成阶段能够独立于具体的机器硬件平台。
  • 代码优化(Code Optimization):代码优化是对中间代码进行变换,从而生成更有效的目标代码。代码优化不仅依赖于语言的语义,而且也与具体的机器硬件有关。
  • 目标代码生成(Target Code Generation):这个阶段的任务是把中间代码变换成特定机器上的绝对指令代码,或可重定位的目标代码,或汇编指令代码。目标代码生成是编译过程的最后阶段。

请注意,虽然通常说编译过程有五个阶段,但在某些描述中可能不包括代码优化,或者将代码优化和目标代码生成合并为一个阶段。此外,以上描述的各个阶段也可能因为具体的编译器设计或目标平台而略有不同。

标签:代码生成,语法分析,记号,语义,编译,代码优化,阶段,原理,论述
From: https://www.cnblogs.com/yubo-guan/p/18011120

相关文章

  • 分布式事务(六):Seata之AT模式原理
    1、整体机制SeataAT模型,基于本地ACID事务的关系型数据库实现。两阶段提交协议机制如下:一阶段:业务数据和回滚日志在同一个本地事务中提交,释放本地锁和连接资源二阶段:提交异步化,非常快速地完成;回滚通过一阶段的回滚日志进行反向补偿2、事务状态global_table......
  • Go语言精进之路读书笔记第14条——了解map实现原理并高效使用
    14.1什么是mapmap对value的类型没有限制,但是对key的类型有严格要求:key的类型应该严格定义了作为“==”和“!=”两个操作符的操作数时的行为,因此func、map、slice、chan不能作为map的key类型。map类型不支持“零值可用”,未显式赋初值的map类型变量的零值为nil。对处于零值状态的......
  • 分布式事务(四):Seata之Saga事务模式原理
    Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。  Seata2.x提供的Saga是基于状态机引擎实现的,下面来看看状态机引擎。1、状态机......
  • 分布式事务(五):Seata之XA事务模式原理
    1、XA事务模式概述XA事务模式是在Seata定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对XA协议的支持,以XA协议的机制来管理分支事务的一种事务模式。 1.1、执行阶段可回滚:业务SQL操作放在XA分支中进行,由资源对XA协议的支持来保证可回滚持......
  • 分布式事务(三):Seata之TCC事务模式原理
    TCC模式是Seata支持的一种由业务方细粒度控制的侵入式分布式事务解决方案,是继AT模式后第二种支持的事务模式。其分布式事务模型直接作用于服务层,不依赖底层数据库,可以灵活选择业务资源的锁定粒度,减少资源锁持有时间,可扩展性好,是为独立部署的SOA服务而设计的。TCC......
  • 如何基于 spdlog 在编译期提供类 logrus 的日志接口
    如何基于spdlog在编译期提供类logrus的日志接口实现见Github,代码简单,只有一个头文件。前提几年前看到戈君在知乎上的一篇文章,关于打印日志的一些经验总结;实践下来很受用,在golang里结构化日志和logrus非常契合,最常见的使用方式如下。logrus.WithField("addr","127.0......
  • Go语言精进之路读书笔记第13条——了解切片实现原理并高效使用
    13.1切片究竟是什么Go数组是值语义的,这意味着一个数组变量表示的是整个数组,对于元素类型长度较大或元素个数较多的数组,如果直接以数组类型参数传递到函数中会有不小的性能损耗。这时很多人会使用数组指针来定义函数参数,但在Go语言中,更地道的方式是使用切片。切片之于数组就像......
  • 解决编译报错——too few arguments for template template parameter “Tuple“detec
    一般出现这种问题都是cuda、pytorch和vs版本没配对上。这里出现问题的文件为torch中的cast.h。我看网上很多给的解决方法是修改下面代码:template<template<typename...>classTuple,typename...Ts>classtuple_caster;template<typenameT1,typenameT2>classtyp......
  • Ubuntu安装PHP8.2 编译安装 oci8 pdo_oci扩展
    PHP8.2是PHP语言的最新版本。新特性包括,只读类,允许布尔值作为独立类型等。从mysqli中删除libmysql的支持等。时至今天,主流的HTTP服务器已不是Apache,我们推荐使用Nginx作为HTTP服务器,Nginx相对于Apache来说简单且性能更好。本教程将向您展示如何在Ubuntu20.04安装PHP8.2并将其......
  • 在K8S中,kube-proxy iptables 原理是什么?
    在Kubernetes(K8s)中,kube-proxy组件使用iptables模式时,其主要原理是利用Linux内核的iptables工具动态管理节点上的网络规则,以实现服务(Service)到后端Pod之间的透明网络代理和负载均衡。以下是kube-proxy在iptables模式下工作的大致步骤:监听APIServer:kube-proxy在每个集群节点上......