当前位置: 首页 > news >正文

手写一个PrattParser基本运算解析器4: 简述iOS的编译过程

点击查看 基于Swift的PrattParser项目


iOS项目的编译过程与PrattParser解析器

前面三篇我们看到了PrattParser解析器的工作原理, 工作过程, 我们了解到PrattParser解析器实际上是模拟了编译过程中的 词法分析语法分析语义分析中间代码生成 这几个编译前端过程.

那么PrattParser解析器与我们实际开发iOS项目有什么样的联系呢? 其实, 编译前端的工作只是iOS编译过程中的一小部分工作. 对此, 这就不得不说一下iOS项目的编译过程了.

首先, 我们先说结论, 对于一个Objective - C 项目来说, LLVM 中的 Clang 作为编译器, 负责代码编译的主要过程.

但是对于一个Swift项目, 编译前端的工作则是由 Swift 自己编写的编译器完成, 中间代码优化编译后端的工作仍然是 LLVM 中的 Clang 来完成的.

接下来, 我们就结合着实际 OC 项目 和 Swift 项目 的编译过程来具体说说iOS的编译过程.


OC项目的编译过程

对于一个 OC项目 的项目编译过程来说, 就是从你点击运行 Run 或者 Build 开始的.

那么我们怎么看一下一个iOS项目中编译过程都做了哪些事情呢? 我们如图所示需要点击xcode开发工具的 Show the Report navigator, 则可以查看我们所有的运行, 编译, 单元测试记录.

选择一次编译记录, 我们发现具体的编译过程是如下图所示的.

上图主要分为三个编译过程.

  • Prepare build : 准备阶段, 主要是创建一些编译过程的文件夹, 以及创建编译描述.

  • Build target Pods-xxx : 编译项目依赖cocoapods的相关三方库, 并且制作对应的静态库文件. 这里就不过多叙述了.

  • Build target OCBuild : 编译项目阶段, 编译过程如下所示.

    上图的蓝色区域内部就是执行了 LLVM 相关的 编译前端, 编译后端 的相关工作. 也就是说 PrattParser解析器实际上只是模拟了其中编译前端的工作. 虽然占据的步骤很少, 但是却是整个App编译过程中最重要的一部分.

    另外由于App编译步骤的改动, 最新的这一版的App编译顺序已经是和以前App编译步骤顺序都不同了, 但是在本质上它们的工作内容大体上是一致的.


Swift项目的编译过程

Swift项目 的编译过程实际上在外部看起来和 OC项目 的过程基本上是一致的. 这里就不过多叙述了.

对于 asset资源编译过程 LaunchScreen Main编译过程 app签名过程 app合法性验证过程 app打包过程 这样的一些过程, 我们只需要了解即可. 我们要深究的是 在编译源码的过程中, OC项目Swift项目 都有哪些不同之处?


OC 与 Swift 编译代码过程

前面我们说过对于一个Objective - C 项目来说, LLVM 中的 Clang 作为编译器, 负责代码编译的主要过程. 但是对于一个Swift项目, 编译前端的工作则是由 Swift 自己编写的编译器完成, 中间代码优化编译后端的工作仍然是 LLVM 中的 Clang 来完成的.

在编译OC源代码的过程具体的主要是这样的. 整个过程全部由 LLVM 来构建. 生成的中间代码为 LLVM IR 的形式的.

对于Swift编译过程来说, 和编译OC源代码还是有一定区别的.

由于 Swift编译器 作为整个链路的编译前端, 同时我们根据官方的Swift编译器架构说明, Swift编译器并不是直接生成 LLVM IR 形式的中间代码, 而是生成 SIL 格式的中间代码, 经过优化之后, 才会最终生成 LLVM IR 形式的中间代码.

所以对于Swift编译过程来说, 大体的流程图应该是这样的.


总结

通过这样的对比, 我们就对iOS编译过程以及PrattParser 在iOS编译过程中到底是模拟了哪个过程有了大体的了解.

同时, PrattParser解析器 这一个系列就算小完结了, 如果有问题, 欢迎评论指导, 骚栋这里感谢了~


点击查看 基于Swift的PrattParser项目


相关文章:

手写一个PrattParser基本运算解析器4: 简述iOS的编译过程

点击查看 基于Swift的PrattParser项目 iOS项目的编译过程与PrattParser解析器 前面三篇我们看到了PrattParser解析器的工作原理, 工作过程, 我们了解到PrattParser解析器实际上是模拟了编译过程中的 词法分析 、语法分析 、语义分析 、 中间代码生成 这几个编译前端过程. 那么P…...

【Java集合类面试六】、 HashMap有什么特点?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:HashMap有什么特点&…...

基于LSTM的天气预测 - 时间序列预测 计算机竞赛

0 前言 🔥 优质竞赛项目系列,今天要分享的是 机器学习大数据分析项目 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/po…...

SpringBoot AOP + Redis 延时双删功能实战

一、业务场景 在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,修改请求的实现中需要修改数据库后,级联修改Redis中的数据。 请求一:A修改数据库数据 B修改Redis数据 请求二&#xff…...

【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:JDK7和JDK8中的HashMap有…...

el-tree 获取过滤后的树结构

正常来说element框架应该返回的,但实际上没有,只能自己处理了 递归处理,思路就是赋值,如果是自己过滤到的数据就push进去,不是就不要 let newCheckTree [] let tree get_tree(treeData,newCheckTree); //获取过滤…...

Windows连接SFTP服务

最近有个新需求需要通过SFTP方式连接到一个FTP中下载相关内容 1.使用命令行方式 在cmd中使用如下命令 sftp -P [port] [username]ip #示例 sftp -P 666 ftp123.123.123.123然后弹出的提示输入yes,再输入密码就可以了。 2.使用资源管理器方式 普通FTP可以使用资源…...

《红蓝攻防对抗实战》五.内网探测协议出网之DNS协议探测出网

DNS(Domain Name System)即域名解析系统,可将域名解析到对应访问IP。下面我们还是以系统自带命令为案例,进行演示DNS协议探测出网。 目录 一.Windows系统探测DNS协议出网 二.Linux系统探测DNS协议出网 1. Dig命令 2.Nslookup命…...

计算机算法分析与设计(18)---回溯法(介绍、子集和问题C++代码)

文章目录 一、回溯法介绍二、子集和问题2.1 知识概述2.2 代码编写 一、回溯法介绍 1. 回溯法(back tracking)是一种选优搜索法,又称为试探法,有“通用的解题法”之称,按选优条件向前搜索,以达到目标。但当探…...

[Hive] explode

在 Hive 中,explode 函数用于将数组(Array)或者Map类型的列拆分成多行, 每个元素或键值对为一行。这允许我们在查询中对数组或 Map 进行扁平化操作。 下面是使用 explode 函数的示例: 假设我们有一个包含数组字段的表…...

2023年10月22日找工作面试交流遇到的基本问题

交叉编译解决的痛点问题 不同硬件体系结构之间的编译问题。嵌入式系统开发需要在主机上编写代码。提高效率和节省时间。软件移植和管理依赖关系。 不同硬件体系结构之间的编译问题:例如,你开发了一个针对Intel x86架构的应用程序,但想要在Ra…...

如何判断要不要用振动技术来进行设备预测性维护

在现代工业设备运行过程中,及时发现设备故障并进行维修对于确保生产线的正常运行至关重要。振动分析技术作为一种先进的设备监测和预测性维护方法,通过实时监测和分析设备的振动信号,可以提前发现潜在故障,降低停机时间和维护成本…...

数据结构和算法——用C语言实现所有树形结构及相关算法

文章目录 前言树和森林基础概念二叉树二叉树的遍历二叉树的构造树和森林与二叉树之间的转化树和森林的遍历 满二叉树完全二叉树线索二叉树线索二叉树的构造寻找前驱和后继线索二叉树的遍历 最优二叉树(哈夫曼树)哈夫曼树的构造哈夫曼编码 二叉排序树&…...

OTA: Optimal Transport Assignment for Object Detection 论文和代码学习

OTA 原因步骤什么是最优传输策略标签分配的OT正标签分配负标签分配损失计算中心点距离保持稳定动态k的选取 整体流程代码使用 论文连接: 原因 1、全部按照一个策略如IOU来分配GT和Anchors不能得到全局最优,可能只能得到局部最优。 2、目前提出的ATSS和P…...

前后端交互—跨域与HTTP

跨域 代码下载 同源策略 同源策略(英文全称 Same origin policy)是浏览器提供的一个安全功能。 MDN 官方给定的概念:同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这 是一个用于隔离潜在恶意文件的重要安全机制。 通俗的理解:浏览器规定&a…...

Error和Exception的关系以及区别

在Java中,Error 和 Exception 是两种不同类型的异常类,它们都继承自 java.lang.Throwable,但在用途和处理方式上有重要区别。 Error: Error 表示在程序运行过程中,通常由于系统或环境的严重问题而引起的异常情况。这些问题通常是无…...

Hive SQL 函数高阶应用场景

HIVE作为数据仓库处理常用工具,如同RDBMS关系型数据库中标准SQL语法一样,Hive SQL也内置了不少系统函数,满足于用户在不同场景下的数据分析需求,以提高开发SQL数据分析的效率。 我们可以使用show functions查看当下版本支持的函数…...

linux下C++开发环境搭建

一.安装GCC,GDB 1.1 先更新软件包安装源 sudo apt update1.2 安装编译器和调试器 sudo apt install build-essential gdb"build-essential" 是编译代码所需要的工具。 "gdb" 是调试器。1. build-essential:- "build-essential" 是一个用于Ubu…...

报错问题解决办法:Decryption error sun.security.rsa.RSAPadding.unpadV15

报错问题解决办法:Decryption error sun.security.rsa.RSAPadding.unpadV15 出现的问题 javax.crypto.BadPaddingException: Decryption errorat sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380) ~[na:1.8.0_131]at sun.security.rsa.RSAPadding.unpa…...

LVS+DR部署

LVS-DR的工作原理: 1.客户端会发送请求到vip 2.LVS的调度器接受请求之后,根据算法选择一台真实服务器,请求转发到后端RS,请求的报文的目的MAC地址,修改成后端真实服务器的MAC地址,转发。 3.后端真实服务器…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Robots.txt 文件

什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

大数据学习(132)-HIve数据分析

​​​​🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言&#x1f4…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...