文章目录

  • LLVM
  • CPU架构
    • PowerPC
    • ARM
    • X86
    • MIPS
  • 编译执行和解释执行
  • 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 硅芯片的销售权。

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倍以上。

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

  1. Firefox 的User Agent 将移除 CPU 架构信息

    Mozilla 计划从 Firefox 的 User Agent(用户代理)和几个支持的 API 中移除 CPU 架构信息,以减少 Firefox 用户的"数字指纹".Web 浏览 ...

  2. (转)从CPU架构和技术的演变看GPU未来发展

    泡泡网显卡频道5月28日 自从AMD提出Fusion(融聚)的概念.NVIDIA加大力度推广GPU通用计算.Intel率先将CPU和GPU整合在一起之后,大家就会发现CPU和GPU从没如此亲密无间过, ...

  3. MongoDB的NUMA CPU架构问题

    NUMA是多核心CPU架构中的一种,其全称为Non-Uniform MemoryAccess,简单来说就是在多核心CPU中,机器的物理内存是分配给各个核的. 在NUMA架构的机子上启动mongodb进 ...

  4. bad cpu type in executable_【简讯】Intel将每5年重新开发一次CPU架构;华为EMUI 11曝光…...

    Intel将每5年重新开发一次CPU架构 日前,Intel TSCG高级副总裁.硅工程总经理.CPU大牛Jim Keller在视频采访中谈到了CPU研发的问题,之前Intel虽然有过Tick-Tock ...

  5. 如何查询当前手机的cpu架构,so库导入工程又出异常了?

    如何查询当前手机的cpu架构,so库导入工程又出异常了? 参考文章: (1)如何查询当前手机的cpu架构,so库导入工程又出异常了? (2)https://www.cnblogs.com/woaixi ...

  6. 【错误记录】Visual Studio 中配置 NDK 头文件路径 ( NDK 的三个头文件路径 | 与 CPU 架构相关 asm 头文件路径选择 )

    文章目录 一.报错信息 二.解决方案 1.NDK 的三个头文件路径 2.与 CPU 架构相关 asm 头文件路径选择 一.报错信息 参考 [Android 逆向]Android 进程注入工具开发 ( ...

  7. 【Android 逆向】ELF 文件格式 ( ELF 文件类型 | ELF 文件对应 CPU 架构 | ELF 目标文件版本 | 可执行程序起始地址 )

    文章目录 一.ELF 文件类型 ( 动态库文件 ) 二.ELF 文件对应 CPU 架构 三.ELF 目标文件版本 四.可执行程序起始地址 一.ELF 文件类型 ( 动态库文件 ) ELF 文件头 第 ...

  8. 【错误记录】Android Studio 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | 指定 APK 打包动态库的 CPU 架构 )

    文章目录 一.报错信息 二.解决方案 ( 指定 APK 打包动态库的 CPU 架构 ) 一.报错信息 外部引用 so 动态库 , 如果只有一个 armeabi-v7a 的动态库 , 那么如果在 arm ...

  9. 【错误记录】NDK 报错 java.lang.UnsatisfiedLinkError 的一种处理方案 ( 主应用与依赖库 Module 的 CPU 架构配置不匹配导致 )

    文章目录 一.问题描述 二.问题排查 三.解决方案 一.问题描述 NDK 开发 , 在调用 JNI 对应 Java 类时 , 静态代码块中 System.loadLibrary 语句调用时 , 报如下 ...

最新文章

  1. 谷歌又有手机黑科技:进入办公室就变静音,遇车祸自动报警
  2. 减少系统资源占用的15个CSS常识
  3. hh.exe反汇编chm
  4. Source Insight常用快捷键
  5. mysql 碎片率_MySQL数据碎片的整理和分析
  6. 深入理解Java main方法
  7. spss聚类分析_【SPSS数据分析】SPSS聚类分析的软件操作与结果解读 ——【杏花开生物医药统计】...
  8. python win32api.sendmessage_Python win32api sendmasg
  9. 微服务/分布式面试题与基础知识总结汇总
  10. 读书笔记——《一个人的朝圣》
  11. android平板电脑忘记密码怎么解锁,平板密码忘了怎么解锁
  12. imageJ把两张图片在时间轴上进行合并
  13. OSChina 教师节乱弹 ——辛苦你了,金将军
  14. 面包板入门电子制作 学习笔记8
  15. Python分类算法——多标签图像分类
  16. 常用数据集/工具下载地址
  17. Yeelight LED智能灯泡(彩光版)代码控制
  18. 电商软件性能测试,实战 | 电商业务的性能测试(一): 必备基础知识
  19. 一念逍遥一直说服务器维护,一念逍遥bug修复 一念逍遥最新更新计划
  20. Windows CE学习几个经验

热门文章

  1. 设计自己的异常类表示对负数求平方根的错误;从键盘输入一个数,若输入的数不小于0,则输出它的平方根;若小于0,则抛出自定义异常;在程序中处理异常并输出提示信息“输入错误,不能对负数求平方根”
  2. ajax不变音乐,WordPress Hermit音乐播放器插件支持Ajax防刷新不中断
  3. iphone屏幕上的圆圈怎么设置_iphone桌面上的圆圈怎么设置
  4. matlab成图怎么改,我想用成自己图像不知怎么改啊
  5. 重磅!清华大学又迎来一位外籍院长
  6. Computing Curricula 2005--计算学科的图形表示
  7. an....软件一直在加载,打不开的解决办法
  8. 零基础微信落地页小程序实战项目
  9. mysql编写存储过程给员工加工资_一个增加员工工资的数据库存储过程
  10. 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(3月8日)...