Clang可以处理C、C++和Objective-C源代码
Clang可能指三种不同的实体:
clang -ccl中的编译器不仅是由Clang库实现的,而且还广泛使用其他LLVM库来实现编译器的中间部分、后端以及集成的汇编器
先分析clang编译器驱动程序的命令行调用
clang hello.c -o helllo
Clang驱动程序通过使用-ccl选项来生成另一个自身实例,以及调用其内部的编译器
通过在编译器驱动程序中使用-Xclang < option >可以将特定的参数传递给该命令
该工具与驱动程序不同,并且与GCC命令行的接口区别比较大
Ag:clang -ccl工具有一个特殊的选项,可以打印Clang抽象语法树(AST )
可以使用以下命令
clang -Xclang -ast-dump hello.c
clang -cc1 -ast-dump hello.c
这里需要指出的是,编译驱动程序任务之一是用所有必要的参数来初始化编译器的调用
使用-###标志来驱动程序可以看见他用哪些参数调用clang -ccl编译器
例如,如果手动调用clang -ccl ,还需要-I标志来提供所有系统的文件头
前端操作
clang -cc1工具的一个特点是它不仅实现了编译器的前端,而且还通过LLVM库实例化所有其他的LLVM组件,以执行LLVM支持的所有编译功能
因此可以说clang -cc1几乎实现了完正的编译器
通常编译目标是x86机器码时,clang -ccl会在生成目标文件(.o文件)后停止工作,因为LLVM链接器仍处于试验阶段,未被集成。
在生成目标文件后,控制权被交还给编译器驱动程序,由其调用外部工具来链接整个项目
使用-###可以看见
在内部clang -ccl的每个调用都由一个相应的主前端操作来控制
完整的定义在源文件include/clang/Frontend/FrontendOptions.h中
操作 | 说明 |
---|---|
ASTView | 解析AST并在Graphviz中查看 |
EmitBC | 产生LLVM位码.bc文件 |
EmitObj | 产生特定于目标的.o文件 |
FixIt | 解析任何Fixit并应用于源码 |
PluginAction | 运行一个插件操作 |
RunAnalysis | 运行一个或多个源码分析 |
选项-cc1会触发cc1_main函数的执行
在tools/driver/ccl_main.cpp可以看到源码
Ag:通过clang hello.c -o hello来间接调用-cc1时,此时函数会初始化指定目标机器码的信息,并设置诊断基础设施,还会执行EmitObj操作,该操作是在FrontendAction的一个子类CodeGenAction中实现的
该代码将实例化的所有Clang和LLVM组件,并协调指挥这些组件构建目标文件
不同前端操作的存在使Clang除了可以执行整个编译过程之外,还可以执行诸如静态分析之类的其他编译阶段。通过-target命令行参数,可以为clang指定编译目标,根据不同的编译目标,clang加载不同的ToolChain对象,并执行和编译目标对应的前端操作,使用相应的外部工具完成编译过程
libclang是提供给外部Clang用户的最重要的接口之一,它通过C API 提供强大的前端功能。它包括几个Clang库,这些库也可以单独使用并一起链接到用户自己的项目中
列一下一些:
(Abstract Syntax Tree,简称 AST)是一种树状结构,用来表示源代码的语法结构。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于 if-condition-then 这样的条件跳转语句,可以使用带有三个分支的节点来表示。
AST 的根节点通常表示整个源代码,子节点表示源代码的各个组成部分,例如函数、变量、表达式等。每个节点可以包含一些属性,例如类型、值等。
AST 的应用非常广泛,包括:
下面是一个简单示例,展示了如何将以下代码转换为 AST:
def add(a, b):
return a + b
=
/ \
+ return
/ \
a b
在这个 AST 中:
=
, 表示赋值操作。+
, 表示加法操作。return
, 表示返回语句。+
节点的左子节点是 a
,表示变量 a
。+
节点的右子节点是 b
,表示变量 b
。AST 是理解编程语言语法和语义的一种重要工具。它可以帮助我们更好地理解代码的结构和运行方式。
要理解“驱动程序”中的“驱动”二字,首先要明确“驱动程序”的定义。驱动程序,全称设备驱动程序,是一种可以使计算机和设备通信的特殊程序。它相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作。
“驱动”的本义是指用鞭子或其他工具抽打牲口,使之前进。在“驱动程序”中,“驱动”的含义可以理解为:
因此,“驱动程序”中的“驱动”二字可以理解为:控制、管理、翻译。
具体来说,驱动程序的作用可以概括为以下几点:
驱动程序是计算机系统的重要组成部分,对于计算机与硬件设备的正常工作至关重要。