引导其编译器所需的语言功能的最小子集是什么?

mah*_*dix 2 compiler-construction bootstrapping language-design

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

Jör*_*tag 5

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

\n\n

whileif并且一个整型变量是图灵完备的,即它可以计算任何图灵可计算的函数。编译器是图灵可计算的函数。无法接受任何输入或产生任何输出的编译器非常无聊,因此您需要有一种方法来读取一些输入并写入一些输出。

\n

  • “`while` + `if` + bigint”对于图灵完备语言来说已经足够,但不是必需的。也就是说,如果您有其他功能(例如递归)来弥补,则不需要所有这些功能都是图灵完备的。你甚至不需要图灵完备的语言来编译大多数语言。例如,当用 foreach 循环替换 while 循环时,我仍然可以用您的语言编写 Brainfuck-to-assemble 编译器,这不再是图灵完整的。事实上,您可能可以通过这种方式编译大多数语言。Brainfuck-to-C 编译器甚至不需要变量(如果我们有 IO)。 (4认同)
  • 我出于懒惰而使用图灵完备性:我不想遍历整个 ISO C11 规范并弄清楚编译器必须有多强大,所以我选择了图灵完备性,因为我*知道*这已经足够了。我选择了 `while` + `if`,因为 OP 正在谈论使用 C 的最小子集来编译 C,并且 `while` + `if` 在 C 中很容易使用,与正确的尾递归、正确的尾调用不同、惰性或一些其他功能,例如在 C 的最小子集中以 lambda 演算或组合器风格进行编程。 (2认同)