创建“独立”编译器时遇到困难

时间:2018-08-14 07:28:56

标签: c linux compiler-construction programming-languages

现在,在我开始提出愚蠢的问题之前,我想说我在JavaScript和C#方面都有丰富的经验。
因此最近,我开始了创建自己的编程语言的旅程。 我找到了一个使用javaScript的优秀教程 (http://lisperator.net/pltut/dream),但我不太明白这件事。 如何创建“独立”编译器。现在,这是一个虚构的词,用于描述作为一个全新程序运行的编译器。例如“ node index.js”。您不必用其他正确的方法编译编译器。
如果我用JavaScript创建编译器,那么我仍然需要像这样为前“ node editor.js nameofthefile.ext”编译编译器。
因此,我发现了所谓的引导编译器。因此,例如,您使用Java或C为新语言创建了一个编译器,然后创建了用该新语言编写的新编译器,然后使用该编译器对其进行编译,从而获得了用该新语言编写的新编译器。但是我还是不知道如何运行。
例如,如果要使用C(这是我打算做的事情),那么我将拥有一个名为compile.c
的文件。 现在,我需要编译C代码,例如执行“ make compile.c”,这给了我C代码的编译版本,称为“编译器”(在我使用的Linux中)或“ compiler.exe”(在Windows中)。
因此,现在要运行该程序,我可以执行./compiler,而不是给它例如参数/path/to/the/programming_language.someExt
如果一切运行良好,那将可以完成我用新语言编写的程序所能做的事情。
但是即使现在,我也无法将该版本的编译器提供给Windows用户,因为编译器需要是.exe文件。
如果您仍在阅读本文,还有更多... 如果随后要引导当前编译器怎么办?
因此,现在它本身的编译器将称为Compiler.theExtOfTheProgrammingLang,我要编译的代码将为hello_world.theExtOfTheProgrammingLang。但是现在我不能只运行编译器,因为我需要首先使用以前的编译器进行编译。
这一切都使我的脑袋一团糟,但我不想放弃。

2 个答案:

答案 0 :(得分:3)

我会尽力为你画一幅画。
您正在创建一种新的语言L。对于这种语言,您编写了Java中的编译器C L (例如),该编译器从L编译为x86,并创建了ELF可执行文件(即Linux可执行文件)。您需要使用JVM才能使用C L (从技术上讲,有一些工具链可以将Java编译为本机,但是可以忽略它)。
假设您不想受到JVM的约束,而是希望在Linux上本地运行。好吧,没问题。您刚刚编写了一个从L编译为本地Linux可执行文件的编译器。您只需要使用该编译器C L 来编写新的编译器C2 L 。 C2 L 与C L 的功能相同,只是它是用L而不是Java编写的,因此您可以使用C L < / sub>(在JVM上运行C L )。编译完C2 L 后,您将不再需要JVM运行或编译任何东西,因为C2 L 是本地运行的,并且可以编译为本地可执行文件。

现在,如果要创建在Windows上运行的另一个编译器,则需要创建第三个编译器C3 L ,它将L编译为本机EXE(或任何其他方式)您将选择与Windows兼容的格式)-该编译器将使用C L 或C2 L 进行编译。编译完C3 L 后,您可以将该可执行文件带到Windows计算机上。

答案 1 :(得分:0)

研究bison / flex(yacc / lex)并获得有关编译器和形式语言的书,这是一本不错的书https://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811。由于它的语言结构较简单,因此您可能首先要制作一个decaf编译器。大多数大学都公开有一个decaf编译器项目。这是一个:https://parasol.tamu.edu/courses/decaf/students/