Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 使用LLVM IR实现动态类型化Lanugage_Compiler Construction_Compilation_Llvm_Llvm Ir_Dynamic Typing - Fatal编程技术网

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有点过头了,但对这个问题的回答可能对其他人还是有用的。(真正好的答案会很长,所以最初的结论过于宽泛是完全可以辩护的。)