深入研究Clang(三) libclang

作者:史宁宁

现在的Clang,不仅仅是一个编译器前端,同时也可以作为一个库使用。作为一个库使用的时候,可以用它去分析C/C++/ObjectC语言代码,可以分析源码得到AST,也可以获取已经分析好的AST,也可以遍历AST,还可以获取AST中基本元素的物理源码位置。这就是libclang。

libclang提供了一系列的C语言的接口,但是这些接口并不能完全提供存储在Clang C++ AST中的所有信息,只能提供部分基本信息,但是这些基本信息已经可以满足一般情况下的使用。主要目的是为了稳定,并且可以支持开发工具的基本功能。(clang/include/clang-c/Index.h中的注释原文如下: This C interface to Clang will never provide all of the information representation stored in Clang's
C++ AST, nor should it: the intent is to maintain an API that is relatively stable from one release to the next, providing only the basic functionality needed to support development tools.)

与此同时,libclang支持和python绑定使用,也就是说你可以是用python去调用libclang。clang在clang/bindings/python/这个目录下面提供了绑定所需要的文件。目前这个目录下面除了README之外还有三个目录:clang,examples,tests。其中clang目录下面的文件是绑定所需要的,examples目录下面是绑定后测试用的两个小例子。test目录下面应该是测试需要的一些文件(该目录下面文件目前还没有认真分析)。只需要把绑定文件放到python的库文件下面(包含clang文件夹),然后确保系统安装clang到系统目录,之后就可以运行例子了。

libclang带来的优点很明显,可以在很多不同的环境下面轻松的用上libclang,只是作为一个提供了parser功能的库,非常方便快捷的嵌入自己的工具中,避免了大量的重复工作。同时也不用去分析clang内部的代码,不需要熟悉内部大量的AST相关的代码,就可以使用,这可以节省大量的时间。当然,想深挖clang的代码的同学,也可以把这里当作一个突破口。

------------------------------------------------------------转载请注明出处--------------------------------------------------------------------------------------

时间: 2024-07-28 12:49:00

深入研究Clang(三) libclang的相关文章

深入研究Clang(一)Clang和LLVM的关系及整体架构

作者:史宁宁(snsn1984) Clang和LLVM的关系         Clang和LLVM到底是什么关系,这是在研究Clang的过程中所不可避免的一个问题.如果要搞清楚Clang和LLVM之间的关系,首先先要知道宏观的LLVM和微观的LLVM.         宏观的LLVM,指的是整个的LLVM的框架,它肯定包含了Clang,因为Clang是LLVM的框架的一部分,是它的一个C/C++的前端.虽然这个前端占的比重比较大,但是它依然只是个前端,LLVM框架可以有很多个前端和很多个后端,只

深入研究Clang(二)Abstract Syntax Tree

要想深入的研究Clang,抽象语法树是必须要完全理解的.关于抽象语法树的资料,wiki介绍的很详细:http://en.wikipedia.org/wiki/Abstract_syntax_tree 如果觉的这个英文文档不是太好理解,也可以找点别的中文资料,但是这个文档还是要认真读的.AST作为语法分析的输出,是接下来的语义分析和生成中间代码所需要的基础.现在基于AST可以进行程序分析和程序转换,程序分析就不说了.程序转换,现在Clang下面已经有一些额外的工具:比如clang-moderniz

深入研究Clang(八) Clang代码阅读之打log读流程1

这个过程简单的分为几步. 第一步:写一个简单的小程序,hello.c.内容如下: #include<stdio.h> int main() {  printf("Hello world!\n");} 第二步:找出如何在LLVM里面输出信息,最后选择采用llvm::errs(),等于采用了LLVM的错误机制.包括llvm::errs()所需的头文件.具体内容如下: //shining add begin#include "llvm/Support/raw_ostre

大会直击|伯明翰大学教授姚新:类脑计算研究中三个被遗忘的问题

雷锋网(公众号:雷锋网)按:姚新,现为英国伯明翰大学计算机学院讲座教授,计算智能及其应用卓越研究中心主任,IEEE Fellow(院士),IEEE 计算智能学会杰出讲座教授.2003 - 2008年任IEEE 进化计算学报主编,2014-2015年任IEEE进化计算学会主席.他的主要研究领域包括进化计算和集成学习及其应用,特别是在软件工程中的应用.他的论文曾获2001年 IEEE Donald G. Fink奖优秀论文奖.2010和2015年IEEE 进化计算学报杰出论文奖.2010年BT Go

Caliburn Micro 框架中Windows Phone 8使用研究(三)神奇的墓碑处理

背景 Windows Phone 8 开发过程中Tombstone的处理真是让我们又爱又恨,它能让程序看起来一直在运行.但处理墓碑却是个很麻烦的事情,传统的方式我们需要在程序Deactived事件触发后,将需要保存的状态放到State中,然后用户回来后再加载出来.而如果我们的程序采用MVVM架构,情况会更复杂,有多复杂相信每个人都有所体会.话不多说,让我们继续看CM框架中神奇的墓碑处理. 从简单的代码开始: 在测试页面,我们添加一个TextBox起名为Name: 然后在ViewModel中添加N

JXCELL实例学习与研究(三) 之 EXCEL实现复选框 与 选择区域填充颜色

代码如下: 主要是第一列显示复选框,以后三列显示其列头的复选框,具体有段EXCEL的操作方式,木有看得太懂,大致就是操作EXCEL的,需要查询一下EXCEL语句 import com.jxcell.DataValidation; import com.jxcell.View; public class DataValidationSample { public static void main(String args[]) { View m_view = new View(); try { m_

魔兽世界客户端数据研究(三)

终于决定,还是通过wow model viewer起手,研究一下WOW的数据类型,从另一个角度,体验一把这个唯一让我充过值的游戏. 这将是一系列随笔,即在读代码的时候,顺便记录,以理清思路和加深映象. 其中会有很多让人费解的地方,如果有幸被某位兄弟看见 ,请勿见笑.   今天来说一下M2中的LOD的数据 WOW中,为了降低远处模型的渲染开销,为模型做了LOD,即远处的模型,使用更少的顶点,更粗略的材质. 比如远处的模型在渲染的时 候,面片数量减少,关闭光照,不渲染挂接的特效等等. 因此,不用证明

深入研究Clang(九) Clang代码阅读之打log读流程2

继续上一篇,同样的hello.c,同样的执行过程,只不过继续添加了一些log信息,而且对代码进行了更近一步的挖掘.先看输入和输出的log信息(前半部分): shining@shining-VirtualBox:~/llvm-3.9.0/build/bin$ ./clang hello.c -o hello clang/tools/driver/driver.cpp/main()_begin/shining_add clang/lib/Driver/Driver.cpp/BuildCompilat

深入研究Clang(五) Clang Lexer代码阅读笔记之Lexer

作者:史宁宁(snsn1984) Clang的Lexer(词法分析器)的源码的主要位置如下: clang/lib/Lex    这里是主要的Lexer的代码: clang/include/clang/Lex   这里是Lexer的头文件代码的位置: 同时,Lexer还使用了clangBasic库,所以要分析Lexer的代码,clangBasic(clang/lib/Basic)的一些代码也会用到. 首先从Lexer入手. clang/include/clang/Lex/Lexer.hclang: