【编译原理】编译器概述、编译器结构、编译器实例

编译器概述、编译器结构、编译器实例

编译器概述

1.编译器是一个程序
核心功能是把源代码翻译成目标代码
比如源代码:C/C++,Java,C#,html
目标代码:X86,IA64,ARM,…

把一种源程序翻译成另外一种源程序,例如:将C++ 利用Cfront翻译成C语言(广义上)
把源程序翻译成目标代码,比如:C语言翻译成X86

源代码经过编译器的翻译生成目标代码(静态计算,不执行这个代码,要保证语义相同,语义保持

真实的计算机 或 JVM虚拟机 通过对目标代码进行动态计算得到结果

解释器:解释器也是处理程序的一种程序

编译器:gcc g++ 得到可执行程序 离线的方式 offline
解释器 处理过程 得到结果 在线 online

编译器的高层结构

编译器具有非常模块化的高层结构

输入→前端()→后端()→输出
前端:做词法分析、语法分析的部分
后端:做指令生成、指令优化的部分

抽象的多个阶段(phase)
编译器可以看成多个阶段构成的“流水线”结构

典型编译器高层结构
一种没有优化的编译器结构
1.词法分析(第一个阶段 字符序列处理后得到 记号序列 )
2.语法分析(记号序列 处理后 建立 抽象语法树)
3.语义分析(对语法树的合法性进行处理,程序没有语义语法的错误后 得到中间代码,如果这个语义没错,后面步骤就不会再报错了,这里已经将代码的语法语义检测完毕)
4.代码生成(由中间代码 生成目标代码)

符号表:存取了编译过程中的相关信息,和上述阶段都有联系

更复杂的一种编译器结构
在这里插入图片描述

**小结:**编译器由多个阶段组成,每个阶段都要处理不同的问题(使用不同的理论、数据结构和算法)
编译器设计中的重要问题是如何 合理的划分组织各个阶段
接口清晰
编译器容易实现、维护

编译器示例

规则
在这里插入图片描述
编译器实现:
任务:编译程序1+2+3到栈式计算机
(左结合)
“1+2+3” 用树来存储(中序遍历)AST
前端语法分析 代码生成(使用树的后序遍历 post-order) stack

  1. 遇到的节点是n的话就push n
  2. 遇到的节点是加号的话就生成代码“add”

在这里插入图片描述
阶段一:词法分析
阶段二:语法树生成
在这里插入图片描述

阶段三:代码生成
在这里插入图片描述

小结

  1. 编译器的构造和具体的编译器目标相关,
    前端负责将输入的 变成语法树(中间表示)
    后端做代码生成(生成stack)也就是目标代码。
  2. 任务:增加一个代码优化的阶段
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/874853.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

/bin/bash的作用

1、为啥使用不了很多命令? 我刚进入一个新系统: 我当时蒙蔽了,这是啥意思,为啥没命令? 原因是:当时进入的shell并没有初始化这些路径环境,所以正确的方法是: 2、/bin/bash运行的过程中执行…

Mac清理其他文件:释放存储空间的高效指南

每个Mac用户都可能遇到存储空间不足的问题,尤其是当“其他”文件积累到一定体积时。在Mac上,“其他”文件通常包括各种系统文件、缓存、文档以及不被归类为应用程序、照片、电影或音乐的其他类型的文件。这些文件往往不易被注意,但逐渐占用了…

C语言代码练习(第十八天)

今日练习: 48、猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时&…

TMGM:欧元区储蓄率处于结构性增高

法国的家庭储蓄率进一步上升,从2024年第一季度的家庭总可支配收入(GDI)的17.6%上升到2024年第二季度的17.9%,这信息来自于法国国家统计和经济研究所(INSEE)。这也是欧元区正在进行的上升趋势的早期迹象。虽然第二季度数字还没出来…

【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现 本文将详细介绍如何使用容器适…

探索最佳 Shell 工具:全面测评 Bash、Zsh、Fish、Tcsh 和 Ksh

感谢浪浪云支持发布 浪浪云活动链接 :https://langlangy.cn/?i8afa52 文章目录 1. 简介2. 测评工具3. 测评标准4. Bash 测评4.1 易用性4.2 功能特性4.3 性能4.4 可定制性4.5 社区和支持 5. Zsh 测评5.1 易用性5.2 功能特性5.3 性能5.4 可定制性5.5 社区和支持 6. F…

3款数据恢复免费版软件评测:帮你轻松解决数据丢失问题

如今数字化时代,数据至关重要,珍贵照片、重要文档、成长记录的视频音频,承载回忆与努力。但数据丢失风险常伴,误删、格式化、病毒攻击等意外频发,令人陷入绝望,如坠数据黑洞。所幸科技发展,数据…

精益生产现场管理和改善的“蜕变”之旅:从理念到落地的全方位指南

精益生产现场管理和改善,正逐步成为众多企业转型升级的必经之路。今天,就让我们(深圳天行健企业管理咨询公司)带大家一起踏上这场从理念到落地的“蜕变”之旅,探索精益生产现场管理与改善的方方面面,为企业…

API安全 | 发现API的5个小tips

在安全测试目标时,最有趣的测试部分是它的 API。API 是动态的,它们比应用程序的其他部分更新得更频繁,并且负责许多后端繁重的工作。在现代应用程序中,我们通常会看到 REST API,但也会看到其他形式,例如 Gr…

游戏论坛网站|基于Springboot+vue的游戏论坛网站系统游戏分享网站(源码+数据库+文档)

游戏论坛|游戏论坛系统|游戏分享网站 目录 基于Springbootvue的游戏论坛网站系统游戏分享网站 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大…

JAVA同城服务系统大集结活动报名通道已开启构建你的同城圈子系统小程序源码

同城服务系统大集结,活动报名通道已开启! 🎉 【开篇号角】同城服务大狂欢,集结号已吹响! 嘿,小伙伴们!你们期待已久的同城服务系统大集结活动终于来啦!🎊 是的&#xff…

kubernetes微服务基础及类型

目录 1 什么是微服务 2 微服务的类型 3 ipvs模式 ipvs模式配置方式 4 微服务类型详解 4.1 ClusterIP 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 metalLB配合loadbalance实现发布IP 1 什么是微服务 用控制器来完成集群的工作负载,那么应用如何暴漏出去&…

【卷起来】VUE3.0教程-08-路由管理

在Vue中,我们可以通过vue-router路由管理页面之间的关系。 Vue Router是Vue.js的官方路由,它与Vue.js核心深度集成,让用Vue.js构建单页应用变得轻而易举。 🌲 在Vue中引入路由 安装路由 npm install --save vue-router 建立三个…

详聊LLaMa技术细节:LLaMA大模型是如何炼成的?

本文介绍来自 Meta AI 的 LLaMa 模型,类似于 OPT,也是一种完全开源的大语言模型。LLaMa 的参数量级从 7B 到 65B 大小不等,是在数万亿个 token 上面训练得到。值得一提的是,LLaMa 虽然只使用公共的数据集,依然取得了强…

读论文-《基于计算机视觉的工业金属表面缺陷检测综述》

文章目录 1. 背景1.1 工业需求1.2 传统方法的局限1.3 计算机视觉技术的优势 2. 技术流程2.1 光学成像2.1.1照明方式2.1.2 缺陷和背景特性 2.2 图像预处理2.3 缺陷检测2.4 结果分析和决策 3. 关键算法3.1 光学成像技术相关算法3.2 图像预处理相关算法3.2.1 图像增强3.2.2特征提取…

【JS】将class转为构造函数需要注意的细节

前言 将 class 转为构造函数看似很简单,但作为封装者,有很多注意事项 class Person {constructor(name) {this.name name;}fn() { console.log(this.name); } }实现 初步转化如下: function Person() {this.name name } Person.prototy…

网络学习-eNSP配置VRRP

虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP) VRRP广泛应用在边缘网络中,是一种路由冗余协议,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及即使在实际…

二百六十三、Java——IDEA项目打成jar包,然后在Linux中运行

一、目的 在用Java对原Kafka的JSON字段解析成一条条数据,然后写入另一个Kafka中,代码写完后打成jar包,放在Linux中,直接用海豚调度运行 二、Java利用fastjson解析复杂嵌套json字符串 这一块主要是参考了这个文档,然…

如何进行DAP-seq的数据挖掘,筛选验证位点

从样本准备到寄送公司,每一天都在“祈祷”有个心仪的分析结果,终于在这天随着邮件提示音的响起,收到了分析结果...... 分析前工作 爱基在进行数据分析之前,会有两次质控报告反馈给老师们。第一个,基因组DNA的提取质控…

Django路由访问及查询数据

1、在应用模块下,创建urls文件,用来存放访问路由 2、在项目总访问url里面注册路由 3、在view文件里,定义方法参数 from django.core import serializers from django.db import connection from django.http import HttpResponse, JsonRespo…