因此,我现在有一个相当完整的用Haskell编写的LISP(方案)解释器。为了好玩,我想尝试将它编译为LLVM。大多数代码生成看起来非常简单,但我不知道如何生成lambda
表达式(在lisp中很重要)的代码,以及在遇到define
表达式时如何管理堆。为'lambda','define'生成LLVM代码
我该如何为这些表达式生成代码?
注意:我可以为lambda表达式的主体生成代码,什么让我感到困惑的是如何将代码“放”在某处并使其可调用。
因此,我现在有一个相当完整的用Haskell编写的LISP(方案)解释器。为了好玩,我想尝试将它编译为LLVM。大多数代码生成看起来非常简单,但我不知道如何生成lambda
表达式(在lisp中很重要)的代码,以及在遇到define
表达式时如何管理堆。为'lambda','define'生成LLVM代码
我该如何为这些表达式生成代码?
注意:我可以为lambda表达式的主体生成代码,什么让我感到困惑的是如何将代码“放”在某处并使其可调用。
见伦纳特的博客文章:http://augustss.blogspot.com/2009/06/more-llvm-recently-someone-asked-me-on.html
看那compileFunction
功能。特别是,LLVM核心中的newFunction
:http://hackage.haskell.org/packages/archive/llvm/0.9.1.2/doc/html/LLVM-Core.html#g:23
在博客文章中编译的语言是第一顺序,根本不处理闭包。我不明白这对编译lambda表达式有什么帮助。 – sepp2k 2011-06-15 19:17:10
@ sepp2k您需要首先进行闭包转换,因为他正在阅读SICP,所以我认为John正在这样做。 – 2011-06-15 19:22:54
我可能是错的,但我不记得在SICP中包含关闭转换。 – spacemanaki 2011-06-15 20:14:02
您可能希望在代码生成之前实施显式拉姆达升级过程(因为它是Scheme,因此您可能会在此之前进行CPS转换) 。它只会给你留下全球职能和明确的关闭环境分配。 – 2011-06-16 16:20:55