从LLVM说起,有关CPU架构,JIT等

LLVM

LLVM(Low Level Virtual Machine,不过官方为了避免混淆已经弃用该名称,将LLVM作为项目的全名),这是一个用 C++ 编写的开源项目,最开始作为伊利诺伊州大学的一个研究项目由 Swift 语言的创始人 Chris Lattner 进行开发。LLVM项目是模块化、可重用的编译器以及工具链技术的集合。

LLVM提供了与编译器相关的支持,可以作为多种语言编译器的后端来使用,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。

LLVM从一个学术研究项目进化成C、C++和Objective C编译器的通用后端。成功的关键是性能和适应能力,两者都得益于LLVM独特的设计和实现。
传统的编译器架构为:
Source Code -> [ Frontend & Optimizer & Backend ] -> Machine Code
对比,LLVM的架构为:
Source Code @ x -> [ x Frontend ] -> [ LLVM Optimizer @ IR ] -> [ LLVM m Backend ] -> Machine Code @ m
其中,x为C/C++, Objcect C等多种语言;m为x86,PowerPC,ARM等多种CPU架构。

  1. 不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)
  2. 优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,和具体语言无关;
  3. 扩展性好:如果需要支持一种新的编程语言,那么只需要实现一个新的前端;如果需要支持一种新的硬件设备,那么只需要实现一个新的后端

关于架构和示例,更详尽的说明参见:https://www.jianshu.com/p/1367dad95445

LLVM常见应用:

  1. 作为一种编程语言的预先(AOT ahead-of-time)编译器,或者用于即时编译(JIT just-in-time)编译器。
  2. 使用 LLVM 进行自动代码优化。
  3. 创建一门新的语言。LLVM将创建语言过程中最麻烦的事情:把编程语言翻译成多个平台上的可执行代码,做了支持和简化,所以,更容易使它创建一门新的语言。
  4. 为多种语言进行桥接,因为在IR层次多种语言是一致的,所以,你可以将你的语言转换为其他任何支持LLVM的语言。
  5. 使用LLVM丰富的工具链作为自己编程语言的强大支持。

CPU架构

PowerPC

二十世纪九十年代,IBM(国际商用机器公司)、Apple(苹果公司)和Motorola(摩托罗拉)公司开发PowerPC芯片成功,并制造出基于PowerPC的多处理器计算机。
后来,主流的PowerPC处理器制造商有IBM、Freescale™ Semiconductor(原摩托罗拉半导体部)、AMCC、LSI等。其中以IBM和Freescale的PowerPC处理器最为流行。

目前,PowerPC已经走向没落。
INTEL面对的是大众市场,信奉“摩尔定律”,在竞争激烈的隔热PC的市场,保持超强战斗力。IBM面对专业市场,新一代出来后,做得好不好,销量其实都差不多,技术人员向前发展的精神动力几乎就没有了。
由于 IBM PC 兼容机的逐步普及,技术上相对落后的英特尔反而占了更多的市场份额。在业务上,半导体只是摩托罗拉的一个部门,而微机处理器又只是其半导体部门的一项业务,可是它对于英特尔来讲却是全部。随着苹果也开始使用英特尔的处理器,摩托罗拉彻底推出了微机处理器市场:2005年,乔帮主在WWDC大会上正式宣布将在2年内将全部电脑产品转向Intel平台,2006年1月,搭载Intel Core Duo处理器的iMac和Macbook Pro就已经面世。
Android+ARM的阵营,使得一些公司做手机等终端的门槛大大的降低:小米、Oppo、华为这样的厂商迅速崛起,也是得益于此。
网关、交换机、路由等等本应该是属于大功耗RISC处理器的应用场景,PowerPC、MIPS原本牢牢占据这个领域,但是随着多核ARM的强大,逐步也失去优势。

ARM

ARM架构,过去称作进阶精简指令集机器(Advanced RISC Machine,更早称作:Acorn RISC Machine),是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。

ARM 公司本身并不靠自有的设计来制造或出售 CPU ,而是将处理器架构授权给有兴趣的厂家。例如,生产厂商有:TI (德州仪器)/Samsung(三星)/Freescale(飞思卡尔)/Marvell(马维尔)/Nvidia(英伟达)。
对于授权方来说,ARM 提供了 ARM 内核的整合硬件叙述,包含完整的软件开发工具(编译器、debugger、SDK),以及针对内含 ARM CPU 硅芯片的销售权。

扫描二维码关注公众号,回复: 9165007 查看本文章

X86

x86架构是重要地可变指令长度的CISC(复杂指令集电脑,Complex Instruction Set Computer),是英代尔Intel首先开发制造的一种微处理器体系结构的泛称。

架构底层有大量的硬件专利,x86架构做pc主板还有大量的外设和接口的专利,这么多年下来,形成了坚强的壁垒。第三方要想突破这样的壁垒,还需要各种外设和操作系统来形成的新的标准和专利的话,基本不可能。
那么只有从intel或者AMD获得x86架构的授权一条路,现在想获得授权,这两家都不会卖了,就算卖也是天价,加上研发成本的投入,成本就太高了,没法正常运营。
现在Amd市场占有率现在也就是百分之十左右,在盈利和亏损之间徘徊,第三家介入的话,不会比AMD更好。
intel的强大还在于它是最先进的半导体生产工艺制造商,三星和台积电都要排在后面。

威盛是除Intel、AMD之外,唯一一家拥有X86架构授权的公司,当然也是从intel授权来的,曾经有“台湾英特尔”之称,也曾于研发投入和人才各方面的原因,除了在低功耗等领域有领先的产品,后来也逐步退出了这个市场。

MIPS

MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。
MIPS技术公司是美国著名的芯片设计公司,MIPS自己只进行CPU的设计,之后把设计方案授权给客户,使得客户能够制造出高性能的CPU。

编译执行和解释执行

编译过程是将源代码转换为机器码的过程。
编译执行:整体编译完了,再开始执行。举例:C/C++。
解释执行:直接解释源代码,并且直接执行,没有编译过程。举例:JavaScript,python。

无论是编译执行还是解释执行,都需要经过:源码 -> 词法分析 -> 单词流 -> 语法分析 -> 抽象语法树 的过程。
此后,
编译执行会先将抽象语法树经过优化器并产生优化后的中间代码(可选),然后再生成目标代码。
解释执行会先将抽象语法树转换为指令流(可选),然后再通过解释器进行解释执行。

编译器:把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快。
解释器:只在执行程序时,才一条一条把字节码解释成机器语言给计算机来执行。

Java的执行模式:

  1. 方式一:用javac编译器将java源代码编译成我们常见的 .class文件(其中实现的是字节码,一种中间代码),然后程序在运行时,JVM将需要用到的 .class文件加载到内存中,从class文件中逐行读出每条指令,JVM中解释器解释每条指令并执行,即解释执行。
  2. 方式二:JDK1.2版本开始引入JIT编译。开始依然是由javac编译为.class文件,在程序运行时,JIT通过预热(收集信息找出热点)将热点代码以方法为单位,从字节码转换为机器码。在这种情况下,部分热点代码就是编译执行而不是解释执行了。
  3. 方式三:oracle JDK9就引入了实验性的AOT特性,直接将字节码编译成机器码,这样避免了JIT等方面的预热消耗。

JIT编译

动态编译(dynamic compilation)指的是“在运行时进行编译”;与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫静态编译(static compilation)。
JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT编译是动态编译的一种特例。JIT编译一词后来被泛化,时常与动态编译等价。

sun公司在jdk8之后的JVM技术实现是HotSpot,这里还有一层关系,JDK是java开发环境,JRE是java运行环境,JDK包含JRE,而JRE包含JVM。也就是说HotSpot是JVM的实现技术,是用C+汇编语言编写的,主要功能包括一个解释器和两个编译器,这也是为什么jdk8之后的JAVA是编译与解释混合执行模式的原因。两个编译器可以成为JIT编译器,即动态编译器,是两种模式,server模式和client模式。

JVM(特指Oracle JDK的HotSpot虚拟机)中的JIT特性:

  1. HotSpot虚拟机中内置了两个即时编译器:Client Complier和Server Complier,分别用在客户端和服务端。默认是采用解释器与其中一个编译器直接配合的方式工作。
  2. 用Client Complier可以获取更高的编译速度,用Server Complier可以获取更好的编译质量。程序使用哪个编译器,取决于虚拟机运行的模式。HotSpot虚拟机会根据自身版本与宿主机器的硬件性能自动选择运行模式,用户也可以使用“-client”或“-server”参数去强制指定虚拟机运行在Client模式或Server模式。
  3. 运行过程中会被即时编译器编译的“热点代码”有两类:被多次调用的方法和被多次调用的循环体。
  4. 在优化时,无论循环体还是方法,编译器都是以整个方法作为编译对象。
  5. HotSpot虚拟机采用基于计数器的热点探测方法,会设定方法调用计数器和回边计数器。
  6. 触发了JIT编译后,在默认设置下,执行引擎并不会同步等待编译请求完成,而是继续进入解释器按照解释方式执行字节码;编译工作在后台线程中进行;当编译工作完成后,下一次调用该方法或代码时,就会使用已编译的版本。
  7. 对一般的Java方法而言,编译后代码的大小相对于字节码的大小,膨胀比可能达到10倍以上。
发布了193 篇原创文章 · 获赞 23 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/zhiyuan411/article/details/102263449