编译器过程

news2024/11/24 19:50:18

编译器过程

在这里插入图片描述

如果这个框架对应LLVM,为什么这么说LLVM是个框架呢?
	是因为它提供了中间表示的定义,即前端输出的文本格式定义.
那么 "前端" 可以是两者其一 : Clang 或者 LLVM-GCC
"通用优化""x86后端" 是 LLVM 提供的. // LLVM 也提供 riscv后端,arm后端

编译器过程涉及到的现成工具

他们通常被用于开发编译器的前端或后端部分,通过自动化生成代码的方式,减少了手动编码的工作量,提高了开发效率和代码质量。

词法分析器生成器:
    它根据给定的词法规则和正则表达式,自动生成词法分析器。
    常见的词法分析器生成器有Flex和JFlex等。

语法分析器生成器:
    它根据给定的语法规则和上下文无关文法,自动生成语法分析器。
    常见的语法分析器生成器有Yacc和Bison等。

语义分析和中间代码生成器:
    它将源代码转换为中间代码,中间代码是一种与具体机器无关的中间表示形式,方便后续的优化和代码生成。
    常见的中间代码生成器有LLVM和GCC等。

中间代码优化器:
    它对中间代码进行优化,以提高程序的执行效率和减少资源消耗。
    常见的优化器有LLVM的LLVM和GCC等。

目标代码生成器:
    它将中间代码转换为目标代码,目标代码是与具体机器相关的机器代码。
    常见的目标代码生成器有LLVM和GCC等。

编译器分类

compiler

a tool that takes in a source file and produces a object file for a specific architecture and systems
  • LLVM
这不是一个缩写,就是这个项目的全名。
是伊利诺伊大学为了提供一个现代的、基于 SSA(静态单一赋值) 的、可以动态、静态编译任何编程语言的编译方案而开展的研究项目,
核心是个编译器工具集。
    
LLVM(低级虚拟机)是一个开源的编译器基础设施,它提供了一组模块化的编译器相关工具和库。
LLVM的目标是提供一种灵活、可扩展的编译器框架,支持多种编程语言和平台。
它提供了中间表示(IR)、优化器和代码生成器等组件,可以用于构建编译器、即时编译器和静态分析工具。

LLVM 官方开发的前端有LLVM-GCC 和 CLang.
GCC 的 中间语言是 Generic.
LLVM-GCC 是通过裁剪和修改的 GCC的前端,使其产生 LLVM中间语言(LLVM IR),支持 C,C++,FORTRAN,Ada 等高级语言 . 
Clang 则是 LLVM社区开发的前端,支持 C,Object-C 和 C++ 等高级语言.
    
LLVM 能够 和 LLVM-GCC 或者 Clang 一起完成图中所述的整个编译过程
  • GCC
GNU(操作系统)编译器套装(the GNU Compiler Collection)。
是许多现代类 Unix 操作系统默认的编译器,包括 Mac OSX 系统,但后来 Mac OSX 改为用 Clang 编译器了。
GCC  能够单独 完成图中所述的整个编译过程
  • Clang
是 LLVM 编译器工具集的前端,输出代码对应的抽象语法树(AST),再编译成LLVM Bitcode,由后端使用 LLVM 编译成平台相关的机器代码。
因为 GCC 使用 GPL 协议(反版权),因此 Apple 无法闭源使用修改版的 GCC,而 LLVM 支持 BSD 协议(商业友好),于是有了 Clang。
  
Clang是基于LLVM架构的一个C/C++/Objective-C编译器前端。
它使用LLVM作为后端来生成目标代码。
Clang的目标是提供一个高性能、模块化、可扩展的编译器前端,能够提供快速的诊断和静态分析功能。
它具有良好的C++支持,并且可以作为一个库嵌入到其他应用程序中使用。
 
因为Clang是基于LLVM开发的,所以经常和LLVM一起提及。
在很多情况下,当人们说"LLVM"时,实际上指的是整个LLVM项目,包括LLVM核心以及其他工具和库,如Clang。
因此,有时候会给人一种LLVM包括Clang的感觉。
但是从技术上讲,它们是独立的项目,可以单独使用或组合在一起使用.

要独立使用Clang,您只需要安装Clang本身,而不需要安装整个LLVM项目.
    
Clang 能够和 LLVM 一起完成图中所述的整个编译过程.
Clang 能单独使用,他能生成LLVM IR.
Clang 不能单独完成编译过程,他只能生成LLVM IR, 后面的过程需要其他工程来处理,著名的工程只有LLVM,目前没有其他工程
你也可以用Clang 放入你的工程中,你的工程负责补足其他的功能,来完成整个编译过程.

compiler compiler

a tool that takes in a grammar file and produces a source file for a compiler
yacc bison lex/flex
Lex是lexical compiler的缩写,是Unix环境下非常著名的工具, 
Lex (最早是埃里克·施密特和 Mike Lesk 制作)是许多 UNIX 系统的标准词法分析器(lexical analyzer)产生程式,而且这个工具所作的行为被详列为 POSIX 标准的一部分。

Lex的基本工作原理为:由正则表达式生成NFA,将NFA变换成DFA,DFA经化简后,模拟生成词法分析器。

Lex 主要功能是生成一个词法分析器(scanner)的 C 源码,描述规则采用正则表达式(regular expression)。
描述词法分析器的文件 *.l 经过lex编译后,生成一个lex.yy.c 的文件,然后由 C 编译器编译生成一个词法分析器。

compiler 资料

原理

  • [编译器设计第二版]

clang

"Clang Static Analyzer" by Gabor Horvath
    该书介绍了 Clang 静态分析器的原理和用法,以及如何使用 Clang 进行代码质量分析和错误检测。

LLVM

  • [LLVM 编译器 实战教程 ]

  • [LLVM Cookbook]

  • LLVM RISCV编译器编译QuickStart


"Getting Started with LLVM Core Libraries" by Bruno Cardoso Lopes and Rafael Auler
    这本书介绍了LLVM核心库的基础知识和使用方法,涵盖了词法分析、语法分析、优化和代码生成等方面的内容。

"The LLVM Cookbook" by Mayur Pandey and Suyog Sarda
    这本书提供了丰富的实用示例,帮助读者理解和使用LLVM工具链。
    它涵盖了各种主题,包括中间代码生成、优化、JIT编译等。

"Clang and LLVM: Advanced Compilation Techniques and Tools" by Rafael Auler
    该书深入剖析了 Clang 和 LLVM 的内部实现原理,包括前端编译、优化和后端代码生成等方面的内容。

"LLVM Essentials" by Suyog Sarda
    该书从一个实践者的角度出发,介绍了如何使用 LLVM 和 Clang 构建编译器工具链,以及如何进行代码优化和调试。

gcc

"Advanced Compiler Design and Implementation" by Steven Muchnick
    这是一本经典的编译器设计与实现的书籍,其中介绍了GCC和其他编译器的设计和实现原理,
    包括中间代码表示、代码优化和目标代码生成等方面的内容。
    
"GNU Compiler Collection (GCC) Internals" by Richard M. Stallman and others
    该书是 GCC 开发者的指南,介绍了 GCC 编译器的内部结构、架构和设计原理,以及如何进行编译器扩展和优化。

"GCC: The Complete Reference" by Arthur Griffith
    该书全面介绍了 GCC 编译器的各个方面,包括编译过程、优化技术、调试和 profiling 等内容,适合对 GCC 感兴趣的读者。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络机顶盒什么牌子好?自费5000+测评整理网络机顶盒排行榜

在挑选网络机顶盒的时候很多人贪便宜选山寨杂牌,买回家问题频发,我做数码测评几年来身边的朋友们总会问我网络机顶盒什么牌子好,我自费购入了将近二十款网络机顶盒,通过软硬件的全方位对比后整理了网络机顶盒排行榜TOP5&#xff1…

CentOS7配置yum清华源、阿里源

CentOS7配置yum清华源、阿里源 本文为自己安装记录回顾用 下面的是Centos7 更换yum清华源、阿里源 Centos7默认的服务器是在国外,连接很慢。 更换成国内的镜像源,使用yum清华源、阿里源,连接就会快一点 下面介绍更换方法 前提:打…

SSD202D-logo分区添加dtb

SSD202D-kernel-uimage后面加入dtb_旋风旋风的博客-CSDN博客 1.由于内核的uimage老是压缩解压缩,拿到压缩包里面dtb实在困难; 2.把dtb烧在后面又有安全隐患;而且还会有打包升级方法ota之类的很多;又毙掉了, 3.最后直接把dtb放在logo的包里,但是logo包要想添加好,也要深刻的理…

【小梦C嘎嘎——启航篇】string常用接口的模拟实现

【小梦C嘎嘎——启航篇】string常用接口的模拟实现😎 前言🙌string 模拟实现1、iterator 迭代器相关使用函数实现2、构造函数接口实现3、 传统写法——拷贝构造函数接口实现4、 现代写法——拷贝构造函数接口实现5、析构函数接口实现6、传统写法—— 赋…

开源网盘空间本地挂载神器,挂载百度、阿里云盘、OneDrive等云盘到本地工具-AList

开源网盘空间本地挂载神器,挂载百度、阿里云盘、OneDrive等云盘到本地工具-AList 什么是Alist 一个支持多种存储,支持网页浏览和 WebDAV 的文件列表程序,由 gin 和 Solidjs 驱动。 AList 是一款免费开源支持多存储的自建网盘程序 (文件列表…

吃肉原创——使用PYQT设计的yolov8目标检测GUI界面

需要快速编写一个GUI图形界面 pip install pyqt5 pip install pyqt5-tools然后去conda环境中查找启动程序 F:\APP\miniconda\envs\yolov8gui\Lib\site-packages\qt5_applications\Qt\bin\designer.exe双击可以启动,我们可以把它发送到桌面快捷方式 准备设计图&am…

最通俗易懂的 - Tomcat 核心源码仿写 第二版代码

– 更新信息 – 第一版代码实现了基本的交互功能,但只实现了单线程,此次迭代修改多线程,并升级为Maven项目,同时优化代码排版,提高代码可读性 第一版代码介绍博客地址:最通俗易懂的 - Tomcat 核心源码仿写…

odoo-035 Pycharm git commit 提交提示 No changes detected

文章目录 问题查找解决其他? 问题 在 gitee 上面新建的 git 项目,dowanload 下来,在 Pycharm 中修改后发现改完就变成白色到了,不是绿色或蓝色的,然后 git commit 的时候提示 No changes detected。 查找 上面是在 …

spring bean创建总览 1

1 开始 这是一个总图 下边慢慢看 我们最基础的写的方式就是xml的方式去写 像这样, 而我们会通过applicationContext的方式去获得我们的bean ,我其中一篇博客就写到了applicationContext他的父类就是beanFactory 但是中间的是怎么样处理的呢&#xff1f…

springboot、java实现调用企业微信接口向指定用户发送消息

因为项目的业务逻辑需要向指定用户发送企业微信消息&#xff0c;所以在这里记录一下 目录 引入相关依赖创建配置工具类创建发送消息类测试类最终效果 引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

从 Ansible Galaxy 使用角色

从 Ansible Galaxy 使用角色 根据下列要求&#xff0c;创建一个名为 /home/curtis/ansible/roles.yml 的 playbook &#xff1a; playbook 中包含一个 play&#xff0c; 该 play 在 balancers 主机组中的主机上运行并将使用 balancer 角色。 此角色配置一项服务&#xff0c;以…

代码随想录算法训练营第63天|单调栈part02|503.下一个更大元素II、 42. 接雨水

代码随想录算法训练营第63天&#xff5c;单调栈part02&#xff5c;503.下一个更大元素II、 42. 接雨水 503.下一个更大元素II 503.下一个更大元素II 思路&#xff1a; 如何处理循环数组 相信不少同学看到这道题&#xff0c;就想那我直接把两个数组拼接在一起&#xff0c;然…

银河麒麟服务器v10 sp1 .Net6.0 上传文件错误

上一篇&#xff1a;银河麒麟服务器v10 sp1 部署.Net6.0 http https_csdn_aspnet的博客-CSDN博客 .NET 6之前&#xff0c;在Linux服务器上安装 libgdiplus 即可解决&#xff0c;libgdiplus是System.Drawing.Common原生端跨平台实现的主要提供者&#xff0c;是开源mono项目。地址…

小红书美妆护肤种草推广:深度剖析与实战策略

在这个平台上&#xff0c;用户可以分享自己的购物心得和产品评价&#xff0c;为其他消费者提供购买参考。这种基于用户真实体验的分享&#xff0c;更容易赢得消费者的信任&#xff0c;从而提高产品的购买转化率。 小红书俨然成为了美妆护肤品牌种草推广的主要战场&#xff0c;…

如何实现客户自助服务?打造产品知识库

良好的客户服务始于自助服务。根据哈佛商业评论&#xff0c;81% 的客户在联系工作人员之前尝试自己解决问题。92% 的客户表示他们更喜欢使用产品知识库/帮助中心。 所以本文主要探讨了产品知识库是什么&#xff0c;有哪些优势以及如何创建。 产品知识库是什么 产品知识库是将…

“展会建筑小背心”被百万网友吐槽火遍网络!到底为什么?

奇葩的建筑在国内绝对是一个又一个经典的存在&#xff01;前有央视大楼被网友吐槽像大裤衩&#xff0c;后就有金主爸爸富而喜悦耗资50多万设计的展会建筑&#xff0c;被数万网友温柔吐槽像极了“展会建筑小背心”&#xff01;更是在不到短短的24小时里&#xff0c;就被微博网友…

Scratch 之 如何制作鼠标框(2)—— 鼠标框框定角色

hello&#xff0c;大家好&#xff0c;欢迎来到鼠标框系列的第二课时&#xff01; 咱们废话不多说&#xff0c;直接开始 首先&#xff0c;温故知新一下&#xff0c;上个教程我们讨论了如何绘制鼠标框&#xff0c;网址&#xff1a;绘制鼠标框 你说&#xff0c;一个鼠标框&…

excel条件格式:不同组对应位置对比标记

问题描述 下图中有两组数据&#xff0c;想要对比两个对应位置的数据并标记 条件格式 选中其中一个单元格&#xff0c;条件格式->新建规则 使用公式确定要设置格式的单元格&#xff0c;自定义需求 格式化剩余同样标准的单元格

自定义WEB框架结合Jenkins实现全自动测试

自定义WEB框架结合Jenkins实现全自动测试 allure生成 allure生成 1.allure–纯命令运行 -固定的–稍微记住对应的单词即可。2 安装&#xff0c;2个步骤: 1.下载allure包&#xff0c;然后配置环境变量。 https://github.com/allure-framework/allure2/releases/tag/2.22.4 2.在…

卫星定位接收机的现场安装步骤

卫星定位接收机的现场安装步骤如下&#xff1a; 1.选址和规划&#xff1a;选择一个位于开阔空地或无遮挡的位置&#xff0c;以便卫星信号可以顺利接收。确保安装位置可靠稳定&#xff0c;没有物体遮挡。 2.安装支架&#xff1a;根据选定的位置&#xff0c;安装接收机的支架&a…