Compiler construction 使用LLVM IR实现动态类型化Lanugage
我试图用动态类型实现一种玩具语言,即变量没有类型,只有值有类型,每个变量在使用前都需要声明。例如,代码可能看起来像Compiler construction 使用LLVM IR实现动态类型化Lanugage,compiler-construction,compilation,llvm,llvm-ir,dynamic-typing,Compiler Construction,Compilation,Llvm,Llvm Ir,Dynamic Typing,我试图用动态类型实现一种玩具语言,即变量没有类型,只有值有类型,每个变量在使用前都需要声明。例如,代码可能看起来像var x;x=3;x='a'。此外,我想将这个玩具语言编译成本机代码,而不是在某个虚拟机中运行它 目前,我已经生成了AST,我将使用LLVM C++ API将AST编译成LVVM IR。问题是,我应该生成什么样的IR 变量声明(带或不带初始值,如var x;或var y=3.4; 变量访问(如c=a+1中的a) 这个问题的答案取决于GC。如果您在运行时使用GC,变量都应该是指向表示
var x;x=3;x='a'代码>。此外,我想将这个玩具语言编译成本机代码,而不是在某个虚拟机中运行它
目前,我已经生成了AST,我将使用LLVM C++ API将AST编译成LVVM IR。问题是,我应该生成什么样的IR
变量声明(带或不带初始值,如var x;
或var y=3.4;
变量访问(如c=a+1
中的a
)
这个问题的答案取决于GC。如果您在运行时使用GC,变量都应该是指向表示代码数据类型的装箱标记联合体的指针。每个操作都应该使用标记检查进行保护。例如,请参见Julia中的操作。如果您没有GC,您仍然需要使用标记联合体,但需要在堆栈i上分配它们nstead(因此,LLVM变量将是一种结构类型,并且您将有很多比特广播-一种低级联合类型早就停止了)。我建议从简单的事情开始:生成代码作为对运行时函数的调用(分配值、检查值类型、返回值内容等),然后开始优化它,用更复杂的IR模式替换函数调用(如果内联处理了它,甚至可能根本不需要)。这是怎么回事?似乎mods不理解这个问题,关闭了这个问题,然后删除了他们的评论。WTF的家伙们?@Navin我想问题是我在这个问题上添加了“c++”标记。我删除了这个标记,但他们仍然关闭了我的问题。我能做些什么来重新打开它吗?我谨慎地投票重新打开。question的措辞表明OP有点过头了,但对这个问题的回答可能对其他人还是有用的。(真正好的答案会很长,所以最初的结论过于宽泛是完全可以辩护的。)