笔记 | 编译原理L1

news2024/11/27 4:36:43

重点关注过程式程序设计语言编译程序的构造原理和技术

1 程序设计语言

1.1 依据不同范型

过程式(Procedural programming languages–imperative)函数式(Functional programming languages–declarative)逻辑式(Logical programming languages–declarative)对象式(Object-oriented programming languages)
程序中指明如何完成一个计算任务程序中指明要进行哪些计算事实+推理规则支持面向对象编程
FORTRAN, PASCAL, CLISP, HASKELL, ML, OCAML, SCALA…PROLOGSmalltalk, Java, C++, Eiffel, Ruby
说明式语言(Declarative programming): 与上述命令式(Imperative language) 不同,没有控制结构,甚至没有赋值,仅有问题说明,或者 说纯数学定义

1.2 依据不同转化方式

编译型语言解释型语言混合型语言
需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行(博友回复指出)。
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
代表语言:C、C++、Pascal、swift代表语言:JavaScript、Python、Erlang、PHP、Perl、RubyJava先生成字节码再在Java虚拟机中解释执行。

不同的程序设计语言机制(函数式、过程式、逻辑式、对象式),需要采用不同的技术编写编译程序,过程式语言的编译是对象式语言编译的基础

1.3 另一种角度

动态类型语言(Dynamically Typed Language)静态类型语言(Statically Typed)强类型定义语言(Explicit type)弱类型定义语言(Implicit type)
编译时不知道变量类型,运行时才决定,类型错误属于运行错误,运行时报错编译时候决定变量,类型错误属于语法错误,编译器报错偏向于不容忍隐式类型转换偏向于容忍隐式类型转换

image.png

2 编译器概述

编译器(Compiler) 将某种语言(源语言)编写的程序翻译成语义等价的另一种语言(目标语言)编写的程序

image.png|700

依据目标程序的类型:

目标程序若是可执行的机器语言程序目标程序若是汇编语言的程序
可以被用户调用,处理输入并产生输出。image.png
则须经汇编器汇编后方可执行

编译器的重要任务之一是报告它在翻译过程中发现的源程序中的错误。

2.1 编译器的翻译包括哪些步骤

  1. 阅读并理解程序
  2. 准确地确定需要采取什么行动
  3. 弄清楚如何忠实地执行这些行动
  4. 指示计算机执行这些步骤

[[编译器概述.excalidraw|示例图]]
image.png

2.2 编译程序的伙伴程序

编辑器 (editor)预处理器(preprocessor)汇编程序(assembler)连接程序(linker)装入程序(loader)
除一般的文本编辑功能外,还可以对正在编辑的文本进行分析、提示、自动提供关键字匹配等功能;删除源程序中的注释、执行宏替换以及包含文件的嵌入等将编译程序生成的汇编代码汇编成机器代码将不同的目标文件连接到一个可执行的文件中将程序加载到内存中以便执行
image.png

3 编译器的组成

3.1 自然语言翻译过程总结

掌握源语言和目标语言:词法、语法和语义, 翻译过程包括:

分析源句子是否正确将句子翻译成目标语言
拼写,包括识别单词及其属性,依据源语言的语法建立语法结构,检查句子是否有意义翻译每个语法部分,将其组合成有意义的目标语言句子

3.2 编译器组成模块

image.png

[!Note]- 分析部分

  1. 源程序 - 语法结构 - 中间表示
  2. 搜集源程序中的相关信息,放入符号表
  3. 分析、定位程序中可能存在的错误信息(语法、语义错误)
  4. 又称编译器的前端(front end),是于机器无关的部分
符号表管理词法分析/扫描(lexical analysis, scanning)语法分析语义分析
记录源程序中使用的变量的名字,收集各种属性(名字的存储分配,类型,作用域,过程名字的参数数量、参数类型等等)1.读入源程序的字符流,输出有意义的词素(lexeme)。基于词素,产生词法单元token: <token-name, attribute-value>
2.关于token:程序语言处理的最小单位,token-name由语法分析步骤使用,attribute-value指向相应的符号表条目,由语义分析/代码生成步骤使用
1.词法分析后,需要得到词素序列的语法结构
2.语法分析/解析(syntax analysis/parsing):sentence是对单词的再次重组,程序设计语言规定了词法单元、语句的重组规则 — >语句的类别.
使用语法树和符号表中的信息,检查源程序是否满足语言定义的语义约束。同时收集类型信息,用于代码生成。类型检查,类型转换。
符号表可由编译器的各个步骤使用程序语言规定了单词构成的规则和单词类别image.png
根据各个词法单元的第一个分量来创建树形中间表示形式。通常是语法树(syntax tree/parse tree),指出了词法单元流的语法结构image.png


[!Note]- 合成部分

  1. 根据符号表和中间表示构造目标程序
  2. 又称编译器的后端(back end),是于机器相关的部分
中间代码生成代码优化目标代码生成
根据语义分析的输出,生成类机器语言的中间表示通过对中间代码的分析,改进中间代码,得到更好的目标代码(快、短、能耗低把中间表示形式映射到目标语言:(寄存器的分配,指令选择,内存分配)
三地址代码:每个指令最多包含三个运算分量image.png
优化有具体的设计目标image.png
image.png

3.3 编译器的趟(Pass)

趟(Pass):以文件为输入输出单位的编译过程的个数,每趟可由一个或若干个步骤构成。就是对源程序或源程序的中间表示形式从头到尾扫描一次,并作加工处理,生成新的中间结果或目标程序。

  • 可以词法分析、语法分析、语义分析等阶段各作为单独一趟
  • 也可以词法分析作为语法分析的子程序
  • 还可以整个编译程序一遍扫描完成

与编译器组成模块的关系:前者作为“步骤”是逻辑组织方式,“趟”和具体的实现相关

4 解释器

  1. 定义:解释器(Interpreter):解释器直接利用用户提供的输入执行源程序中指定的操作。
  2. 解释过程中若发现错误,则返回修改源程序,修改后重新解释执行。
  3. 解释器与编译器的区别理解:解释器可以直接输出结果,而编译器最终的输出是一个目标程序,是把一种程序设计语言翻译成另外一种语言,编译器的重要任务之一是报告它在翻译过程中发现的源程序中的错误。

4.1 解释器与编译器的比较

image.png

二者比较:

相同点区别
使用相同的实现技术实现机制: 翻译 (程序 to 程序)vs. 解释(指令 to 指令序列)

二者特点:

解释器编译器
可移植性好,支持交互式程序设计,边解释,边执行,错误诊断效果好效率高,一次编译,多次运行,存储代价小,目标程序的执行速度比解释器快很多

二者结合的一种应用:Java

  1. javac 前端编译器:先编译成字节码(bytecode, .class文件)
  2. 由JVM解释执行,可移植性好
  3. JIT即时编译器(just-in-time compiling)
  4. image.png
  5. 为了提高热点代码的执行效率,在运行时虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化(判断热点代码的方法:基于采样的热点探测;基于计数器的热点探测)

5 构建(Build),构建工具(Make)与编译的关系

  • 代码变成可执行文件,叫做编译(compile)
  • 安排编译的顺序,叫做构建(build)
  • Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目,实际上任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建,构建规则都写在Makefile, “make [选项][参数]”

6 编译器的实现

编译器的开发代价是非常昂贵的,在可能的情况下,可以将一种语言的程序转换成另一种语言的程序,利用另一种语言的编译器进行编译。

前提条件:两种语言在语法和语义上很近似,或者一种语言是另一种语言的扩展;实例:C++ —> C

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决游戏霍格沃兹找不到EMP.dll问题的5种方法

在玩《霍格沃兹》游戏时&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“缺少dll文件”。其中&#xff0c;EMP.dll文件丢失是一个常见的问题。这个问题可能会导致游戏无法正常运行或出现各种错误。为了解决这个问题&#xff0c;本文将介绍5种解决方法&#x…

【线段树】【前缀和】:1687从仓库到码头运输箱子

本题简单解法 C前缀和算法的应用&#xff1a;1687从仓库到码头运输箱子 本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 线段树 LeetCode1687从仓库到码头运输箱子 你有一辆货运卡车&#xff0c;你需要用这一辆车…

paddle实现手写数字模型(一)

参考文档&#xff1a;paddle官网文档环境&#xff1a;Python 3.12.2 &#xff0c;pip 24.0 &#xff0c;paddlepaddle 2.6.0 python -m pip install paddlepaddle2.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple调试代码如下&#xff1a; LeNet.py import paddle import p…

初学python记录:力扣1600. 王位继承顺序

题目&#xff1a; 一个王国里住着国王、他的孩子们、他的孙子们等等。每一个时间点&#xff0c;这个家庭里有人出生也有人死亡。 这个王国有一个明确规定的王位继承顺序&#xff0c;第一继承人总是国王自己。我们定义递归函数 Successor(x, curOrder) &#xff0c;给定一个人…

数据结构——二叉树——二叉搜索树(Binary Search Tree, BST)

目录 一、98. 验证二叉搜索树 二、96. 不同的二叉搜索树 三、538. 把二叉搜索树转换为累加树 二叉搜索树&#xff1a;对于二叉搜索树中的每个结点&#xff0c;其左子结点的值小于该结点的值&#xff0c;而右子结点的值大于该结点的值 一、98. 验证二叉搜索树 给你一个二叉树的…

GAMES Webinar 317-渲染专题-图形学 vs. 视觉大模型|Talk+Panel形式

两条路线&#xff1a;传统渲染路线&#xff0c;生成路线 两种路线的目的都是最终生成图片或者视频等在现在生成大火的情况下&#xff0c;传统路线未来该如何发展呢&#xff0c;两种路线是否能够兼容呢 严令琪 这篇工作是吸取这两条路各自优势的一篇工作 RGB是一张图&#xff…

好用的AI智能工具:AI写作、AI绘画、AI翻译全都有

在科技不断进步的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们日常生活中不可或缺的一部分。它不仅在各个领域都有应用&#xff0c;还为我们提供了许多方便快捷的工具。对此&#xff0c;小编今天推荐7款人工智能软件&#xff0c;AI写作、AI绘画、AI翻译全都…

Vue - 你知道Vue组件之间是如何进行数据传递的吗

难度级别:中级及以上 提问概率:85% 这道题还可以理解为Vue组件之间的数据是如何进行共享的,也可以理解为组件之间是如何通信的,很多人叫法不同,但都是说的同一个意思。我们知道,在Vue单页面应用项目中,所有的组件都是被嵌套在App.vue内…

2024/4/1—力扣—BiNode

代码实现&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/void convertBiNode_pro(struct TreeNode *root, struct TreeNode **p) {if (root) {convertBiNode_pro(roo…

Git - 如何重置或更改 Git SSH 密钥的密码?

Git 使用 ssh 方式拉取代码时&#xff0c;报 ssh password login&#xff0c;提示输入密码&#xff0c;这时很容易误填为 Git 的登录密码&#xff0c;其实这时需要输入 SSH 证书的密码&#xff0c;下面直接提供更改以及重新导入证书的方式。 首先需要确认你的本地是否有 SSH 钥…

HIS系统是什么?一套前后端分离云HIS系统源码 接口技术RESTful API + WebSocket + WebService

HIS系统是什么&#xff1f;一套前后端分离云HIS系统源码 接口技术RESTful API WebSocket WebService 医院管理信息系统(全称为Hospital Information System)即HIS系统。 常规模版包括门诊管理、住院管理、药房管理、药库管理、院长查询、电子处方、物资管理、媒体管理等&…

与汇智知了堂共舞,HW行动开启你的网络安全新篇章!

**网安圈内一年一度的HW行动来啦&#xff01; ** 招募对象 不限&#xff0c;有HW项目经验 或持有NISP二级、CISP证书优先 HW时间 以官方正式通知为准 工作地点&#xff1a;全国 薪资待遇 带薪HW &#xff08;根据考核成绩500-4000元/天不等&#xff09; 招募流程 1.填写报名…

中科数安 || 公司电脑文件资料防泄密系统

#公司电脑文件资料防泄密# 中科数安推出的公司电脑文件资料防泄密系统&#xff0c;是一款专为企业电脑终端设计的数据安全解决方案&#xff0c;旨在全方位保护公司电脑中存储、处理、传输的各类文件资料免遭非法窃取、泄露或滥用。 中科数安 || 文件数据资料防泄密软件 PC地址…

第二十五周代码(蓝桥杯查缺补漏)

2024/03/31 周日 填充 题目链接 【参考代码】 想用暴力&#xff0c;没过 //枚举&#xff0c;未出结果QAQ #include <bits/stdc.h> using namespace std; string s00 "00"; string s11 "11"; int ans 0; //m个问号&#xff0c;子串有2^m…

如何本地搭建Discuz论坛并实现无公网IP远程访问

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&a…

基于velero和minio实现k8s数据的备份

1.30部署minio rootk8s-harbor:/etc/kubeasz/clusters/k8s-cluster1# docker run \ -d --restartalways -p 9000:9000 -p 9090:9090 –name minio -v /data/minio/data:/data -e “MINIO_ROOT_USERadmin” -e “MINIO_ROOT_PASSWORD12345678” quay.io/minio/minio server…

Golang | Leetcode Golang题解之第9题回文数

题目&#xff1a; 题解&#xff1a; func isPalindrome(x int) bool {// 特殊情况&#xff1a;// 如上所述&#xff0c;当 x < 0 时&#xff0c;x 不是回文数。// 同样地&#xff0c;如果数字的最后一位是 0&#xff0c;为了使该数字为回文&#xff0c;// 则其第一位数字也…

2024Spring> HNU-计算机系统-实验2-datalab-导引

前言 datalab考验对于位运算以及浮点数存储的理解&#xff0c;如果真的肯花时间去搞懂&#xff0c;对计算机系统存储的理解真的能上一个台阶。与课程考试关联性上来说不是很大&#xff0c;但对于IEEE的浮点数表示一定要熟练掌握。 导引 ①实验工具包 要完成的是bits.c中的15个…

Java | Leetcode Java题解之第13题罗马数字转整数

题目&#xff1a; 题解&#xff1a; class Solution {Map<Character, Integer> symbolValues new HashMap<Character, Integer>() {{put(I, 1);put(V, 5);put(X, 10);put(L, 50);put(C, 100);put(D, 500);put(M, 1000);}};public int romanToInt(String s) {int …

Linux中shell脚本的学习第一天,编写脚本的规范,脚本注释、变量,特殊变量的使用等,包含面试题

4月7日没参加体侧的我自学shell的第一天 Shebang 计算机程序中&#xff0c;shebang指的是出现在文本文件的第一行前两个字符 #&#xff01; 1)以#!/bin/sh 开头的文件&#xff0c;程序在执行的时候会调用/bin/sh, 也就是bash解释器 2)以#!/usr/bin/python 开头的文件&#…