clang前端

Clang可以处理C、C++和Objective-C源代码

Clang简介

Clang可能指三种不同的实体:

  1. 前端(在Clang库中实现)
  2. 编译驱动程序(在clang命令和Clang驱动程序库中实现)
  3. 实际的编译器(在clang-ccl命令中实现)

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 -ccl 而不是驱动程序

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库,这些库也可以单独使用并一起链接到用户自己的项目中
列一下一些:

  • libclangLex :用于预处理和词法分析,处理宏,令牌和pragma构造
  • libclangAST :为构建、操作和遍历抽象语法树(AST)增加了其他功能
  • libclangParse :用于使用词法分析阶段的结果进行逻辑解析
  • libclangSema :用于语法分析,语义分析为AST验证提供操作
  • libclangCodeGen:使用编译目标的信息来生成LLVM IR代码
  • libclangAnalysis :包含用于静态分析的资源
  • libclangRewrite: 用于支持代码重写,并为构建代码重构工具提供基础架构
  • libclangBasic:提供一组使用程序,包括内存分配抽象、源码位置和诊断等

抽象语法树

(Abstract Syntax Tree,简称 AST)是一种树状结构,用来表示源代码的语法结构。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于 if-condition-then 这样的条件跳转语句,可以使用带有三个分支的节点来表示。

AST 的根节点通常表示整个源代码,子节点表示源代码的各个组成部分,例如函数、变量、表达式等。每个节点可以包含一些属性,例如类型、值等。

AST 的应用非常广泛,包括:

  • 编译:AST 可以用于编译器中,将源代码转换为机器代码。
  • 解释:AST 可以用于解释器中,直接执行源代码。
  • 代码分析:AST 可以用于代码分析工具中,例如静态代码检查、代码生成等。
  • 代码编辑:AST 可以用于代码编辑器中,例如语法高亮、自动补全等。

下面是一个简单示例,展示了如何将以下代码转换为 AST:

def add(a, b):return a + b
      =/ \+   return/ \a   b

在这个 AST 中:

  • 根节点是 =, 表示赋值操作。
  • 左子节点是 +, 表示加法操作。
  • 右子节点是 return, 表示返回语句。
  • + 节点的左子节点是 a,表示变量 a
  • + 节点的右子节点是 b,表示变量 b

AST 是理解编程语言语法和语义的一种重要工具。它可以帮助我们更好地理解代码的结构和运行方式。

如何理解驱动二字?

要理解“驱动程序”中的“驱动”二字,首先要明确“驱动程序”的定义。驱动程序,全称设备驱动程序,是一种可以使计算机和设备通信的特殊程序。它相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作。

“驱动”的本义是指用鞭子或其他工具抽打牲口,使之前进。在“驱动程序”中,“驱动”的含义可以理解为:

  • 控制:驱动程序可以控制硬件设备的行为,例如让声卡播放音乐,让打印机打印文档。
  • 管理:驱动程序可以管理硬件设备的资源,例如分配内存空间、请求中断。
  • 翻译:驱动程序可以将操作系统的指令翻译成硬件设备能够理解的语言。

因此,“驱动程序”中的“驱动”二字可以理解为:控制、管理、翻译。

具体来说,驱动程序的作用可以概括为以下几点:

  • 提供硬件设备的接口:驱动程序为操作系统提供了一个标准的接口,使操作系统可以访问和控制硬件设备。
  • 实现硬件设备的功能:驱动程序可以实现硬件设备的所有功能,例如读写数据、控制设备状态等。
  • 提高硬件设备的性能:驱动程序可以优化硬件设备的性能,提高工作效率。

驱动程序是计算机系统的重要组成部分,对于计算机与硬件设备的正常工作至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/469766.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精品jsp+ssm基于Java的财务收支记账管理系统

《[含文档PPT源码等]精品jspssm基于Java的收支管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&…

【机器学习笔记】4 朴素贝叶斯

贝叶斯方法 贝叶斯分类 贝叶斯分类是一类分类算法的总称&#xff0c;这类算法均以贝叶斯定理为基础&#xff0c;故统称为贝叶斯分类。 朴素贝叶斯分类是这一类算法中最简单的较为常见的算法。 先验概率 根据以往经验和分析得到的概率。我们用&#x1d443;(&#x1d44c;)来代…

vuex中mutations详解,与actions的区别

Vuex 的 Mutations 是用于改变 Vuex Store 中状态的一种方式。它是一个同步的操作&#xff0c;用于直接修改 Store 中的状态。 Mutations 有以下特点&#xff1a; 同步操作&#xff1a;Mutations 是同步的&#xff0c;这意味着它们会立即执行并修改状态。原子性&#xff1a;…

[嵌入式系统-8]:逻辑地址、虚拟地址、物理地址以及地址映射

目录 前言&#xff1a; 一、三种内存地址 1.1 逻辑地址&#xff1a;相对地址 1.1.1 什么是逻辑地址 1.1.2 逻辑地址示例 1.2 虚拟地址 1.2.1 什么是虚拟地址 1.2.2 虚拟地址实例 1.3 物理地址 1.3.1 什么是物理地址 1.3.2 物理地址示例 1.3.3 什么情况适用物理地址…

Python面向对象学习小记——类对象

一个对象可以抽象出一个类&#xff0c;一个类可以实例化一个对象。 【属性是静态的&#xff0c;方法是动态的。】

各指针含义区分

一、char *a P109: (1)(变量)指针变量&#xff1a;指针变量&#xff0c;即指针的定义&#xff1a;用来存放指针的变量。指向的是变量&#xff0c;且可以改变其指向的地址。P104 char *a (2)(变量)指针常量&#xff1a;指针常量&#xff0c;指向的是变量首字节的地址&#xff…

六、Datax通过json字符串运行

Datax通过json字符串运行 一、场景二、代码实现 一、场景 制作一个web应用&#xff0c;在页面上配置一个json字符串&#xff0c;保存在数据库里面。在执行json的时候&#xff0c;动态在本地创建一个json文件后执行&#xff0c;并识别是否成功&#xff0c;将执行过程保存在数据…

[字符串] Manacher算法

回文串性质 Manacher算法 介绍 以o(n)时间复杂度&#xff0c;让字符串中每个位置作为回文中心来计算回文半径的算法&#xff0c;所以回文半径和回文中心是实时更新的 如何以转换后的回文半径来计算回文串长度 为什么除2后向下取整&#xff0c;因为我们要计算蓝色方块的个数&a…

山西电力市场日前价格预测【2024-02-12】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-12&#xff09;山西电力市场全天平均日前电价为127.42元/MWh。其中&#xff0c;最高日前电价为369.24元/MWh&#xff0c;预计出现在18:45。最低日前电价为0.00元/MWh&#xff0c;预计出…

springsecurity6使用

spring security 中的类 &#xff1a; AuthenticationManager : 实现类&#xff1a;ProviderManager 管理很多的 provider &#xff0c;&#xff0c;&#xff0c; 经常使用的&#xff0c;DaoAuthenticationProvider , 这个要设置一个 UserDetailService , 查找数据库&#xff…

在python中JSON数据格式的使用

什么是JSON&#xff1f; JSON是一种数据格式&#xff0c;由美国程序设计师DouglasCrockford创建的&#xff0c;JSON全名是JavaScript Object Notation,由JSON英文全文字义我们可以推敲JSON的缘由&#xff0c;最初是为JavaScript开发的。这种数据格式由于简单好用被大量应用在We…

数据分析案例-基于亚马逊智能产品评论的探索性数据分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…