forked from xiaoweiChen/Learn-LLVM-12
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Preface.tex
120 lines (62 loc) · 8.75 KB
/
Preface.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
\begin{flushright}
\zihao{0} 前言
\end{flushright}
构造编译器是一项复杂而有趣的任务。LLVM为编译器提供了可重用组件,其核心库实现了一个世界级的优化代码生成器,它为所有主流CPU架构转换代码提供了独立的中间表示。许多编译器已经在使用LLVM的相关技术了。\par
这本书会教您如何实现自己的编译器,并通过LLVM实现它。您将了解前端编译器如何将源代码转换为抽象语法树,以及如何从中生成中间表示(IR)。如何向编译器添加优化流水,对IR进行优化,并编译为性能不错的机器代码。\par
LLVM框架可以通过多种方式进行扩展,您将学习如何添加新的通道、新的机器指令,甚至是全新的LLVM后端。还有高级主题,如编译不同的CPU架构和扩展Clang、Clang静态分析器与插件和检查器也涵盖其中。本书遵循最实用的方法,并附带了示例源代码,这可以让您更容易得在项目中应用所学习到的知识。\par
\hspace*{\fill} \par %插入空行
\textbf{适宜读者}
本书为刚接触LLVM并且对LLVM框架感兴趣的编译器开发人员、爱好者和工程师编写。对于希望使用基于编译器的工具进行代码分析和改进的C++软件工程师,以及希望获得更多LLVM基本知识的LLVM库的用户也很有用。为了更有效地理解本书中所包含的概念,必须具备C++中级水平。\par
\hspace*{\fill} \par %插入空行
\textbf{本书内容}
\textit{第1章,安装LLVM},介绍如何设置开发环境。了解如何编译了LLVM库,并学习了如何自定义构建过程。\par
\textit{第2章,浏览LLVM},介绍各种LLVM项目,并讨论所有项目的统一目录结构。您将使用LLVM核心库创建第一个项目,还可以为不同的CPU架构编译它。\par
\textit{第3章,编译器结构},提供编译器组件的概述。您将实现可以生成LLVM IR的编译器。\par
\textit{第4章,将源码转换为抽象语法树},详细地介绍了如何实现编译器前端。您将为小型编程语言创建前端,最后构建抽象语法树。\par
\textit{第5章,生成IR——基础知识},展示了如何从抽象语法树生成LLVM IR。本章的最后,您将为示例语言实现编译器,从而产生汇编文本或目标代码文件。\par
\textit{第6章,生成高级语言结构的IR},介绍了如何将高级编程语言中常见的源语言特性转换为LLVM IR。您将了解聚合数据类型的转换、实现类继承和虚函数的各种选项,以及如何遵循系统的ABI。\par
\textit{第7章,生成IR——进阶知识},介绍了如何在源语言中为异常处理语句生成LLVM IR。了解如何为基于类型的别名分析添加元数据,以及如何向生成的LLVM IR添加调试信息,并且您将扩展编译器生成的元数据。\par
\textit{第8章,优化IR},介绍LLVM Pass管理器。您将实现你自己的Pass,作为LLVM的一部分或者插件,您将学习如何添加新Pass到优化流水中。\par
\textit{第9章,选择指令},介绍了LLVM如何减少生成机器指令的IR。您将学习如何在LLVM中定义指令,并将向LLVM添加一条新的机器指令,以便在选择指令时使用新指令。\par
\textit{第10章,JIT编译},讨论如何使用LLVM来实现JIT编译器。本章结束时,您将通过两种不同的方式实现自己的LLVM IR JIT编译器。\par
\textit{第11章,使用LLVM工具调试},探索了LLVM的各种库和组件,这可以帮助您了解应用程序中的bug。您将使用“杀虫剂”来识别内存溢出和其他错误。使用libFuzzer库,将随机数据作为输入测试函数。XRay也能帮助您找到性能瓶颈。您将使用Clang静态分析程序来识别源代码级的bug,并且可以将自己的检查程序添加到分析程序中。您还将学习如何使用自己的插件扩展Clang。\par
\textit{第12章,自定义编译器后端},说明如何向LLVM添加新的后端。需要实现所有必要的类。在本章的最后,将为某种CPU架构编译LLVM IR。\par
\hspace*{\fill} \par %插入空行
\textbf{编译环境}
\textit{需要一台运行Linux、Windows、macOS或FreeBSD的计算机,并为该操作系统安装了开发工具链。所需工具见表。所有工具都应该在shell的搜索路径中。}\par
\begin{table}[H]
\begin{tabular}{|l|l|}
\hline
书中涉及的软件/硬件 & 操作系统 \\ \hline
\begin{tabular}[c]{@{}l@{}} C/C++编译器:gcc 5.1.0或更高版本, clang3.5或更高版本\\ Apple clang 6.0或更高版本, Visual Studio 2017或更高版本\end{tabular} & \begin{tabular}[c]{@{}l@{}}Linux(任意衍生版), Windows,\\ macOS,或FreeBSD\end{tabular} \\ \hline
CMake 3.13.4或更高版本 & \\ \hline
Ninja 1.9.0 & \\ \hline
Python 3.6或更高版本 & \\ \hline
Git 1.7.10或更高版本 & \\ \hline
\end{tabular}
\end{table}
第9章“指令选择”中的DAG可视化,必须安装\url{https://graphviz.org/}的Graphviz。默认情况下,生成的图像是PDF格式的,所以需要PDF查看器来显示。\par
第11章“使用LLVM工具调试”中创建“火焰图”,需要从\url{https://github.com/brendangregg/FlameGraph}获取安装脚本。要运行该脚本,还需要安装最新版本的Perl,要查看图形,还需要一个能够显示SVG文件的Web浏览器(主流浏览器都没问题)。要在同一章中看到Chrome跟踪查看器可视化,需要安装Chrome浏览器。\par
\textbf{如果正在使用本书的数字版本,我们建议您自己输入代码或通过GitHub存储库访问代码(下一节提供链接),将避免复制和粘贴代码。}\par
\hspace*{\fill} \par %插入空行
\textbf{下载示例}
可以从GitHub网站\url{https://github.com/PacktPublishing/Learn-LLVM-12}下载本书的示例代码。如果有对代码的更新,也会在现有的GitHub存储库中更新。\par
我们还在\url{https://github.com/PacktPublishing/}上提供了丰富的图书和视频目录中的其他代码包。可以一起拿来看看!\par
\hspace*{\fill} \par %插入空行
\textbf{实例演示}
本书代码的演示视频可以在\url{https://bit.ly/3nllhED}上查看 \par
\hspace*{\fill} \par %插入空行
\textbf{下载彩图}
我们还提供了一个PDF文件,里面有本书中使用的屏幕截图/图表的彩色图像。可在此下载:\url{https://static.packt-cdn.com/downloads/9781839213502\_ColorImages.pdf}。\par
\hspace*{\fill} \par %插入空行
\textbf{联系方式}
我们欢迎读者的反馈。\par
反馈:如果你对这本书的任何方面有疑问,需要在你的信息的主题中提到书名,并给我们发邮件到\url{customercare@packtpub.com}。\par
勘误:尽管我们谨慎地确保内容的准确性,但错误还是会发生。如果您在本书中发现了错误,请向我们报告,我们将不胜感激。请访问\url{www.packtpub.com/support/errata},选择相应书籍,点击勘误表提交表单链接,并输入详细信息。\par
盗版:如果您在互联网上发现任何形式的非法拷贝,非常感谢您提供地址或网站名称。请通过\url{copyright@packt.com}与我们联系,并提供材料链接。\par
如果对成为书籍作者感兴趣:如果你对某主题有专长,又想写一本书或为之撰稿,请访问\url{authors.packtpub.com}。\par
\hspace*{\fill} \par %插入空行
\textbf{欢迎评论}
请留下评论。当您阅读并使用了本书,为什么不在购买网站上留下评论呢?其他读者可以看到您的评论,并根据您的意见来做出购买决定。我们在Packt可以了解您对我们产品的看法,作者也可以看到您对他们撰写书籍的反馈。谢谢你!\par
想要了解Packt的更多信息,请访问\url{packt.com}。\par
\newpage