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

tech2024-10-09  13

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

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

人工英汉翻译的例子

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;

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

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

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

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

编译器的结构

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

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

最新回复(0)