语言的绝对必要核心功能(灵感来自C)作为一种子语言可以用来编写整个语言的编译器吗?
答案 0 :(得分:4)
您需要一个while
循环,if
,一个 true 整数变量,以及一种读写文件的方法。而已。 (实际上,文件读写部分很好用,但并不是绝对必要的 - 你只需要它来获取进出程序的信息。如果你可以读写文件,那么你就不需要需要整数变量,因为您可以将该文件用作临时存储。)
while
,if
和一个整数变量是Turing-complete,即它可以计算任何图灵可计算函数。编译器是图灵可计算的函数。一个无法接受任何输入或产生任何输出的编译器非常无聊,所以你需要有一种方法来读取一些输入并写一些输出。
答案 1 :(得分:2)
您可以定义可由20条奇数行组成的可引导的元编译器。 MetaII compiler是1963年 的一个特别好的例子。 我在20世纪70年代以MetaII为基础引导了更大的编译器。
这些元编译器需要能够解析元编译器描述(特别是它们自己的引导可能),它定义了EBNF语法(测试输入字符串,扫描下一个标记,......)和一组生成器操作(输出文字字符串,输出最后一个标记扫描,输出生成标签)。您可以使用几乎任何语言实现库,以通常的几百行以任何过程语言实现对此的支持。
以下是MetaII的自我描述,直接取自原始论文:
。
是的,那是该死的东西。 (练习真正有动力的读者:你可以简化最小支持指令集,以及这个描述)。
这是一个很棒的教程,介绍如何在JavaScript中构建/理解这个gem:MetaII Tutorial。
20世纪80年代,圣克鲁斯大学的研究生道格·米歇尔斯(Doug Michels)将这个问题推向极致。如果将语言标记编码为单个字符,则可以定义一个可自编的80个字符的可引导的元编译器。如果你想看到细节,你必须从圣克鲁斯那里得到论文。答案 2 :(得分:1)
有两种方法可以解释你的问题:作为理论计算机科学问题;并且,作为一个实际的工程问题。
已经有一个答案倾向于理论答案。所以,我将更多地去实践方面。
我认为你需要整数,指针,变量,if语句,循环语句和函数。正如另一篇文章指出的那样,你需要从文件中读取一些内容来获取源代码以编译和写入文件以保存生成的程序集或目标代码。
我建议您查看Small C compiler。它是C子集的编译器,能够自行编译。如果你查看Wikipedia page for Small C,你会看到一些关于编译器的书籍。虽然这些书已绝版,但您可以找到一个可用的秒针。