编译的本质是一个翻译的过程,编译器的输入是一个高级语言程序,编译器的输出是一个汇编语言程序或者机器语言程序。

下面我们了解一下机器怎么将高级语言程序编译成汇编语言程序/机器语言程序;这里我们可以借鉴人工翻译的过程。

人工英汉翻译的例子

In the room, he broke a window with a hammer

将英语翻译成汉语,这里英语是源语言,汉语是目标语言;翻译的过程大体可以分为两步,如下所示:

首先从源语言,也就是英语层面分析句子表达的含义,也就是句子的语义;接下来根据语义,用目标语言(汉语)的方式说一遍,这样就完成了翻译的过程;

通过分析源语言来获得句子语义的过程称为语义分析,语义分析是从划分句子层面入手,首先抓住句子的核心——谓语动词,如果知道谓语动词则句子的一半意思就知道了,上述句子中的谓语动词为broke,知道打(broke)这个动作,我们就想知道谁实施打这个动作,谁是被打的对象,用什么工具执行打的功能,为什么打,打的结果如何等等;这些都可以通过分析broke的上下文来获得,由于句子中的broke采用的是主动语态,因此其主语he是动作的施事者,宾语window是动作的受事者;如果broke采用的是被动语态,那么其主语是动作的受试者;

句子中的with a hammer是补语,句子对应的四个实体分别为he,window,hammer,room;从broke可以引出四条边,分别指向四个实体,表示这些实体与核心谓语动词之间的关系,其中he是动作的施事者Agent,window是动作的受试者Object,hammer是动作采用的工具Tool,room是动作实施的地点Location;

根据这个图的信息再用汉语的方式说一遍,就是:在房间里,他用锤子砸了一扇窗户;这个图是一种独立的中间表示,独立于具体的语言,也就是说英语可以用这个图表示,汉语也可以用这个图表示,其它语言也可以;有了这个图,不管目标语言是什么,都可以进行翻译,所以说中间表示很重要,起到了一个桥梁的作用;

根据上面的分析,要想进行语义分析,首先要划分句子成分,我们都知道,主语和宾语通常由名词短语构成,状语和补语通常由介词短语构成;因此,要想划分句子成分,关键是识别出句子中的各类短语,这一过程称为语法分析,也叫句法分析;那么,我们又根据什么识别句子中的各类短语呢?这里我们通过词性来识别句子中的各类短语;例如,一个冠词加一个名词构成一个名词短语,一个代词本身也可以构成一个句子短语,因此,要想识别句子中的各类短语,关键要确定句子短语中各个单词的词性,或者叫词类,这一过程称为词法分析,综上所述,我们可以得到一个句子的分析过程。

也就是首先进行词法分析,在词法分析的基础上进行语法分析,然后进行语义分析;

具体来说,通过句法分析,确定句子中各个单词的词性或者说词类,接下里进行语法分析,识别句子中的各类短语,例如名词短语、介词短语、动词短语等,从而获得句子结构;接下来进行语义分析,根据句子的结构分析出各个短语在句子中充当什么成分,从而确定各个名词性成分与核心谓语动词之间的语义关系,最后给出中间表示形式。

编译器的结构


编译器在工作的时候由以上几个部分组成,称之为阶段,分别为词法分析、语法分析、中间代码生成、目标代码生成,在中间代码和目标代码生成之后,通常还有一个代码优化的步骤;其中前面几个部分称为分析部分,也叫编译器的前端,它对源语言进行分析,并生成中间表示,因此这个部分只与源语言相关;后面的几个阶段称为综合部分,也叫编译器的后端,它在中间表示的基础之上生成目标代码,因此只与目标语言相关;

中间表示独立于具体的语言,起到一个桥梁的作用;值得注意的是,这里说的阶段是编译器的逻辑组织方式,在实现过程中,多个阶段可能会被组合在一起,比如说语义分析的结果通常直接表现成中间代码的形式,因此语义分析和中间代码生成器通常放在一起实现,另外可以在语法分析分析句子结构的同时结合语义规则直接进行语义分析,这一技术称为语法制导翻译,这种情况下,语法分析、语义分析、中间代码生成器三个阶段可以放到一起实现,这就是编译器的大体结构。

编译原理 —— 1.2 编译系统的结构(终于弄懂语法和语义的区别了!)相关推荐

  1. 计算机考研英语一和英语二的区别,考研英语一和英语二的区别 今天终于弄懂了!...

    原标题:考研英语一和英语二的区别 今天终于弄懂了! 大家在最后三个月冲刺需要注意: 1.建议留几套真题,做考前模拟,精读真题可以用 <考研圣经>(英语二用)98-07 年的真题,都是逐词逐 ...

  2. 淘宝特价版拉新赚钱的页面怎么做?我终于弄懂了

    淘宝的同胞兄弟特价版,虽然长的朴实无华以至于经常被人问起淘宝特价版靠谱吗?2021年淘宝特价版可谓大火了一把,阿里巴巴不计成本的大力推广淘宝特价版,目的也非常明确要把拼多多占领的市场掠夺回来.最近还传 ...

  3. 编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)

    需要原卷和答案请点赞关注收藏后评论区留言私信~~~ 下面对编译原理中一些常见的概念以及算法小题的讲解,这部分可能单独出题考试,也有可能混在大题中出现 一.编译器结构 题目如下 The phases o ...

  4. 从原理的视角,一文彻底弄懂FPGA的查找表(LUT)、CLB

    我学东西有个特点,喜欢从原理的层面彻底弄懂一个知识点,这几天想弄明白FPGA的查找表,但发现很多博文写的很模糊,看了以后仍然不是很明白.当然,可能是作者自己弄懂了,但没有站在新人的角度来详细的解释.通 ...

  5. 终于弄懂KMP算法了

    1.简例弄懂KMP-点此链接查看 看了上面的文章,你肯定大概明白了KMP的运作原理,但是你可能对于文章提到的"部分匹配值"的又来还存在疑惑,那么请继续往下看: 我们先抛出两个问题, ...

  6. 快速傅里叶变换(研二的我终于弄懂了)

    研二的我仍然对快速傅里叶变换一知半解,于是乎,本着待在家里,能耗时间就多耗点,不知道何年马月我才可以在外面快乐的奔跑~~ 快速傅里叶变换的实现(c++版本) 在做项目的时候,需要用到matlab里的f ...

  7. 斯坦福大学CS143编译原理课程笔记:2.编译器结构

    目录 编译器的五个阶段 五个阶段的作用 1.概念 2.词法分析 3.语法分析 4.语义分析 5.代码与内存优化 6.代码生成 编译器的五个阶段 1.词法分析 2.语法分析 3.语义分析 4.代码与内存 ...

  8. 编译原理——实验叁预习报告——基于YACC的TINY语法分析器的构建

    一.实验目的: 运用YACC,针对给定的文法,构造一个语法分析器.给出实验方案,实施并描述结果. 二.实验预习提示 1.表达:针对5.5节中的calculator文法,设计输入和输出 2.观察:观察p ...

  9. 【编译原理复习】第六章---- 属性文法和语法制导翻译

    第六章 属性文法和语法制导翻译 本章主要掌握下面一些内容. 1.语义规则的两种描述方法:语法制导的定义和翻译方案.语法制导的定义没有指明语义规则的计算次序,而翻译方案显式给出语义规则( 或叫语义动作) ...

最新文章

  1. [推荐]C#快速开发3d游戏工具--Unity3d
  2. python3.x下 smtp发送html邮件和附件
  3. 新建angular-cli项目
  4. 统计学习笔记(3)——k近邻法与kd树
  5. C++多态案例三-电脑组装
  6. [html] 如何给table中的某一列设置固定宽度
  7. 树莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中断
  8. postgreSQL源码分析——索引的建立与使用——GIST索引(1)
  9. php while 自增,PHP 布尔值的自增与自减的实现方法
  10. openwrt的ipk包开发
  11. 电容(3)——晶振电路的电容选择
  12. .rpt文件内容读取java_Java项目读取配置文件时,找不到指定的文件???
  13. F-Train Wreck_2021牛客暑期多校训练营10
  14. 现在的网站无法访问了,如何访问过去的网站
  15. 绩效被打C了,谈谈「绩效考核」背后的逻辑以及潜规则
  16. 软件架构设计|C4模型
  17. 0521课的预习任务 + 课堂笔记
  18. java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊!
  19. 云服务器 ECS,RDS,Redis,SLB服务器建站流程
  20. Python作业(周四)

热门文章

  1. MySQL参数配置优化
  2. dhcp 授权的原理
  3. Eclipse中JBOSS5.1无法启动的问题解决办法
  4. 泛型技巧系列:类型字典和Type Traits
  5. 《机器学习训练秘籍》中文版58章节 完整开源 吴恩达
  6. RestAPI的进化之路,后端MVVM模式或许来临,通过观察者模式,后端收集前端的GET类请求,主动推送数据变更到前端
  7. Docker 安装 MongoDB
  8. 通过Gogs部署git仓库
  9. BGP——重分发注意点(总结+配置)
  10. OSPF报文详解——LSA概述