如何创建自己的C ++编译器?
0 1650
1
该提问暂无详细描述
收藏
2021-01-16 16:51 更新 anna •  5042
共 1 个回答
高赞 时间
0

我在做你想做的事。我开发一种编程语言,并从C ++编译器开始。

我不知道你的能力 但是我不在乎。你将必须学习很多知识,即使实际上从未创建C ++编译器,尝试它也将很有用。

因此,起初,你应该能够对C ++编程以及有关机器有一定的了解。你应该至少具有有关汇编程序编程的基础知识,并且至少应具有该领域的一点经验。特别是在调试中。

有人提到《the Dragons Book》。我也拥有一本,因为作为编译器构造函数,你必须拥有它。这是编译器构造的圣经。作为圣经,我打开它,发现它没有答案。从那时起,它就站在我的书架上,每个看到它的人都立即知道我对编译器的构建很认真。我想那是那本书的实际价值。

你要考虑什么:你必须解析文件。因此,你必须将源代码转换为抽象语法树。我建议编写一个可以计算这样的表达式的控制台应用程序。

计算“((1 + 2)* 3 ^ 4” 这是解析和创建简单AST的良好培训。这应该看起来像这样: 然后有趣的部分出现了,《the Dragons Book》似乎失去了作用:你必须了解什么类型。你必须考虑如何使用值,指针,引用和const正确性以及结构,函数和方法来表示类型,还必须考虑如何转换类型,例如float + double 。什么是instance.method()?

你必须创建可以询问的容器。就像我在这里有一个函数调用一样,它被称为func ,它有两个参数,一个整数和一个双精度型。我们是否知道具有该名称的函数,并且可以从该命名空间中看到它吗?

你需要了解lvalue,rvalues,xvalues,prvalues。 拥有有效的抽象语法树后,你可以在其中提出问题,然后可以考虑对其进行优化。1和2是常量值,没有任何副作用,因此你可以在编译时设置它们:3、3和4:也就是81。这两个值都是常量。3 * 81是243。因此-作为编译器-你可以优化整个计算。

解析时,必须确保获得有价值的错误消息。你将为此花费很多时间。同样,函数调用func :我们看到一个函数func,但是(int,double)不匹配。你必须交付double和int。再次不幸的是,这不是编译器构造书籍的主题。这将是“可用的编译器构造”书中的主题。

然后编写一个代码生成器。你必须确保AST是正确的,因此现在AST是你的源代码。此时,你至少需要有关汇编编程的知识才能生成汇编。

也许你想拥有二进制文件,那么你需要有关ELF,Mach-O或PE的知识。然后,为所需的文件格式构建一个容器,并为要编译的计算机生成操作码。

在此过程中,你将了解C ++是我们拥有的最好的工具。而且有充分的理由进行Java和C#的设计-不幸的是,这对编译器设计人员(而不对用户)有利。

我在2016年的MeetingC ++会议上遇到了Bjarne Stroustrup。所以我告诉他,我也在研究一种新语言,并问他是否对我有帮助,今天他是否会开始使用新的编程语言。他告诉我看一下LALR解析器。到目前为止我还不了解他们。幸运的是,我在不知道LALR解析器已经发明并命名的情况下开发了它。也许这是开始你的项目的一个很好的介绍点。

该回答来自:https://www.quora.com/How-can-I-create-my-own-C++-compiler

收藏
2021-01-16 17:06 更新 karry •  4540