编译原理的概述

编译指的是将程序员用某种高级语言的源代码转换成目标代码,即计算机能够人认识的可执行机器代码

编译是由一个叫编译器的程序完成的
因为程序需要被编译运行在特定类型的处理器上,所以,具体如何实现编译器还取决于目标机器的体系结构

What makes a good compiler?

编译器设计之初就是为了必须让高级语言所写的程序正确运行

works correctly

必须检测到所有的静态错误,也就是说他应该识别所有的不符合变成语言规则的错误,不要指望编译器来捕获动态错误,这些错误只能在运行时检测到,如果没有被捕获到可能后导致程序崩溃,也不要指望编译器去发现代码逻辑上的错误,也就是说这些错误不会使程序运行时崩溃,但会导致程序输出结果有误

Detects akk statuc errors

Produces meaningful diagnostics

一个编译器应该做出明确的有意义的诊断,如果程序在编译时错误就被发现,那么输出的错误信息就应该是明确的,并且精准地之初源代码错误的位置

Generates optimal machine code

一个好的编译器会生成最佳的机器码

Compiles quickly

编译必须要快

Easy to use

编译要简单运用

modular

各个组件之间建立一个耦合度尽可能小的模块编译器需要很多的知识储备
这种方式允许编译器的各个部分可以被多种编译语言和多种目标机器架构平台进行重用

Documented and easy to maintain

如同好的软件一样,一个好的编译器必须要有一个详细的文档,而且易于维护

Stages of Compilation

词法分析

我们写了一个简单的英文句子,然后把它分割成一个个的单词和标点符号

语法分析

用来检查这个句子是什么意思

机器码生成

这一过程就是将一句话翻译成另一种语言

编译器生成了能够被处理器所理解的0和1的机器码,但它同时也对该机器码进行了速度和空间上的优化

因此,代码生成以及优化通常被作为一个阶段来认知

编译器的一个阶段不是跟着一个阶段的

例如,词法分析和语法分析是同时进行的

在高级编译语言编译的时候,要进行词法和语法分析,但我们的目标机器所处架构平台是独立的,因此,词法和语法分析被称为编译器的前端操作

另一方面,代码生成与优化仅在根据目标机器的指令集生成机器代码时使用
所以这个阶段在编译过程中被称之为后端操作

前端操作

程序源码将作为一个文本流来输入到词法分析器中,词法分析器将源程序的各个单词转换成词法单元流并输出,并在请求时,将词法单元流一个个送入到语法分析器中

语法分析器会构建出用于代表源程序的抽象语法树

抽象语法树

抽象语法树是一种动态数据结构,用来表示源程序的层级结构

当语法书构建完毕,编译器会使用它检查源代码是否遵从了编程语言的语法规则

编译时,词法分析器同时会创建一个符号表,符号表在编译过程的所有阶段都会被频繁的访问和修改,符号表包含了程序员在源代码中使用的名称的信息,例如变量和函数名

对于某些编译器,抽象语法树是源代码到机器码的唯一中间表现形式,抽象语法树是语法分析器的输出,也是编译器前端的最终输出,接下来抽象语法树将被直接转换为机器码

然而,有些编译器在前端做了更多的工作

在构造抽象语法树之前,编译器可能会先构建一棵简易的树,我们称它为解析树(语法分析树),它是源程序的一种轻量表示

通过编译抽象语法树获得的信息与符号表的信息进行组合,生成源代码的另一种中间表示形式

国外精选视频课:编译原理入门1相关推荐

  1. 国外精选视频:编译原理入门3

    语法分析 该阶段的目的是为了发现已标记化(已分词)程序中的任何语法错误,语法错误是指那些破坏变成语言规则的内容 分析程序的语法就像检查用英语写的简单句子是否具有语义 这句话是有效的,因为它符合某种规定 ...

  2. 【编译原理入门】–编译器compiler

    编译原理[入门]–编译器compiler 参考:https://www.youtube.com/watch?v=cxNlb2GTKIc&list=PLTd6ceoshpreZuklA7RBMu ...

  3. 【编译原理】实现一个计算器

    实现一个计算器,包括加减,乘除,括号,错误提示,id等,相当于一个小型的解释器. 其中重要的思想是 把字符转换成token 递归解析 //编译原理实现计算器 #include<bits/stdc ...

  4. micropython编译原理_C语言嵌入式Linux高级编程第9期:CPU和操作系统入门视频课程...

    嵌入式开发是一门交叉学科. 它要求我们的嵌入式工程师,不仅学习C语言.汇编.软件工程等软件层面的知识技能,还要求对CPU内部工作机制.计算机系统架构.操作系统原理.编译器等都有一个全局的认识和把握. ...

  5. 龙书啃不动?老司机带你从零入门编译原理,开发编译器

    计算机只认识二进制的,但是我们平常开发中根本不会使用二进制进行开发,我们使用的都是 Java.C.Python 这类的高级语言.每种语言都会经过一系列的转换才能被计算机识别,那么到底是谁做的这项工作呢 ...

  6. HTML4基本编译原理,Stanford公开课《编译原理》学习笔记(1~4课)

    课程里涉及到的内容讲的还是很清楚的,但个别地方有点脱节,任何看不懂卡住的地方,请自行查阅经典著作<Compilers--priciples, Techniques and Tools>(也 ...

  7. Stanford公开课《编译原理》学习笔记(1~4课)

    [摘要] 编译原理基础 示例代码托管在:http://www.github.com/dashnowords/blogs B站地址:[编译原理] Stanford公开课:[Stanford大学公开课官网 ...

  8. 【视频课】StyleGAN人脸生成与年龄表情编辑:原理与实践

    前言 要问当前人脸图像领域最火的技术是什么?当然是假人脸的伪造生成与各种人脸属性编辑,下面这些图都是生成的人脸图,是不是足够以假乱真?反正通过肉眼我是看不出真假的. 另一方面,这几年里人脸属性编辑的技 ...

  9. 【视频课】永久免费!5小时快速掌握Pytorch框架入门及实战

    前言 PyTorch是深度学习的主流框架之一,新手入门相对容易.为了帮助初学者解决PyTorch入门及实践的问题,有三AI推出<深度学习之PyTorch-入门及实战>课程,课程将算法.模型 ...

最新文章

  1. Bio->Nio->Selector->Epoll->Netty
  2. delphi7存取配置文件与sqlserver数据库连接_Delphi7存取配置文件与SQLServer数据库连接...
  3. Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2)
  4. centos7安装mysql允许远程连接_CentOS7安装Mysql并配置远程访问
  5. Windows server 2003网络服务之搭建服务器群集
  6. pandas中merge()函数的用法详解
  7. python熵权法求权重
  8. 为什么会有hash冲突?
  9. 迅雷自动升级解决方法
  10. 软件系统分析设计过程方法精要
  11. 股票大作手操盘术---到手的利润
  12. Yy And WJM
  13. android 专业密码键盘,Android仿支付宝、京东的密码键盘和输入框
  14. 软件缺陷报告模板(微信缺陷报告案例)
  15. 重磅!全站首发,新鲜出炉,1024特辑,手把手教你采集 高德地图 搜索结果,获取全国海底捞信息并可视化
  16. win10svn图标(绿色勾)不显示
  17. 【我的区块链之路】- 谈一谈IPFS原理及玩法
  18. 面对问题时如何解决呢---pytharm不能进行单步调试
  19. 爬取QQ音乐——新手不知道的那些坑 之 中英文(全/半角)冒号坑
  20. 大数据可视化陈为智慧树_智慧树知到_大数据可视化_答案章节单元测试答案

热门文章

  1. 用 Python 生成有“灵魂”的二维码
  2. IntelliJ IDEA 开发工具破解
  3. 嵌入式学习路上的一些总结
  4. 院士加盟,百亿新大学,签约南科大
  5. 香港《宣言》为内地NFT打开突破口
  6. yolov5-4.0环境搭建,零基础小白都能看得懂的教程。YOLOv5搭建的最快搭建方式,踩坑经历详谈)yolov5/yolov4/yolov3/yolov3通>>>>>>>>>>>>>>>>>第一章
  7. 系统设计面试题 之 如何设计Instagram
  8. 基于python+opencv利用颜色,区分多个目标(附带详细代码)
  9. Kernel Bypass DPDK
  10. linux双系统安装nvidia,Linux_Ubuntu系统安装Nvidia Quadro显卡驱动的方法,  虽然在安装了一个版本后 - phpStudy...