在创建 "stand alone" 编译器时遇到困难

Having difficulties creating a "stand alone" compiler

现在,在我开始问愚蠢的问题之前,我想说我在 JavaScript 和 C# 方面都有丰富的经验。
所以最近我开始了创建自己的编程语言的旅程。 我找到了一个使用 javaScript 的好教程 (http://lisperator.net/pltut/dream) 但我不太明白这一点。 如何创建 "stand alone" 编译器。现在,这是一个虚构的词,用来描述 运行 作为一个全新程序的编译器。例如 'node index.js'。你不必用其他东西编译编译器。
如果我用 JavaScript 创建编译器,我仍然需要像这样为 ex 'node compiler.js nameofthefile.ext'.
编译编译器 然后我发现那个叫做 bootstrapping 编译器的东西。因此,您使用 Java 或 C 为新语言创建编译器,然后创建用新语言编写的新编译器,并使用该编译器编译它以获得用新语言编写的新编译器.但我仍然不明白如何 运行 它。
例如,如果要用 C 来实现(这就是我打算做的),那么我会将该文件命名为 compiler.c
现在我需要编译 C 代码,所以我做了例如 'make compiler.c',这给了我一个编译版本的 C 代码,称为 'compiler'(在我使用的 Linux 中)或 'compiler.exe'(在Windows)。
所以现在 运行 那个程序我可以做 ./compiler 然后给它一个参数 the/path/to/the/programming_language.someExt
如果一切 运行 都很好,那将做我用新语言编写的程序所做的一切。
但即使是现在我也无法将那个版本的编译器提供给 windows 用户,因为编译器需要是 .exe 文件。
如果您仍在阅读本文,还有更多... 如果然后想要 bootstrap 当前编译器怎么办。
所以现在它自己的编译器将被称为 compiler.theExtOfTheProgrammingLang 而我想要编译的代码将是 hello_world.theExtOfTheProgrammingLang。但是现在我不能只 运行 编译器,因为我需要先使用以前的编译器编译它。
这一切让我脑子一片混乱,但我不想放弃。

查看 bison/flex (yacc/lex) 并获得一本关于编译器和形式语言的书,这是一本好书 https://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811. You might want to start by making a decaf compiler due to its simpler language constructs. Most universities have a decaf compiler project write up that is publicly available. Here is one: https://parasol.tamu.edu/courses/decaf/students/

我会试着给你画一幅画。
您正在创建一种新语言 L。对于那种语言,你写了一个编译器,CL in (for instance) Java 从 L 编译到 x86 并创建一个 ELF 可执行文件(即 Linux 可执行)。您需要使用 JVM 才能使用 CL(好吧,从技术上讲,有工具链可以将 Java 编译为本机,但让我们忽略它)。
假设您不想受 JVM 限制,而是更喜欢在 Linux 上原生使用 运行。嗯,没问题。您刚刚编写了一个从 L 编译为本机 Linux 可执行文件的编译器。你只需要使用那个编译器 CL 来编写一个新的编译器 C2L。 C2L 与 CL 的作用相同,只是它是用 L 而不是 Java 编写的,因此您可以编译它使用 CL(JVM 上的 运行ning CL)进行本地化。一旦你编译了 C2L,你不再需要 JVM 来 运行 或编译任何东西,因为 C2L 运行s 本机并编译为本机可执行文件。

现在,如果您想创建另一个 运行 在 Windows 上的编译器,您需要创建第三个编译器 C3L ,将 L 编译为本机 EXE(或您选择的任何 Windows 兼容格式)- 该编译器将使用 CL 或 C2L。一旦你编译了 C3L,你就可以将该可执行文件转移到 Windows 机器上,你就完成了。