Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
基于LLVM编译的特权和管道 我看到越来越多的人转向LLVM,尤其是C或C++背景的人,所以有一种模式,人们正在接近这个编译器,让我吃惊的是LVVM能够管理的高度异质性的技术集合。我不知道这个虚拟机遵循的是什么管道,以及由此带来的好处是什么_Llvm - Fatal编程技术网

基于LLVM编译的特权和管道 我看到越来越多的人转向LLVM,尤其是C或C++背景的人,所以有一种模式,人们正在接近这个编译器,让我吃惊的是LVVM能够管理的高度异质性的技术集合。我不知道这个虚拟机遵循的是什么管道,以及由此带来的好处是什么

基于LLVM编译的特权和管道 我看到越来越多的人转向LLVM,尤其是C或C++背景的人,所以有一种模式,人们正在接近这个编译器,让我吃惊的是LVVM能够管理的高度异质性的技术集合。我不知道这个虚拟机遵循的是什么管道,以及由此带来的好处是什么,llvm,Llvm,我想强调的是,我关注的是LLVM,而不是clang 百万分之一的例子是,管道对我来说并不明显,或者,显然有很多完全不同的解决方案,例如,LLVM与JIT解决方案结合使用 简而言之,我看到了不同的语法和语义,人们使用LLVM生成GPU着色器或二进制对象,但我看不到共同点 “LLVM编译”的含义是什么,考虑LLVM作为一个黑箱,中间的输入、输出和业务逻辑是什么类型? 我看不出共同点 共同点是将一种语言的代码转换为另一种语言的代码。而这正是编译器所做的。因此,如果您想将“源语言”中的一段代码转换为“目

我想强调的是,我关注的是LLVM,而不是clang

百万分之一的例子是,管道对我来说并不明显,或者,显然有很多完全不同的解决方案,例如,LLVM与JIT解决方案结合使用

简而言之,我看到了不同的语法和语义,人们使用LLVM生成GPU着色器或二进制对象,但我看不到共同点

“LLVM编译”的含义是什么,考虑LLVM作为一个黑箱,中间的输入、输出和业务逻辑是什么类型?

我看不出共同点

共同点是将一种语言的代码转换为另一种语言的代码。而这正是编译器所做的。因此,如果您想将“源语言”中的一段代码转换为“目标语言”中的一段代码,您需要做的是:

  • 编写一个“前端”——将源语言转换为LLVM期望的输入语言的组件。该语言是一种特定于LLVM的语言,称为“LLVM位码”或“LLVM IR”。
    • 或者,重用现有的前端—例如Clang
  • 编写一个“后端”——将LLVM发出的内容转换为目标语言的组件。
    • 或者使用现有的后端,例如LLVM的x86后端
  • 就这样。现在您可以享受LLVM在其输入和输出之间对代码执行的优化、将代码“降低”到更接近机器代码的通用框架等


    GCC的行为也一样,顺便说一句,只是许多人认为LLVM在某些方面具有优势,特别是许可和易于修改。

    LLVM相对于其他源代码可用编译器的优势在于它被设计为一组可重用的库。这在某种程度上意味着您可以选择要包含在工具中的内容。不是每个语言工具都需要优化,也不是每个语言工具都需要代码生成。LLVM是一个非常灵活的语言处理系统

    通常,当人们说“基于LLVM的编译”时,他们指的是使用一个或多个LLVM库来实现他们的工具。他们可以利用投入LLVM的所有工作来理解其IR并为多个目标生成代码

    LLVM IR是大多数LLVM库使用的通用表示形式。它是您需要写入的接口。对于像机器代码这样的低级代码,您需要处理一些其他LLVM表示(MachineInstr、MC等)

    至于编写前端以生成LLVM IR,棘手的部分是确保从源语言到LLVM IR的翻译保留源语言的语义。LLVM IR对每个指令都有一个定义良好但层次较低的语义集。如果源语言具有更高级别的语义,则必须将它们降低到LLVM IR指令序列中才能实现它。例如,没有处理C样式位字段访问的LLVM指令,因此C语言前端必须使用一系列LLVM指令来实现功能(通常是移位和按位操作)


    只要您在LLVM IR中正确地实现了源语言的语义,LLVM库就可以执行正确的代码转换。如果某些所需的转换需要比LLVM IR提供的更高级别的语义信息,那么您必须在转换为LLVM IR之前的某个阶段进行转换(这样您就可以获得高级别的信息)或者,您可以在LLVM IR中传递属性信息来传递高级语义,并编写自定义LLVM传递来实现转换。前者通常比后者干净得多。

    好的,但是,以GLSL为例,LLVM并不真正了解GLSL作为一种语言,所以我为它编写了一个前端,但是如果LLVM一开始就不真正了解GLSL,它如何优化我的源代码?这里有一个关于这个东西的指南,所以我可以读一些关于它的东西?@user2485710 LLVM也不知道C,但它仍然可以优化它。关键是它只知道一种语言——它的IR(中间表示法)——但它可以很好地优化它,所以你所需要做的就是转换成那个IR。大多数(如果不是全部的话)优化编译器都是这样工作的——再举一个例子,JVM完全不了解Java(语言)——它只知道运行Java字节码,这也是一种中间表示形式。我假设这就是为什么Android下的Dalvik可以同时用于Java和C/C++/本机代码的原因?您能推荐一些关于使用LLVM创建前端或后端的内容吗?@user2485710编译是一个广泛的领域,如果您真的感兴趣,我建议您阅读或阅读一些。如果你想直接跳进去,那就去看看吧。有关后端设计的一些信息,请查看,但请记住它的重点是基于寄存器的机器代码生成。