什么事LLVM和Clang?Clang与GCC有什么区别?Clang如何使用?

2023-11-05

这个问题主要讲Xcode编译器的认知,在学习iOS之前有必要学习一下Objective-C的编译环境。

在了解LLVM和Clang之前,先得了解一下什么是编译器。

编译器是一种计算机程序,它将某种编程语言(高级编程语言)写成的源代码转换成另一种编程语言(低级编程语言)。一个现代编译器的主要工作流程为:源代码->预处理器->编译器->目标代码->链接器->可执行程序,最后打包文件,让计算机运行。编译器的目的是将便于人写的高级编程语言作为源代码,翻译成计算机能够执行的低级机器语言,也就是可执行文件。其中高级语言有C、C++、Java、Python等,低级语言有汇编语言和机器代码。一个编译器可以按照三段式分为:前段(Fontend)、优化器(Optimizer)、后端(Backend)

GCC(GNU Compiler Collection)是一套有GNU开发的编程语言编译器,以GPL及LGPL许可证所发行的自由软件。GCC原名为GNU C 语言编译器,它原本只能处理C语言,随着技术的发展,GCC很快地得到扩展,变得可以处理C++,之后可以处理的语言扩展到Fortran、Pascal、Objective-C、Java等。

LLVM(Low Level Virtual Machine),即底层虚拟机。它是一个由C++编写而成的编译器基础框架,利用虚拟技术创造出编译时期、链接时期、运行时期以及“闲置时期”的最优化框架。从宏观上来讲,LLVM不仅仅是一个编译器或者虚拟机,它是一个众多编译器工具及低级工具技术的统称,它包含了一个前端、优化器、后端以及众多的函数库和模板。从微观上来讲,可以把它看做后端编译器,用来生成目标代码,前端编译器为Clang。Xcode5版本之前,编译器默认使用的是GCC,从Xcode5之后编译器默认使用LLVM。原因后面马上讲到。

CLang是一个由C++编写的编译器前端,能够编译C/C++/Objective等高级语言,属于LLVM的一部分,发布于BSD(自由软件中使用最广发的许可证之一)许可证下,其目的就是为了超越GCC。经过测试证明,Clang编译Objective-C代码的速度为GCC的3倍左右,同时它还能针对用户发生的编译错误准确地给出建议

Clang和GCC的主要区别如下所示。

  1. Clang比GCC编译用的时间更短,包括预处理、语法分析、解析、语义分析、抽象语法树生成的时间。
  2. Clang比GCC的内存占用更小。
  3. Clang生成的中间产物比GCC更小。
  4. Clang的错误提示比GCC更加友好。
  5. Clang有静态分析,GCC没有。
  6. Clang使用BSD许可证,GCC使用GPL许可证。
  7. Clang从一开始就被设计为一个API,允许它被源代码分析工具和IDE集成。GCC被构建成一个单一的静态编译器,这使得它非常难以被作为API并集成到其他工具中。
  8. GCC比Clang支持更多的语言,例如Java。
  9. GCC比Clang支持更多的平台。
  10. GCC比Clang更流行。

在iOS开发中,经常使用Clang将Objective-C代码转化成C++代码,从而分析代码的底层实现。以main.m文件为例。

clang -rewrite-objc main.m //将Objective-C转为C++

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么事LLVM和Clang?Clang与GCC有什么区别?Clang如何使用? 的相关文章

  • iOS:如何在不降低 fps 的情况下播放音频?

    我正在使用 Sprite Kit 最好使用 Swift 库 为 iOS 9 开发游戏 目前 我正在使用 Singleton 在其中预加载音频文件 每个文件都连接到一个单独的 AVAudioPlayer 实例 这是一个简短的代码片段来了解这个
  • 如何检测 UISwipeGestureRecognizer 的结束?

    来自苹果文档 滑动是一种离散手势 因此每个手势仅发送一次关联的操作消息 void touchesEnded NSSet touches withEvent UIEvent event 当我使用 UISwipeGestureRecognize
  • iOS Safari Mobile 禁用上一个和下一个选择输入

    上周五我发现了关于此问题的类似问题 但似乎无法再次找到它 如果有人能指出我正确的方向 那就太好了 本质上我在一个页面上有多个选择菜单 第一个在加载时填充 第二个在第一个选择时填充 够简单的 但是 在 iOS 设备中 当您点击选择元素时 它会
  • AFNetworking XML 请求问题

    我在用着AFNetworking 2使用 JSON 响应 它工作正常 现在我必须将其转换为 XML 而不是使用 JSON 因为服务器响应是 XML 格式的 在我搜索之后 我找到了这段代码 但它不起作用 与 Charles 我发现请求是错误的
  • 如何正确创建迦太基 cartfile?

    我正在研究购物车文件 迫不及待地想 简单地创建一个购物车文件 就像所有说明所说的那样 只是 如何 简单地 创建一个 Cartfile 我创建了一个纯文本文档 将其命名为 cartfile 并在其中复制了一些依赖项 Ran carthage
  • 无法连接到 iTunes Store(获取应用内购买列表)

    我正在尝试从我的应用程序的应用程序内购买项目商店中获取列表 这是我所做的 安装了新的配置文件并启用了应用内购买 替换配置文件很棘手 但我认为我的设置是正确的 验证税务和银行信息是否正常 该应用程序已在商店出售 创建测试用户 在测试设备上以测
  • 如何在iOS中处理1到3个手指的滑动手势

    我使用以下代码来处理代码中的 1 根手指滑动 UISwipeGestureRecognizer swipe UISwipeGestureRecognizer alloc initWithTarget self action selector
  • Swift SpriteKit edgeLoopF​​romRect 问题

    下面的代码可以识别底部和顶部边缘场景和球按预期弹开 但是 那左边缘和右边缘现场的情况一直被破坏 如果施加足够的力 球会离开屏幕 然后最终返回 就好像场景的边缘超出了 iPhone 模拟器窗口的边缘 import SpriteKit clas
  • iOS:生成pdf时绘制文本时如何设置字体?

    我在ios应用程序中使用drawpdf函数生成pdf 同时调用nsobject类中的drawtext函数 它根据我指定的框架和字符串清楚地绘制文本 我的代码是 void drawText NSString textToDraw inFram
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • 从命令行添加 Xcode 开发者帐户

    我正在尝试使用xcodebuild allowProvisioningUpdates在我只能通过命令行访问的计算机 Azure Devops macOS 托管计算机 上 不幸的是 根据man xcodebuild为了使用 allowProv
  • 用户验证 Facebook 后未调用应用程序打开 Url 方法

    我已将 ios 应用程序中的 facebook 升级到 3 0 并使用提供的代码https developers facebook com docs howtos login with facebook using ios sdk http
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self
  • 在 UIWebView 中播放 Facebook 视频

    有谁知道如何在 Facebook 上播放视频UIWebView 我的应用程序将视频上 传到 Facebook 并检索视频的网址 我想将此网址嵌入到UIWebView播放 我已经为 youtube 解决了这个问题 但没有为 Facebook
  • 如何解决 Xcode 5 中的红色(已移动)文件?

    在 Xcode 4 中 当您要移动文件时 可以通过单击右侧菜单中的按钮并通过 Finder 选择新位置来解析文件的新位置 在 Xcode 5 中 右侧菜单中没有按钮 我还没有找到任何方法通过右键单击文件或顶部菜单栏选项来指定文件的新位置 在
  • 叠加 SKScene 未显示

    我正在尝试将 SKScene 覆盖在 SCNScene 上 当我在模拟器和 iPhone6 上运行我的应用程序时 overlayScene SKScene 按预期显示 但是当我尝试在 iPhone5 上运行它 尝试了 2 个不同的设备 时
  • 如何在 UICollectionView 中将行居中?

    我有一个UICollectionView与随机细胞 有什么方法可以让我将行居中吗 默认情况下它是这样的 x x x x x x x x x x x x x x 这是所需的布局 x x x x x x x x x x x x 我必须做这样的事
  • CoreBluetooth:检测设备超出范围/连接超时

    我正在设计一个 iOS 框架来处理多个 BLE 设备 均为同一类型 目前一切都运行良好 除了一件事 客户想要一个包含可用设备的列表 但是 我如何检测过去发现的设备何时不再可用 当我尝试连接到不再可用的设备时 会出现另一个问题 文档说 连接尝
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的

随机推荐

  • django/CVE-2017-12794XSS漏洞复现

    docker搭建漏洞复现环境 漏洞原理看帮助文档 Django debug page XSS漏洞 CVE 2017 12794 分析 Django发布了新版本1 11 5 修复了500页面中可能存在的一个XSS漏洞 这篇文章说明一下该漏洞的
  • 挖洞经验

    本文分享的是作者在一次众测中的SQL报错型注入漏洞发现过程 有趣之处在于 在后续漏洞利用的构造中 如果在目标服务端数据库逻辑的INSERT查询中使用逗号 Comma 将导致构造的Payload不可用 这种情况下 作者通过综合Time bas
  • 在ubuntu16.04搭建Qt4.8.6嵌入式开发环境

    环境以及软件版本 虚拟机环境 ubuntu16 04 64位 虚拟机环境中gcc的版本 gcc version 5 4 0 20160609 Qt版本 qt everywhere opensource src 4 8 6 tar gz 下载
  • mac安装Python3.7

    https www cnblogs com linxue p 10097785 html
  • 基础笔记(三):网络协议之Tcp、Http

    目录 一 网络协议 二 TCP Transmission Control Protocol 传输控制协议 TCP头格式 TCP协议中的三次握手和四次挥手 TCP报文抓取工具 三 HTTP HyperText Transfer Protoco
  • 关于android webview 的那些坑

    近日做项目的时候使用webview 遇到一些麻烦 第一条 H5页面选择图片时 点击无效 无法选择照片 第二条 当修复完第一条bug时 出现新bug 如果选择照片时 什么都不选返回 会出现无法点击的情况 第三条 如何打开PDF格式的文件 首先
  • ubuntu16.04 cuda8.0 caffe 编译时遇到 caffe fatal error: cublas_v2.h 没有那个文件或目录

    caffe 配置参考 http blog csdn net leo xu06 article details 53010900 make caffe的过程中碰过 include caffe util device alternate hpp
  • WEB---在删改查:

    数据库 SQLyog Ultimate v12 09 64 bit MySQL 5 7 27 log Database myshool 40101 SET NAMES utf8 40101 SET SQL MODE 40014 SET OL
  • 如何在 Java 中进行日志记录

    您可以使用本指南为您的应用程序发现 理解和使用正确的 Java 日志库 例如 Log4j2 Logback 或 java util logging 日志 似乎 是一个非常简单的主题 但在实践中可能相当棘手 并且没有在任何地方进行足够详细的介
  • webpack处理样式资源(css less sass scss)

    Webpack 本身是不能识别样式资源的 所以我们需要借助 Loader 来帮助 Webpack 解析样式资源 一 处理css样式资源 去项目根目录新建css文件夹 在css文件夹下新增index css文件 内容如图 在src main
  • Linux服务器开发——epoll模式web服务器代码

    Linux服务器开发 epoll模式web服务器代码 1 main c 2 epoll server c 2 1 初始化epoll树 初始化监听的描述符 2 2 接受新的连接请求并上树 2 3 已经在树上的进行读数据 2 4 http请求解
  • html的初步认识

    HTML 英文 Hyper Text Markup Languag的缩写 中文翻译为 超文本标记语言 主要通过HTML标签对网页中的文本 图片 声音等等内容进行一个描述 html的骨架
  • 布线问题(队列式分支限界)

    计算机算法设计与分析 第5版 王晓东著 p178 0 电路板中可行的方格 1 障碍物 2 起点 是按课本上来的 初始起点设为2 是为了和 0 1进行区分 起点 1 1 终点 4 6 1 path 数组是存放的起点到终点的路径方格 2 电路板
  • Vim使用学习以及ideaVim(持续补充)

    Vim使用学习以及ideaVim 我的ideaVim配置 文章目录 Vim使用学习以及ideaVim 方向 nomral模式 进入插入模式 删除命令 粘贴命令 拷贝命令 替换命令 修改命令 motion 表示操作范围的指令 文件信息 可视模
  • form表单传递实体类对象,后台接收

    1 新建实体类 public class Student String Idnumber String Studentnumber String username String password String name String int
  • FreeRTOS任务的挂起和恢复

    目录 说明 一 任务挂起与恢复 1 1 什么是任务挂起 1 2 任务挂起函数 1 3 什么是任务恢复 1 4 任务恢复函数 1 5 什么是中断任务恢复函数 1 6 中断任务恢复函数 二 任务挂起与恢复实例代码 任务中 2 1 主要代码 2
  • Vue proxy 配置跨域

    vue config js文件 const defineConfig require vue cli service module exports defineConfig transpileDependencies true devSer
  • 微信小程序和微信小游戏的区别

    本人小程序 小游戏 开发新手 看了几天文档 才大概搞明白微信小程序和微信小游戏的区别 首先大家口中所说的 小程序 这个概念有两个意思 一种是 小程序平台下的全部类型的项目 这样的话 就是不区分小程序项目和小游戏项目的概念 是大家一般口中所说
  • SQL语句(多表关系)

    第1章 多表关系实战 1 1 实战1 省和市 l 方案1 多张表 一对多 l 方案2 一张表 自关联一对多 1 2 实战2 用户和角色 l 多对多关系 1 3 实战3 角色和权限 l 多对多关系 1 4 实战4 客户和联系人 可选 l 一对
  • 什么事LLVM和Clang?Clang与GCC有什么区别?Clang如何使用?

    这个问题主要讲Xcode编译器的认知 在学习iOS之前有必要学习一下Objective C的编译环境 在了解LLVM和Clang之前 先得了解一下什么是编译器 编译器是一种计算机程序 它将某种编程语言 高级编程语言 写成的源代码转换成另一种