编译器的工作原理
翻译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器言)。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
了解编译器工作原理之前我们先来了解一下与之相关的内容,什么是 MSIL、JIT、字节码?
MSIL:(Microsoft Intermediate Language) 微软中间语言。
MSIL
是将.NET代码转化为机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言,当用户编译一个.NET程序时,编译器将
源代码翻译成一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码。由于公共语言运
行库支持多种实时编译器,因此同一段msil代码可以被不同的编译器实时编译并运行在不同的结构上。
当编译器产生MSIL时,它也产生元数据。元
数据描述代码中的类型,包括每种类型的定义、每种类型的成员的签名、代码引用的成员和运行库在执行时使用的其他数据。MSIL
和元数据包含在一个可移植可执行 (PE) 文件中,此文件基于并扩展过去用于可执行内容的已公布的 Microsoft PE 和公共对象文件格式
(COFF)。这种文件格式包含 MSIL 或本机代码以及元数据,使得操作系统能够识别公共语言运行库映像。文件中的元数据以及 MSIL
的存在使代码能够描述自身,这意味着不再需要类型库或接口定义语言 (IDL)。运行库在执行过程中根据需要从该文件中查找并提取元数据。
JIT编译器:Just-In-Time Compiler,即时编译器。
JIT编译器能够将MSIL编译成为各种不同的机器代码,以适应对应的操作系统平台,最终使得程序在目标操作系统中能够顺利运行。
字节码:字节是电脑里的数据量单位
字
节码(Byte-code)是一种包含执行程序、由一序列 op
代码/数据对组成的二进制文件。字节码是一种中间码,它比机器码更抽象。它经常被看作是包含一个执行程序的二进制文件,更像一个对象模型。字节码被这样叫
是因为通常每个 opcode 是一字节长,但是指令码的长度是变化的。每个指令有从 0 到 255(或十六进制的: 00
到FF)的一字节操作码,被参数例如寄存器或内存地址跟随。
在计算机中,数据只用0和1两种表现形式,(这里只表示一个数据点,不是数字),一个0或者1占一个“位”,而系统中规定8个位为一个字节,用来表示常用的256个字母、符号、控制标记,其中用一个位来进行数据校验,其他七个位用来记录数据。
按计算机中的规定,一个英文的字符占用一个字节,(如,."':;avcAVC都占用一个字节),而一个汉字以及汉字的标点符号、字符都占用两个字节,(如,。“”:;AVCavc他们就得占用两个字节)。
另外,他们是没有办法比较的,只能讲一个字符占用一个字节,N个字符占用N个字节。
K是千 M是兆 G是吉咖 T是太拉
8bit(位)=1Byte(字节) 1024Byte(字节)=1KB 1024KB=1MB 1024MB=1GB 1024GB=1TB
Java中,字节码是CPU构架(JVM)的具有可移植性的机器语言。
学计算机的都知道,计算机中的数据都是以二进制的形式存储的,因此计算机只认识0和1,也就是机器语言。因为机器只能识别高低电压,
所以计算机用0和1来表示高低电压。
机器语言 -》 汇编语言(指令太多)-》高级语言(称之为高级语言是因为它更接近人的思维) Basic 、c(有时也加低级语言,有点类似汇编)、c++、java、c#等等
编译器工作原理示意图:


浙公网安备 33010602011771号