Compiler construction 有趣的编译器项目

Compiler construction 有趣的编译器项目,compiler-construction,Compiler Construction,我目前正在为一门研究生水平的编译器课程选择一个项目,该课程将在未来8周内完成。我想做一些与优化相关的事情,因为我以前没有在这方面做过很多工作,但这方面的任何事情都是公平的 你做过的最有趣的编译器相关项目是什么?你从中学到最多的是什么 编辑:谢谢大家的宝贵建议。我很抱歉这么长时间没有更新 我最后做的项目是在LLVM上进行简单的自动矢量化优化。LLVM有向量类型,但如果不支持前端,似乎无法利用它们。该优化将普通标量码转换为矢量码 由于自动矢量化是一个很难实现的优化,我们尽可能地限制了我们的范围。首

我目前正在为一门研究生水平的编译器课程选择一个项目,该课程将在未来8周内完成。我想做一些与优化相关的事情,因为我以前没有在这方面做过很多工作,但这方面的任何事情都是公平的

你做过的最有趣的编译器相关项目是什么?你从中学到最多的是什么


编辑:谢谢大家的宝贵建议。我很抱歉这么长时间没有更新

我最后做的项目是在LLVM上进行简单的自动矢量化优化。LLVM有向量类型,但如果不支持前端,似乎无法利用它们。该优化将普通标量码转换为矢量码

由于自动矢量化是一个很难实现的优化,我们尽可能地限制了我们的范围。首先,为了在代码中公开指令级并行性,我们寻找符合条件的单块循环,然后将它们展开特定次数,以便它们可以方便地矢量化。然后,我们实现了Larsen和Amarasinghe在中提出的打包算法


即使是这种优化的简化版本也相当复杂。有很多制约因素;例如,您不希望对存在于循环之外的变量进行矢量化,因为程序的其余部分希望它是标量。在过去的几周里我们投入了很多时间。这个项目很有趣,我们学到了很多

我认为编写自己的简单嵌入式脚本语言是我做过的最有趣的编译器相关项目之一。它教会了我从设计到概念的每一个方面,因为我是从头开始做的,所以我可以根据需要使它变得简单或复杂,这使我能够在没有太多噪音的情况下理解概念,而修改一个已建立的项目可能会产生噪音。

我曾经编写了一种编程语言和一台虚拟机来运行它。该语言能够与专门为中编写的函数进行接口,这些函数包含在16位Windows上的DLL(在OLE自动化之前)中


从前面到后面的整个过程让我对一门语言有了很好的理解。当时我读过各种编译书籍(比如臭名昭著的《龙之书》),但直到我写了一些具体的东西,我才真正理解它。现在,许多年过去了,我所做的工作让我对Java VM和CLR工作有了更丰富的理解和理解。

对于学习编译器来说,端到端是最好的主意。使用一个简单的后端机器,而不是x86,而是选择一些简单的机器,如裸体MIPS。我做了我的本科编译器项目,目标是一个PDP-11模拟器,这是一个伟大的目标,因为它使事情非常简单。多亏了一些示例代码,我们可以在大约四周内完成一个简单的命令式语言编译器。用C

如今,有了像ML这样强大的语言,编写编译器应该容易得多

你做什么真的应该取决于你对什么感兴趣。如果是在优化中,找到一种简单的框架,这就是你需要关注的全部


我认为今天最有成效的领域应该是针对线程目标的编译或即时编译

如果您对优化感兴趣,那么使用SSE和MMX指令集对循环进行矢量化可能会很有趣。

循环检测和参数化展开应该很难让它变得有趣。不是很性感,但是在8周内变得太性感会让你沉沦。

在我的本科编译器课程中,我们首先为类Pascal语言从头开始编写了一个递归下降(自上而下)解析器:词法分析器,解析器,一切

大约在学期中途,我们转向了解析器/扫描器生成器,如lex/yacc或flex/bison。我们构建了一个编译器,它将获取我们的Pascal子集,并将其编译成我们给定的堆栈机器的汇编(堆栈机器非常简单,但原理仍然相同)

如果你对编译器感兴趣,我不能高度推荐。它的目的是用于一个学期的本科课程,下半年作为研究生水平的课程,并涵盖了每一个理论和优化您可能希望的位。甚至乔尔


干杯

考虑现有动态类型语言的类型推断。

在8周的时间范围内,您需要小心“范围蔓延”。如果这个项目包括编译器构造的其他方面(词法分析/解析),或者如果您仍在学习工具(调试器、yacc)和中间数据结构(DAG),那就不要太雄心勃勃了

也就是说,我的第一个建议是尝试一些活变量分析。这些算法已经很好地建立起来了,所以您几乎只需要根据您的数据结构对其进行编码,等等

这将允许您执行有限形式的死代码删除。也就是说,如果您检测到一个变量已声明但从未使用过,请不要为它分配空间。如果检测到某个值已设置但从未读取,则不要生成该值集


活变量分析也有助于寄存器分配,因此,如果有时间,您也可以解决这个问题,并且您应该能够重新使用一些构建的内容来删除死代码。

您可以为IronScheme编写一个优化器,就像它目前所做的那样,除了一些“固有”函数之外,它可以实现所有功能<代码>:)

几年前,我设计了一个DSL,并为公司生产的产品编写了编译器。DSL使用了声明性规则、事件驱动逻辑和组合继承的奇怪组合。这是一个非常有趣的项目,我学到了很多

这确实激发了我对解析器和编译器的兴趣,所以我一直在努力跟上编译器技术有趣的新发展