iOS底层探索(一) - 从零开始认识Clang与LLVM

2024-06-15 12:48

本文主要是介绍iOS底层探索(一) - 从零开始认识Clang与LLVM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

入门起步


从编译器说起

  • 为什么需要编译?

    • 大家都知道,我们的计算机CPU只能读懂机器码(machine code,也就是由一堆0和1组成的编码);
    • 但我们现在编写的代码并不是机器码,而是高级编程语言(Objective-C、Swift、Java、...),最终也可以被计算机所执行,
    • 这就需要编译了,在编译的过程中,编译器的作用便是把我们的高级编程语言通过一系列的操作转化成可被计算机执行的机器语言。
      ps:[更详细的解析可以自行百度]
  • 编译器是如何设计的?

    • 经典的三段式设计(three phase design):
      前端(Frontend)--优化器(Optimizer)--后端(Backend)
      (见下图)

      原图来自http://www.aosabook.org

       

      • 其中前端负责分析源代码,可以检查语法级错误,并构建针对该语言的抽象语法树(AST)
      • 抽象语法树可以进一步转换为优化,最终转为新的表示方式, 然后再交给让优化器和后端处理
      • 最终由后端生成可执行的机器码
    • 为什么要使用三段式设计?优势在哪?

      • 首先解决了一个很大的问题:假如有N种语言(C、OC、C++、Swift...)的前端,同时也有M个架构(模拟器、arm64、x86...)的Target,是否就需要 N × M 个编译器?
      • 三段式架构的价值就体现出来了,通过共享优化器的中转,很好的解决了这个问题。
      • 假如你需要增加一种语言,只需要增加一种前端;假如你需要增加一种处理器架构,也只需要增加一种后端,而其他的地方都不需要改动。这复用思想很牛逼吧。(如下图)

         

        原图来自http://www.aosabook.org

  • 编译源文件有哪些主要步骤?
    • 先列举一些整个编译过程的主要步骤,后面再详细介绍每个步骤都做了哪些事情。
    • 主要编译步骤如下:
      1. 源代码(source code) ->  
      2. 预处理器(preprocessor) ->   
      3. 编译器(compiler) ->  
      4. 汇编程序(assembler) ->  
      5. 目标代码(object code) ->   
      6. 链接器(Linker) ->  
      7. 可执行文件(executables)
      

Xcode编译器发展简史

Xcode3 以前: GCC;
Xcode3: 增加LLVM,GCC(前端) + LLVM(后端);
Xcode4.2: 出现Clang - LLVM 3.0成为默认编译器;
Xcode4.6: LLVM 升级到4.2版本;
Xcode5: GCC被废弃,新的编译器是LLVM 5.0,从GCC过渡到Clang-LLVM的时代正式完成

  • 为什么苹果的Xcode会使用Clang+LLVM取代GCC?
    • 这里面有些历史原因。毕竟GCC是第三方开源的,不属于苹果维护也不能完全掌控其开发进程,Apple为Objective-C增加许多新特性,但GCC开发者对这些支持却不友好;Apple需要做模块化,GCC开发者却拖着迟迟不实现。这能忍?
    • 随着Apple对其IDE(也就是Xcode)性能的要求越来越高,最终还是从零开发了一个Clang前端加LLVM后端的编译器,这个编译器的作者是大名鼎鼎的Swift之父Chris Lattner。
  • Clang比GCC优秀在哪些方面?
    • 传说新的Clang编译器编译Objective-C代码速度比GCC快3倍
    • 并且提供了友好的代码提示

Clang 的简介


“Clang: a C language family frontend for LLVM”
LLVM的C语言家族(C、C++、OC)前端。---- Clang

  • 上面是官网对于Clang的一句话介绍,其实 Clang就是上文所提到的编译器前端
  • 用途:输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成LLVM Bitcode。接着在后端(back-end)使用LLVM编译成平台相关的机器语言。

LLVM 的简介


  • LLVM:顾名思义是(Low Level Virtual Machine)底层虚拟机?注意了,已经不是了!
  • 官网都说了:LLVM就是这个项目的全称,包含LLVM中介码(LLVM IR)、LLVM除错工具、LLVM C++标准库等一套工具,和传统底层虚拟机并没什么关系。


 

这篇关于iOS底层探索(一) - 从零开始认识Clang与LLVM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063497

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

哈希表的底层实现(1)---C++版

目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构,它通过将键(Key)映射到值(Value)的方式来实现快速的数据存储与查找。哈希表的核心概念是哈希

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用