一、编译原理(引论)

ops/2024/11/14 12:57:56/

目录

【一】、引论

一、编译器 

1、编译器

2、编译器与解释器

3、编译器结构


【一】、引论

一、编译器 

1、编译器

(1)编译器:将人类易懂的 高级语言 翻译成 硬件可执行的目标机器语言
(2) 高级语言
直接面向开发者
与数学公式类似
编程效率高
(3)机器语言
驱动硬件完成具体任务
编程效率低

2、编译器与解释器

(1)编译器 (compiler)

读入以某种语言编写的 源程序
输出等价的用另一种语言编写的 目标程序
通常目标程序是 可执行
如C语言编译器GCC
(2) 解释器 (interpreter)
直接利用用户提供的输入,执行源程序中指定的操作
逐行转译运行,不需要生成和执行目标程序
⚫如Python解释器

3、编译器结构

编译器=分析部分(前端部分是 机器无关) +综合部分 (后端部分是 机器相关)
(1) 分析 (analysis) 部分(前端)
把源程序分解成组成要素,以及相应的语法结构
使用这个结构创建源程序的中间表示
同时收集和源程序相关的信息,存放到符号表
(2) 综合 (synthesis) 部分(后端)
根据中间表示和符号表信息构造目标程序

二、编译程序和解释程序

1、编译程序

高级语言设计的源程序(面向人的)翻译成等价的低级程序设计语言(面向硬件的)、即机器语言或汇编语言。

2、源程序的两种执行方式

(1)翻译:使用翻译程序,将源程序翻译成为低级语言目标程序,然后执行目标程序。

(2)解释:使用解释程序,对源程序逐个语句边解释边执行。

3、编译程序和解释程序的主要区别

是否生成目标程序,运行时的存储分配。

三、编译过程

1、编译过程的概述

词法分析-> 语法分析 -> 语义分析+中间代码生成 -> 中间代码优化 -> 目标代码生成 -> 目标代码

2、词法分析


http://www.ppmy.cn/ops/113308.html

相关文章

聊一聊测试用例的重要性

对于测试从业人员,测试用例术语应该不会陌生,在工作中用到的概率就像医生的药方,厨师心中的菜配方等等。 不过前者对项目组内人员都是公开的,后者的药方和配方大概率不会公开;前者项目内公开为了让测试用例覆盖率更高…

网络安全(黑客技术)2024年三个月自学计划

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”…

如何为子域名配置 Nginx 反向代理到 Flask 应用

在这篇博客中,我将介绍如何为你的域名添加子域名,并使用 Nginx 反向代理将子域名请求转发到 Flask 应用。我们将以子域名 app1.example.com 为例,并通过 Nginx 将请求转发到 Flask 应用的 5000 端口。 1. 前提条件 你已经拥有一个域名&…

向日葵好用吗?4款稳定的远程控制软件推荐。

远程控制技术现在已经被应用于很多个领域,像企业办公,远程协助,智能家居,工业控制等等。我们常常会用到的时前两种。而实现远程控制的方式也有多种,但是最方便高效的还是使用第三方软件。我最常使用的是向日葵&#xf…

Flutter - Win32程序是如何执行main函数

Win32程序的主体结构 int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,_In_ wchar_t *command_line, _In_ int show_command) {// Attach to console when present (e.g., flutter run) or create a// new console when running with a debugger.if …

Linux 防火墙:Firewalld 常用命令行操作命令

firewalld命令行操作管理 按增删改查分类,前面加上 firewall-cmd : ### 查询操作--get-default-zone 查看当前默认区域 --get-zones 查看所有可用的区域 --get-active-zones …

科技赋能司法:易保全如何重塑法律文书签署与庭审流程

在这个数字化飞速发展的时代,司法领域也迎来了前所未有的变革。随着人工智能、区块链与互联网技术的深度融合,正以前所未有的力量变革着司法服务的格局。 易保全通过将“区块链人工智能互联网司法”相融合,推动公证系统逐步迈向智能化、高效…

C++学习笔记 —— 内存分配 new

//创建数值 int *pi new int; //pi指向动态分配的,未初始化的无名对象 delete pi; int *pi new int(10); //pi指向动态分配的,初始化10 delete pi;//创建数组 int *a new int[5]; //创建一个数组,未初始化数值 delete []a; // new 和 de…