Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.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
C++ 用LLVM-IR实现动态类型化语言_C++_C_Compiler Construction_Llvm_Language Design - Fatal编程技术网

C++ 用LLVM-IR实现动态类型化语言

C++ 用LLVM-IR实现动态类型化语言,c++,c,compiler-construction,llvm,language-design,C++,C,Compiler Construction,Llvm,Language Design,我正在尝试使用LLVM C API为动态语言构建JIT编译器,但我一直在实现动态类型,例如在函数定义中,LLVM需要每个参数的类型,但在运行时根据用户传递的内容未知该类型,我在谷歌上搜索了一段时间,但没有任何关于它的好资源,我还试着查看Julia的源代码,看看他们是如何做到的,不幸的是,代码又大又复杂,我不得不到处张望才能找到这样一个小细节,从我目前所看到的来看,它们将其类型表示为一个空的LLVM结构指针和一个包含一些额外数据的func sig类型,但是我很不确定它是如何工作的,或者我解释它是正

我正在尝试使用LLVM C API为动态语言构建JIT编译器,但我一直在实现动态类型,例如在函数定义中,LLVM需要每个参数的类型,但在运行时根据用户传递的内容未知该类型,我在谷歌上搜索了一段时间,但没有任何关于它的好资源,我还试着查看Julia的源代码,看看他们是如何做到的,不幸的是,代码又大又复杂,我不得不到处张望才能找到这样一个小细节,从我目前所看到的来看,它们将其类型表示为一个空的LLVM结构指针和一个包含一些额外数据的func sig类型,但是我很不确定它是如何工作的,或者我解释它是正确的,任何资源都是有用的,一个示例代码是最受欢迎的,这个例子不一定是在C API中,C++也很好,我将自己或其他方式转换。
提前感谢。

LLVM IR与此无关。它已经是一种语言了。当然是静态类型的。它对可以编译的内容没有影响

有很多方法可以做到这一点,但归根结底,这和为任何动态类型语言实现JIT编译器没有什么不同

想想你希望它如何工作。它将如何运作。其他动态类型语言如何处理这个问题

提示:它们都是类型化的,即使它们只有3种类型:Object、String和Number,如果不是更少的话。它们只是使用某种方法在运行时确定引用的类型


你是否有一个现有的语言在头脑中,还是你在设计它的过程中?如果是前者,那么就研究现有的实现/规范,如果是前者,那么你可以做任何你想做的事情,真的,你有所有的能力。

你有具体的问题吗?询问示例或任何非现场资源是非主题的。您可能希望将语言的值实现为标记的联合或指针,而您的LLVM IR将返回该类型。这是一个很长的句子,没有问题!问题是如何做到这一点。动态类型是您传递的值的属性。然而,该值本身具有静态类型。例如,您可以传递std::variant:它是一个静态类型的动态类型值。它的动态类型就像一种颜色:仅仅因为汽车有很多颜色——动态方面,它们仍然是汽车。仅仅因为值有许多动态类型,它们仍然是值:这暗示您需要一个表示动态类型值的具体值类型。如果你将具体类型放入一个void*中,那么你将传递一个大小合适的整数。谢谢,我在脑海中想到了类似于ruby的东西,我想我将研究MacRuby是如何实现的它是ruby与LLVM的一个实现,虽然代码已经中断,但仍然可能有帮助。@FreeTNT所以您正在创建自己的语言。在这种情况下,您实际上不需要考虑LLVM,尤其是IR。想一想它下面是怎么工作的。LLVM IR或多或少只是更高级别的asm。实施细节。您提出了如何在您的语言中实现动态类型。然后通过LLVM实现它。也可以用C/C++进行编译。或者别的什么。这只是一个后端。在您自己的语言中,您可以将foo+42转换为您想要的任何内容。