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的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

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垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。