Compiler construction 什么';这是引导它所需的语言功能的最小子集';谁的编译器?

Compiler construction 什么';这是引导它所需的语言功能的最小子集';谁的编译器?,compiler-construction,language-design,bootstrapping,Compiler Construction,Language Design,Bootstrapping,作为一种子语言,一种语言(受C启发)的绝对必要的核心特性是什么,可以用来为整个语言编写编译器?您需要一个while循环、if、一个真正的整数变量以及一种读写文件的方法。就这样。(事实上,文件读写部分很好,但不是绝对必要的–您只需要它来获取程序中的信息。如果您可以读写文件,那么您就不再需要整数变量,因为您可以将该文件用作临时存储。) 而,如果和一个整数变量是图灵完备的,即它可以计算任何图灵可计算函数。编译器是图灵可计算函数。一个不能接受任何输入或产生任何输出的编译器是非常无聊的,所以你需要有一种读

作为一种子语言,一种语言(受C启发)的绝对必要的核心特性是什么,可以用来为整个语言编写编译器?

您需要一个
while
循环、
if
、一个真正的整数变量以及一种读写文件的方法。就这样。(事实上,文件读写部分很好,但不是绝对必要的–您只需要它来获取程序中的信息。如果您可以读写文件,那么您就不再需要整数变量,因为您可以将该文件用作临时存储。)


如果
和一个整数变量是图灵完备的,即它可以计算任何图灵可计算函数。编译器是图灵可计算函数。一个不能接受任何输入或产生任何输出的编译器是非常无聊的,所以你需要有一种读一些输入和写一些输出的方法。

你需要一个
while
循环,
if
,一个真正的整数变量,以及一种读写文件的方法。就这样。(事实上,文件读写部分很好,但不是绝对必要的–您只需要它来获取程序中的信息。如果您可以读写文件,那么您就不再需要整数变量,因为您可以将该文件用作临时存储。)


如果
和一个整数变量是图灵完备的,即它可以计算任何图灵可计算函数。编译器是图灵可计算函数。一个不能接受任何输入或产生任何输出的编译器是非常无聊的,所以你需要有一种方法来读一些输入,写一些输出。

有两种方法来解释你的问题:作为一个理论计算机科学问题;作为一个实际的工程问题

已经有一个答案倾向于理论答案。所以,我将更倾向于实际的一面

我认为您需要整数、指针、变量、if语句、循环语句和函数。正如另一篇文章所指出的,您需要有某种方式从文件中读取要编译的源代码,并将其写入文件以保存生成的程序集或目标代码


我建议你调查一下这件事。它是一个C语言子集的编译器,能够自行编译。如果你看一下,你会看到一些关于编译器的书已经出版了。当这些书已经绝版时,你可能会找到一本可用的二手书。

有两种方法来解释你的问题:作为理论计算机科学问题;作为一个实际的工程问题

已经有一个答案倾向于理论答案。所以,我将更倾向于实际的一面

我认为您需要整数、指针、变量、if语句、循环语句和函数。正如另一篇文章所指出的,您需要有某种方式从文件中读取要编译的源代码,并将其写入文件以保存生成的程序集或目标代码


我建议你调查一下这件事。它是一个C语言子集的编译器,能够自行编译。如果你看一下,你会看到一些关于编译器的书已经出版了。当这些书已经绝版时,您可能会找到一本可用的二手书。

您可以定义由20多行组成的可引导元编译器来完成此任务。这是1963年的一个特别好的例子。早在20世纪70年代,我就从MetaII启动了更大的编译器

这些元编译器需要能够解析元编译器描述(尤其是它们自己的描述,以便可以进行引导),该描述定义了EBNF语法(测试输入字符串、扫描下一个标记等)和一组生成器操作(输出文字字符串、扫描的输出最后一个标记、输出生成的标签)。实际上,您可以用任何语言实现一个库,以实现对它的支持,在任何过程语言中,通常只有几百行

以下是MetaII的自我描述,直接取自原始论文: .
是的,就是这样。(针对真正积极的读者的练习:您可以简化最小支持指令集,以及此说明)

下面是一个关于如何用JavaScript构建/理解这个gem的漂亮教程:


道格·米歇尔斯(Doug Michels)是圣克鲁斯大学(Santa Cruz)的一名研究生,他在20世纪80年代就将这一点发挥到了极致。如果将语言标记编码为单个字符,则可以定义一个可引导的元编译器,该元编译器使用80个字符进行自我描述。如果你想了解细节,你必须从圣克鲁斯拿到论文。

你可以定义由20多行组成的可引导元编译器来完成这项工作。这是1963年的一个特别好的例子。早在20世纪70年代,我就从MetaII启动了更大的编译器

这些元编译器需要能够解析元编译器描述(尤其是它们自己的描述,以便可以进行引导),该描述定义了EBNF语法(测试输入字符串、扫描下一个标记等)和一组生成器操作(输出文字字符串、扫描的输出最后一个标记、输出生成的标签)。实际上,您可以用任何语言实现一个库,以实现对它的支持,在任何过程语言中,通常只有几百行

以下是MetaII的自我描述,直接取自原始论文: .
是的,就是这样。(针对真正积极的读者的练习:您可以简化最小支持指令集,以及此说明)

下面是一个关于如何用JavaScript构建/理解这个gem的漂亮教程:

道格·米歇尔斯(Doug Michels)是圣克鲁斯大学(Santa Cruz)的一名研究生,他在20世纪80年代就将这一点发挥到了极致。如果将语言标记编码为单个字符