好,我们先来简单了解一下编译的过程,再讲一下 LLVM 怎么解决编译中的问题。
编译的过程就像是翻译:
-
前端(Frontend):就像你写的文章,它会先被检查有没有语法错误(就像老师检查你的作文有没有拼写错误、句子不通顺),然后会变成一种更简单的语言,这种语言就是中间代码(好比是翻译成了一种大家都能懂的语言,方便后面的步骤处理)。
-
优化(Optimizer):这一步就像是你检查自己写的文章,看看有没有可以删掉的部分,或者有没有能合并的句子。目标是让文章更加简洁明了,省时间。就像程序代码中删掉没用的部分,合并冗余的代码,提升运行速度。
-
后端(Backend):这一步是把你翻译的文章(代码)转化成机器能直接执行的语言(也就是计算机能读懂的代码)。比如你写的是 x86 语言的代码,计算机能直接跑。但如果要生成 ARM 语言的代码(比如给手机的处理器用),那就得换一种生成方法了。
问题来了:
你看,传统的编译器就是这样直接把代码转换成机器语言。如果我今天想让它运行在不同类型的计算机上(比如电脑和手机),就需要重新做一套不同的转化方式。比如用 x86 的机器语言做的代码,跑不了 ARM 的手机处理器;而且每次想用不同编程语言(比如 C 或 Fortran)时,前端也需要重新写一遍。
这个问题怎么办?
就像在网络中,电脑和手机想要互相通信,但它们之间需要中转站。直接连在一起太复杂了,于是我们引入了交换机来管理信息的传输,这样电脑和手机不用直接互相连接,而是通过交换机来连接不同的设备。这样连接就更简单、清晰了。
LLVM 如何解决这个问题?
LLVM 就像一个中转站,它把编译过程分成了几个层次:
-
前端(Frontend):它负责理解你写的程序,检查语法,生成中间代码。这个阶段你可以选择不同的语言来写,比如 C 或 Fortran。
-
优化(Optimizer):优化阶段会帮你把代码优化得更高效。
-
后端(Backend):不同的计算机(比如 x86 电脑和 ARM 手机)需要不同的机器码,LLVM 提供了一种方法,让我们可以根据不同的硬件生成不同的机器码,后端只需要接收中间代码,生成适合不同设备的代码。
所以,通过 LLVM 的设计,我们可以解决前面提到的问题,不需要每次编译不同的语言时都重新做一遍,LLVM 的中间代码就像一个标准的“语言”,让不同的设备都能理解。

OLLVM 的原理
OLLVM 是在 LLVM 的基础上增加了 混淆(obfuscation)的功能。简单来说,混淆就是让程序的代码变得更加难以理解,从而增加破解的难度。
为什么混淆加在优化阶段?
在 LLVM 中,优化阶段处理的是中间代码(LLVM IR)。这是一个非常适合做混

最低0.47元/天 解锁文章
1098

被折叠的 条评论
为什么被折叠?



