Android编程中的一些概念(Wiki)

1. 编译器

编译器(compiler) ,是一种 应用程序,它会将某种编程语言写成的源代码(原始语言),转换为另外一种编程语言(目标语言),比如将 C 文件编程称为二进制文件。

它的主要目的是将人编写、维护的高级计算机语言所写出的 源代码程序,翻译为计算机能解读、运行的低价 机器语言 的程序,也就是 可执行文件

常见的编译器:

  1. GCC(GUN Compiler Collection)

GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。

  1. LLVM

LLVM是一个自由软件项目,它是一种编译器基础设施,以C++写成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期、链接时期、运行时期以及“闲置时期”的最优化。

2. 编译策略

2.1 即时编译(JIT,Just In Time)

  • JIT 产生的背景

在最早的时候,Java 是由解释器将每个 Java 指令转译成对等的微处理器指令,并根据转译后的指令依次执行,一个 Java 指令可能对应多个对等的微处理器指令,运行的时候还要解释,执行速度较慢。

这是 JIT 技术产生了,当 Java 执行 runtime 环境下,没遇到一个 class, JIT 就对这个 Class 进行编译,生成二进制码,花费少量时间换去后续解释的时间。

但是这也没有很大程序改善程序,因为有些 Java 文件很少得到执行,吧,编译这些 Java 文件的时间远远大于执行该文件对应指令的时间。基于此 JIT 产生了动态编译技术,动态的yu’fa

JIT 的缺陷:

每次启动应用都需要重新编译,运行时耗电量大。

动态编译的一种形式,提高程序运行效率的方法。程序运行有两种方式:

  1. 静态编译。执行程序前程序全部被翻译为机器码。
  2. 动态解释。解释执行则是边执行边翻译。

即时编译器则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。

即时编译器有两种类型:

1. 字节码翻译。
2. 动态编译翻译。

2.2 提前编译(AOT,Ahead Of Time)

运行时系统

运行环境有称运行时系统,是指把半编译的运行码在目标机器上运行的环境,如 Java
的 JRE。

可执行文件

可执行文件,是指 内容可被计算机解释为程序 的文件,通常可执行文件内含有二进制编码的微处理器指令,所以可执行文件也可被称为 二进制文件。
扩展名:

  • .exe

  • .com

  • .run

    脚本:

    不是所有的可执行文件都只存在计算机识别的数据,脚本中也是可执行文件,但是内含人类识别的数据,原因:脚本语言无需经过编译器先编译,就可经过解释器运行(Perl、Python、Shell)

解释器

解释器(interpreter),是一种 计算机程序,能够把高级编程语言一行一行解释运行,每次运行程序都需要将先转成另外一种语言再作运行,因此解释器的程序运行速度比较慢,运行程序只能将程序一行一行的翻译。

解释器的好处是它消除了编译整个程序的负担,程序可以拆分成多个部分来模块化,但这会让运行时的效率打了折扣。相对地,编译器已一次将所有源代码翻译成另一种语言,如机器代码,运行时便无需再依赖编译器或额外的程序,故而其运行速度比较快。

虚拟机

在计算机科学体系结构中,虚拟机指一种 特殊的软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是 基于这个软件所创建的环境来操作的软件

Dalvik 虚拟机

为 Google 开发的 Android 移动设备平台的核心组成部分之一,它支持 .dex(Dalvik Executable) 格式的 Java 应用程序的运行,.dex 格式为专门为 Dalvik 设计的一种压缩格式,适合内存和处理器速度有限的系统。

Java 虚拟机和大部分虚拟机包括 JVM 都是基于堆栈的虚拟机,而 Dalvik 虚拟机为 寄存器虚拟机。

从Android 5.0版起,Android Runtime(ART)取代Dalvik成为系统内默认虚拟机。

Android Runtime

ART,是一种在 Android 操作系统上的 运行环境, ART 能够把应用程序的字节码转换为机器码,是 Android 使用的一种新的虚拟机。与 Dalvik 不同的出 ART 使用的 AOT 技术,而 Dalvik 使用的为 JIT 技术。

ART 改善了性能、垃圾回收等方面。

ART引入了 AOT 技术,应用程序在安装时将所有的字节码编译成机器码,所以其在安装时花费的时间更长,同时也会占用更大的内部存储空间,用于存储编译后的代码。

代码类型

源代码:

指人类可读的计算机语言指令,如我们平时编程用到的 Java 、Py、PHP、C++ 等。

目标代码:

编译器或汇编器处理源代码后所生成的代码,它一般由机器代码或接近于机器语言的代码组成。存放目标代码的文件称为目标文件,常被称为 二进制文件

目标文件中包含着机器代码以及代码运行中使用到的数据,以及其他信息。

字节码:

字节码

字节码(ByteCode),通常指已经经过编译,但是与特定机器代码无关,需要解释器转译后才能成为机器的中间代码。字节码不能像源代码一样可以供人阅读,而是编译后的数值常量、引用、指令等构成的序列。

字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机。编译器将源码编译成字节码,特定平台上的虚拟机将字节码转译为可以直接运行的指令。字节码的典型应用为Java bytecode。

机器语言:

机器语言是一种指令集体系,这种指令体系称为机器代码,是指计算机的 CPU 可直接解读的数据。