不同机器上的不同编译程序的转换(T型图)

题解仅提供思路,答案是对的

目录

移植

例题

求解过程

更简单的做法

总结


移植

在此之前,我们先看看在不同机器上相同编译程序的转换。(相同机器上不同编译程序的转换其实很简单,只要看懂移植这个过程就都会了)

已知在A机器上有L语言的编译程序AC,希望在B机器上实现L语言的编译程序BC。现要求通过L语言在A机器上的编译程序AC实现。

如果觉得题目比较抽象或者读起来比较拗口,可用具体的高级语言或者你熟悉的编程语言,来代替题目中的字母。这里我们用C语言来代替L语言,得到

已知在A机器上有C语言的编译程序,希望在B机器上实现C语言的编译程序。现要求通过C语言在A机器上的编译程序实现。

我们先分析题目,题目要求我们在B机器上实现C语言的编译程序BC。那么我们所得到的T型图应该是这样的。(为了省事...直接手写了)

T型图上半部分代表着这个编译程序的功能,下面代表的是这个编译程序的描述语言。这里我们用B代表B机器的机器码。那么这个T型图表示的是:用C语言编写的能在B机器上运行的C语言编译程序。 (因为高级语言最后都得转换为机器码才能在对应的机器上运行,所以这里我们才会用B来表示B机器的机器码)

但根据自展的相关知识,我们知道:如果想在某台机器上实现某种语言的编译程序,最直接的方法就是用该机器的机器语言或者汇编语言直接去编写这个编译程序--而不是通过某种高级语言去编写。所以我们最后要得到的实际上是:B机器的机器码编写的能在B机器上运行的C语言编译器。那么我们的目标T型图应该是

那问题就变成了--怎么用C语言去得到B的机器码?我们再看看题目

已知在A机器上有C语言的编译程序AC

也就是说我们要借助A机器的机器码这个工具, 来实现这个转换。即用A的机器码写的能在B机器上运行的C语言编译程序

 那么我们得到下面这张T型图。

步骤二

这个T型图代表的是:

先用C语言编写能在B机器上运行的C语言编译程序(我们假设这个编译程序叫L1)。

再把L1当作输入,通过A机器上的C语言去编译这个编译程序L1,使其能在B机器上运行。这个过程我们又得到了新的编译程序(L2)。

最后L2输出,我们就得到了右边的目标T型图

其实相当于三个T型图又重新组合成了新的T型图,这个T型图同样有三部分,且各部分代表的含义和单张T型图一样不变。

但还有个问题,“用A机器码写的能在B机器上运行的C语言编译程序”,它并不是我们已有的、可以直接拿来用的工具。也就是说我们还得实现这个编译程序。怎么实现呢?

我们继续反推,把工具当作新的T型图的输出,反推得到对应输入。那么这就变成了一个填空题--怎么实现工具--“用某语言实现的能在A机器上运行的C语言编译器”。

还记得题目里给了啥吗?

已知在A机器上有C语言的编译程序AC

还是这个工具,编译程序AC是已知的,我们可以直接拿来用。得到T型图:

 也许你在反推输入的时候碰到了问题。根据上图,我们输出的是”A的机器语言编写的能在B机器上运行的C语言编译器“。那么输入也应该”某语言编写的能在B机器上运行的C语言编译程序“,只不过描述语言从A的机器语言改为了C语言。所以根据题意,我们应该输入一个用C语言编写的能在B机器上运行的C语言编译程序

Stage1
步骤一

 至此,我们实现了这个转换过程,步骤一和二便是本题答案。记得把C语言换回L语言就成了。

例题

设A机器上有语言L的编译程序,可以用它来编制 B 机器上的语言L'的编译程序,试用T形图进行表示

求解过程

将L语言换成C语言,L‘换成Java。

设A机器上有C语言的编译程序,可以用它来编制 B 机器上的Java的编译程序,试用T形图进行表示

 再改下题目让它变得更加直观,得到

已知A机器上有C语言的编译程序,希望在 B 机器上实现Java的编译程序。用T型图表示

我们观察题目,先把题目要求的T型图和最后得到的目标T型图(即输入和输出)写出来,有了上题的经验,我们很快可以得到 

现在图中只剩”工具“中的一个位置没填,这个位置我们能填什么呢?

我们得到用Java编制的Java转成B的机器语言的编译程序后,由于这个编译程序没法直接在机器B上运行,那我们只能借助其他机器的机器语言将其转换为B的机器语言,所以此处只能填上A的机器语言。 

继续往前推,我们已经有了输出,再往前推又可以得到T型图。

再根据输入,我们应该用Java去编写在机器B上运行的Java编译程序,再将这个编译程序用机器A描述,才能得到图中的输出。

那么现在问题又来了,我们刚刚得到的T型图中,工具”A语言编写的Java编译程序“并不是题目给我们的。我们再把工具当输出,往回推导推导出对应的输入,再补充上工具“C语言编写的C语言编译器。最后把步骤一,二,三总结在一起就得到了结果。当然别忘了把Java和C换为L和L'。 

更简单的做法

 经老师指点后发现,题目最后要求的是在B机器上实现L‘的编译程序,换句话说用哪个机器的机器语言去编制这个程序都行,只要实现的功能是L'到B就行。

那我们一开始就用L语言去编制L’,得到编译程序L1。再用A的机器语言对L1进行编制,最后我们就能得到用A的机器码编制的能在B机器上运行的L‘语言的编译程序。

所以实际上只用一步就行了,T型图如下

总结

 先看题目,找出T型图的输出。从输出推导出我们要使用的”工具“和输入。如果工具题目中没有直接给出,我们再把”工具“当作输出,再从输出推导出要使用的”工具“和输入,直到得到题目给出的”工具“为止。

猜你喜欢

转载自blog.csdn.net/white_night_SZTU/article/details/129635011