有关编译器的基本课程

时间:2019-01-12 17:47:41

标签: compiler-construction

几个月来,我试图了解编译器的工作方式。目前,我不在乎语法分析,将其拆分为令牌并创建AST。我想重点介绍可执行文件的创建。据我所知,编译器将代码分解并转换为汇编指令,然后以某种方式将其转换为可执行代码。

我想为自定义编程语言创建一个基本的编译器。这样做是唯一的可能,需要一个汇编程序,将我的源代码转换为汇编语言,然后进行汇编吗?或者可以在不使用第三方工具的情况下创建可执行文件。我的项目中唯一缺少的代码段是如何从汇编指令中准确创建EXE文件。

我知道这是一个非常复杂的话题。这就是为什么我一直在寻找创建跨平台编译器的技术的原因。我还想知道是否可以使用g ++之类的编译器,将代码转换为C ++代码并用 g ++。那是一个替代计划,但仍然不是我想要创建的计划。我是否必须为每个单独的处理器体系结构编写一个编译器/汇编器,我基本上该如何做?经过几个月的研究,我终于决定去问问对此主题有更好了解的人。

我希望你能放开我的胸怀。 :)

问候BraunBerry

1 个答案:

答案 0 :(得分:3)

您的问题大多是题外话。但是,关于编译的好书是The Dragon Book。 (而且您还可以阅读Scott的Programming Language Pragmatics和Queinnec的Lisp In Small Pieces

  

据我所知,编译器将代码分解并转换为汇编指令,然后以某种方式将其转换为可执行代码。

这要复杂得多。编译器实际上(并且多次)经常出于 optimization的目的而对某些内部表示进行转换(优化是一个重要但困难的话题,例如,这就是there are few C compilers的原因。.例如,大多数GCC优化遍(GCC有数百遍)正在将Gimple转换为Gimple (例如,inliningloop unrolling等)。

  

这就是为什么我一直在寻找创建跨平台编译器的技术的原因。我还想知道是否可以采用g ++之类的编译器,将我的代码转换为C ++代码并用g ++进行编译。

通常,许多人使用C作为可移植的目标编程语言,而不是C ++。 This answer解释了更多。实际上,可能很难生成具有良好气味的C ++代码(例如,使用C ++容器和智能指针)。最后,您的系统C ++编译器可能需要很多时间来编译生成的C ++代码(换句话说,C ++的编译速度很慢)。

  

或者可以在不使用第三方工具的情况下创建可执行文件。

有可能,但是为什么要避免使用第三方工具?请注意,许多编译器至少使用汇编器和链接器(并且都具有“第三方工具”的资格)。如果选择生成C(可能是一个不错的选择),则您将使用的C编译器是第三方工具(而​​且是一个很大的工具!)。

如果您想直接自己生成可执行文件(我不建议您这样做,这是很多工作),则需要准确了解可执行文件的file format(特定于操作系统),例如ELFPE。我推荐Levine的书Linkers and Loaders。您可能还需要了解如何针对您的操作系统执行system calls(因此请阅读Operating Systems: Three Easy Pieces),并且您需要为您的语言实现一些standard librarydynamic linking使事情复杂化。

您可以考虑使用JIT转换库,例如libgccjit和其他(提到here)。

  

我是否必须为每个单独的处理器体系结构编写一个编译器/汇编器,我该如何基本上做到这一点?

大多数编译器通过定义一些目标无关的中间表示形式来解决该问题(例如,对于GCC,Gimple)。大多数优化都是在(和使用)中间表示形式上完成的。

PS。在您的情况下,我强烈建议为Linux和更高版本构建编译器,因为Linux由free software组成,您可以研究其source code。如果您使用的是Windows proprietary software,则某些细节是不公开的,对您来说很重要,因此您将需要大量时间reverse-engineer