C 在LLVM中处理动态类型变量

C 在LLVM中处理动态类型变量,c,llvm,llvm-clang,C,Llvm,Llvm Clang,作为学习练习,我最近编写了一种动态类型解释编程语言。我现在希望能够通过LLVM的C绑定生成LLVM位代码,但在处理“无类型”变量时,我遇到了困难。由于IR是强类型的,我最初的想法是将IR中的值表示为结构,就像这样(其中type表示数值、布尔值或字符串值): 为了帮助操作Valuestructs,我将把生成的位代码与我的LLVM IR可以调用的静态库链接起来。静态库将处理字符串连接和数学运算符的执行等操作,返回结果值,如下所示: Value apply_op(char *op, Value *lh

作为学习练习,我最近编写了一种动态类型解释编程语言。我现在希望能够通过LLVM的C绑定生成LLVM位代码,但在处理“无类型”变量时,我遇到了困难。由于IR是强类型的,我最初的想法是将IR中的值表示为结构,就像这样(其中
type
表示数值、布尔值或字符串值):

为了帮助操作
Value
structs,我将把生成的位代码与我的LLVM IR可以调用的静态库链接起来。静态库将处理字符串连接和数学运算符的执行等操作,返回结果
,如下所示:

Value apply_op(char *op, Value *lhs, Value *rhs);

但这是最好的办法吗?如上所述,这在很大程度上是一个学习练习,所以我想确保我没有使事情过于复杂,或者从根本上误解LLVM功能的核心部分

虽然我认为这个问题太宽泛了,但我想知道你是指弱类型还是动态类型。请注意,这些是非常不同的主题。对于后者,OOP方法可能是最好的;您还可以如何在
结构中表示编译时定义的类型呢?这就是动态类型的值通常存储的方式,但我认为字节码通常是动态类型的,所有内容都在解释器中处理。Python和Perl源代码可能值得一看。JVM热点langauges可能是静态类型字节码用于动态语言的一个很好的例子。@Olaf我的意思确实是动态类型的。关于您关于编译时定义类型的问题,如果我理解了这个问题,我会生成LLVM IR来分配
结构的一个实例,并将其类型设置为匹配右侧常量(即:
a=1
将生成一个带有数字类型的
结构)@ndg:我的重点是,如果右边的类型是用户定义的tpye,即复合类型,会怎么样?我将不再进一步讨论,因为这违反了站点规则,但您可以看看其他动态类型语言,如Python、Ruby或-AFAIK-Lua。请注意,至少Python和Ruby是非常好的强类型语言(但不确定Lua)。这就是我在工作中实现动态类型语言的方式。对于一些简单的情况(int,浮点,日期,…),值的创建是由IR直接完成的(代码生成器使用C++类来包装LLVM::Value*,并且具有像SETINT、SETFLASH、……这样的函数)。对于更复杂的情况(元组、字符串…),IR调用运行时支持例程,就像在代码中一样。
Value apply_op(char *op, Value *lhs, Value *rhs);