Questions tagged «clang»

5
用于Objective-C开发的警告标志
作为C和Objective-C程序员,我对编译器警告标志有些偏执。 我通常会尝试为我使用的编译器找到完整的警告标志列表,并打开大多数警告标志,除非我确实有很好的理由不打开它。 我个人认为,这实际上可能会提高编码技能以及潜在的代码可移植性,防止出现某些问题,因为它迫使您意识到每个小细节,潜在的实现和体系结构问题,等等。 我认为,即使您是经验丰富的程序员,它也是一种很好的日常学习工具。 对于此问题的主观部分,我有兴趣听取其他有关此主题的开发人员(主要是C,Objective-C和C ++)的信息。 您是否真的在乎诸如脚步警告之类的东西?如果是或否,为什么? 现在关于Objective-C,我最近完全切换到了LLVM工具链(使用Clang),而不是GCC。 在生产代码中,通常会设置以下警告标志(明确地,即使其中一些可能被-Wall覆盖): -壁 -坏功能广播 -Wcast-align -W转换 -W声明后声明 -W弃用的实现 -Wextra -浮子等于 -Wformat = 2 -Wformat-非文字 -Wfour-char-constants -隐式原子性质 -大括号 -遗失声明 -Wmissing-Field初始化程序 -遗漏格式属性 -不愿回报 -遗忘原型 -Wnested-externs -Wnewline-eof -老式风格的定义 -长弦 -希望 -Wpointer-arith -多余的决定 -返回类型 -序列点 -影子 -将64缩短到32 -Wsign比较 -Wsign转换 -严格的原型 -严格选择匹配 -W开关 -Wswitch-默认 -Wswitch枚举 -绝对选择器 -未初始化 -Wonknown-pragmas …

4
GCC vs clang / LLVM —各自的优缺点
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 GCC与clang / LLVM的优缺点是什么?
20 compiler  clang  gcc  llvm 

1
为什么LLVM具有类似程序集的IR,而不是类似树的IR?或者:为什么项目针对LLVM IR而不是clang的AST?
为什么LLVM的中间表示(LLVM IR)类似于树而不是像树? 或者,为什么语言实现针对LLVM IR而不是clang的AST? 我不是想立刻问两个不同的问题。在我看来,似乎客户和库程序员都已达成共识,LLVM的API(仅此而已)显然是好的软件设计,我的问题是“为什么?”。 我问的原因是,如果IR类似于AST,LLVM似乎可以为前端提供更多功能,因为那时clang基于AST的工具可以用于任何前端。另外,如果针对LLVM IR的语言针对clang的AST,则可以获得更多功能。 Clang具有用于创建和使用AST的类和函数,并且它是唯一与LLVM项目紧密相关的前端项目,那么为什么clang的AST功能在LLVM外部? 在我的头顶上,我知道Rust(rustc),D(ldc)和Haskell(GHC)都可以使用LLVM作为后端,但是它们不使用Clang AST(据我所知,我可以是错的)。我不知道这些编译器的所有内部细节,但是至少Rust和D当然看起来可以将它们编译为clang的AST。也许Haskell也可以,但是我对此不太确定。 这是因为历史原因(LLVM最初是“低级虚拟机”,后来出现了clang)吗?这是因为其他前端希望对提供给LLVM的内容进行尽可能多的控制吗?clang的AST不适合“非C类”语言是否有根本原因? 我不希望这个问题成为阅读中的练习。我只是希望它对那些对编译器设计感到好奇但还不太熟练的人有所帮助。由于LLVM和clang项目是公开开发的,所以我希望熟悉这些项目开发的人员可以回答,或者希望答案对于某些自己有足够信心回答的书呆子很明显。 抢占一些显而易见但不令人满意的答案: 是的,拥有类似程序集的IR可以使制作IR的人获得更多控制权(也许X lang比clang更好的代码库和AST格式),但是如果这是唯一的答案,那么问题就变成了“为什么LLVM 仅具有程序集-例如IR,而不是高级树状IR和底层程序集IR?”。 是的,将编程语言解析为AST并不难(至少与其他编译步骤相比)。即使这样,为什么还要使用单独的AST?如果没有其他问题,则使用相同的AST可以使您使用在AST上运行的工具(即使只是简单的东西,例如AST打印机)。 是的,我强烈同意,更加模块化是一件好事,但如果这是唯一的原因,那么为什么其他语言的实现往往针对LLVM IR代替铛的AST? 这些先发制人可能是错误的或忽略了细节,因此,如果您有更多细节或我的假设有误,请随时提供这些答案。 对于任何想回答一个更为明确的问题的人:类组装IR与树形IR的优缺点是什么?

3
C ++:使用编译器API而不是C ++功能进行元编程
这最初是一个SO问题,但我意识到这是非常不合常规的,并且根据网站上的实际描述,它可能更适合程序员。因为该问题在概念上具有很大的分量。 我一直在学习clang LibTooling,它是一个非常强大的工具,能够以友好的方式(即以语义的方式,而不是通过猜测)公开代码的整个“坚韧不拔” 。如果clang可以编译您的代码,则clang 可以确定该代码内每个字符的语义。 现在让我退一步。 当人们从事C ++模板元编程时(特别是当冒险超越模板进入聪明的领域,尽管使人恐惧)时,会出现许多实际问题。老实说,对于包括我自己在内的许多程序员而言,模板的许多常规用法也有些令人恐惧。 我想一个很好的例子就是编译时字符串。这是一个已经存在一年多的问题了,但是很显然,到目前为止,C ++对于普通人来说并不容易。尽管看这些选项还不足以引起我的恶心,但我仍然对能够产生神奇的,最高效率的机器代码以适应我的软件中任何花哨的应用程序没有信心。 我的意思是,让我们面对现实吧,伙计们,琴弦非常简单和基本。我们中的某些人只是想要一种便捷的方法来发出带有某些字符串的机器代码,而这些字符串在某些情况下“嵌入”了比直接编写代码时要多得多。在我们的C ++代码中。 输入clang和LibTooling,这将公开源代码的抽象语法树(AST),并允许简单的自定义C ++应用程序正确正确地操作原始源代码(使用Rewriter)以及AST中所有对象的丰富的面向对象的语义模型。它处理很多事情。它了解宏扩展,并让您遵循这些链。是的,我说的是源代码到源代码的转换或翻译。 我在这里的基本论点是,使用clang,现在我们可以创建可执行文件,这些可执行文件本身可以用作C ++软件的理想自定义预处理程序阶段,并且可以使用C ++实现这些元编程阶段。我们仅受以下事实的约束:该阶段必须接受有效的C ++代码的输入,并产生更多有效的C ++代码作为输出。加上您的构建系统适用的任何其他限制。 输入至少必须非常接近有效的C ++代码,因为毕竟clang是编译器的前端,而我们只是在四处寻找并利用其API发挥创意。我不知道是否有任何规定可以定义要使用的新语法,但是显然我们必须开发一种方法来正确解析它并将其添加到clang项目中。期望更多的是在clang项目中超出范围。 没问题 我可以想象一些无操作宏函数可以处理此任务。 查看我正在描述的另一种方法是通过运行我们的源代码的AST(感谢clang及其API)来使用运行时C ++实现元编程构造,而不是使用语言本身可用的更有限的工具来实现它们。这也具有明显的编译性能优势(繁重的模板头与您使用它们的频率成比例地减慢了编译速度。然后,许多已编译的东西被链接器仔细地匹配并丢弃了)。 但是,这样做的代价是在构建过程中引入了额外的一两个步骤,并且还要求(当然)编写一些更详细的软件(但至少是简单的运行时C ++)作为我们工具的一部分。 那不是全部。我非常确定,生成核心语言功能极其困难或不可能的代码可以提供更大的功能空间。在C ++中,您可以编写模板,宏或两者的疯狂组合,但是在clang工具中,您可以在运行时以C ++可以实现的任何方式修改类和函数,同时可以完全访问语义内容,除了模板和宏以及其他所有内容。 因此,我想知道为什么每个人都还没有这样做。是不是来自clang的此功能如此新,并且没人熟悉clang的AST的巨大类层次结构?那不可能。 也许我只是低估了这一点的难度,但是使用clang工具执行“编译时字符串操作”几乎在犯罪上很简单。它很冗长,但是非常简单。所需要的只是一堆无操作宏函数,它们映射到实际的实际std::string操作。clang插件通过获取所有相关的无操作宏调用来实现此目的,并使用字符串执行操作。然后将该工具作为构建过程的一部分插入。在构建过程中,这些无操作宏函数调用会自动评估为其结果,然后作为纯旧的编译时字符串插入到程序中。然后可以照常编译该程序。实际上,结果是该程序的移植性也大大提高,不需要新的支持C ++ 11的编译器。

3
Clang / LLVM准备好迎接黄金时间了吗?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 可以使用Clang代替gcc吗?您对此有何经验?还有哪些不利条件? 编译的性能比gcc好得多,但是关于执行它时生成的代码的性能呢? 有没有好的工具可以在Linux或Windows上运行作为前端(IDE)? 编辑:我的意思是C编译器。C ++还不是很好。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.