正如我已经指出的 – 在这里 – 似乎clang的libclang应该是伟大的执行艰巨的任务是C / C + +代码分析和修改( 检查video演示和幻灯片 )。 你知道任何基于libclang的C / C ++重构工具吗? “任何”包括简单的阿尔法状态项目,支持一种重构技术。 它可以没有预处理器的支持。 作为我正在谈论的function的一个例子:更改方法名称,一次是支持多个文件还是只支持一个文件。 您可能想知道什么是要求甚至是小的工作示例的目标我的想法是, 在一个地方创build一个代码示例和小工具的列表将提供更好的资源来学习如何使用libclang实现重构 。 我相信,从简单的项目可能会扩大更大的项目 – 以适当的开源方式:)。
在最新的iOS SDK中,Apple提供了三种编译器选项:GCC,Clang和LLVM-GCC。 我或多或less地理解这三个含义,LLVM和Clang是什么,等等。 我不知道的是这对于iPhone开发者来说意味着什么。 截至2011年1月,我现在应该使用哪一个? LLVM是否已经足够成熟,我可以安全地使用它,而不会经常绊倒其中的错误? 切换到LLVM是否有其他缺点? 如果是这样,那么速度优势是否超过了它们呢? 除了速度之外还有其他什么原因需要切换吗?
许多dynamic语言实现(或想要实现)JIT编译器,以加快执行时间。 不可避免的是,花生画廊的人问他们为什么不使用LLVM。 答案往往是“LLVM不适合build立JIT”。 (例如,Armin Rigo 在这里的评论。 ) 为什么LLVM不适合build立JIT? 注意:我知道LLVM有自己的JIT。 如果LLVM过去不合适,但现在适合,请说出是什么改变了。 我没有谈论在LLVM JIT上运行LLVM Bytecode,我正在讨论使用LLVM库来实现dynamic语言的JIT。
我不明白LLVM和Java(字节码)之间的区别,它们是什么? -edit-“他们是什么”我的意思是LLVM和Java(字节码)之间的差异,而不是什么LLVM和Java。
我知道我可以键入print someFloatVariable当我设置断点或po [self someIvarHoldingAnObject] ,但我不能做有用的事情,如: [self setAlpha:1]; 然后吐出来: 错误:'[self'不是一个有效的命令。 奇怪的是,我可以打电话给po [self someIvarHoldingAnObject] ,它会打印它的描述。 我相信我在一年前看过一个video,有人演示了如何在运行时通过控制台执行代码,如果我没有弄错,这个人也提供了参数和指向对象的指针。 怎么做?
我想这个问题很清楚。 我试图编写一个编译器检测头,以便能够在应用程序信息中包含使用哪个编译器以及哪个版本。 这是我使用的代码的一部分: /* GNU C Compiler Detection */ #elif defined __GNUC__ #ifdef __MINGW32__ #define COMPILER "MinGW GCC %d.%d.%d" #else #define COMPILER "GCC %d.%d.%d" #endif #define COMP_VERSION __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ #endif 可以这样使用: printf(" Compiled using " COMPILER "\n", COMP_VERSION); 有没有什么办法可以检测LLVM及其版本? 和CLANG?
LLVM有phi指令,相当怪异的解释: 'phi'指令用于实现表示函数的SSA图中的φ节点。 通常用于实现分支。 如果我理解正确,就需要进行依赖关系分析,在某些情况下可以避免不必要的加载。 然而,它仍然很难理解它究竟做了什么。 万花筒的例子很好地解释, if情况。 但是,如何实现逻辑运算(如&&和||还不是很清楚 。 如果我input以下命令联机llvm编译器: void main1(bool r, bool y) { bool l = y || r; } 最后几行完全混淆了我: ; <label>:10 ; preds = %7, %0 %11 = phi i1 [ true, %0 ], [ %9, %7 ] %12 = zext i1 %11 to i8 看起来像phi节点产生可以使用的结果。 我还有一个印象,就是phi节点只是定义了来自哪个path的值。 有人可以解释什么是Phi节点,以及如何实现|| 用它?
在了解了LLVM的工作原理之后,我对如何生成可移植的底层代码以及如何构build这个“事物”模块感到非常兴奋。 但是我今天发现了C似乎与LLVM有一些概念的存在。 所以我在寻找一些信息,帮助我理解这两个项目之间的主要区别……为什么两者都存在。 对我来说,LLVM看起来有点像编译器基础架构的终极瑞士军刀,C–看起来远不如先进。
在Haskell LLVM绑定中 ,我试图用可变数量的参数定义一个函数(实际上我是指在编译时不知道的常量)。 我发现这个问题 ,我正在试着回答。 我不想完全回退使用FFI来生成LLVM,我想尽可能多地使用DSL,并使用FFI来做我不能通过DSL做的事情。 我设法通过functionType定义一个types,我仍然无法添加一个函数调用defineModule创build一个模块。 我也认为下一步是通过FFI.appendBasicBlock来添加基本块,我认为这很容易,但是我怎样通过CodeGenFunction monad中的do块内的CodeGenFunction获取参数。
目前我一般对ARM有兴趣,特别是iphone / android目标。 但是我只想更多地了解铿锵声,因为它感觉在未来几年发挥重要作用。 我试过了 clang -cc1 –help|grep -i list clang -cc1 –help|grep arch|grep -v search clang -cc1 –help|grep target -triple <value> Specify target triple (eg i686-apple-darwin9) 我知道铿有三元参数,但我怎么能列出所有可能的值? 我发现clang与gcc在交叉编译方面有很大的不同,在GCC世界里,你应该为每个东西都分开二进制文件,比如PLATFORM_make或者PLATFORM_ld(我* 86-pc-cygwin我* 86 – * – linux-gnu等等http ://git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS ) 在叮当世界,这只是一个二进制(正如我在一些论坛上看到的)。 但是,如何获得支持的目标列表? 如果我的目标不支持我的发行版(linux / windows / macos /其他),我怎么能得到支持更多平台的? 如果我SVN最新的铿锵这样的: svn co http://llvm.org/svn/llvm-project/cfe/trunk clang 我会获得大部分的平台吗? 看起来Clang并不是立刻用交叉编译来构build的,但是因为它是基于llvm的,理论上应该是非常交叉友好的? 谢谢!