中央处理单元(CPU)主要由运算器、控制器、寄存器三部分组成,从字面意思看运算器就是起着运算的作用,控制器就是负责发出CPU每条指令所需要的信息,寄存器就是保存运算或者指令的一些临时文件,这样可以保证更高的速度。
ARM和Intel处理器的一个区别是,前者使用精简指令集(RISC),而后者使用复杂指令集(CISC)
x86,x64,看似写法类似,但实际上代表了完全不同的含义。简单来说,x86指的是cpu的架构,x64是cpu位数。笼统的说,前者代表cpu的逻辑结构,后者是cpu运算能力。除了x86架构的cpu外,还有很多不同架构的cpu,其中最有名的就是IA架构,即intel安腾架构,主要用于服务器。两者之间的系统、软件不能通用。而x64的全称叫x86-64,也就是说x64是x86架构的64位cpu。
PC和服务器端是X86的天下,移动端则是ARM的天下。ARM架构的特点就是能耗表现优秀,但是单核性能不如x86处理器,主要用于手机平板等移动设备,ARM处理器的模式主要是授权,ARM公司并不提供成品,相关公司购买授权后可以自行设计或者采用公版的设计,然后推出自己的ARM处理器,高通,联发科,三星,华为海思,苹果都是如此
linux优点:各种CPU架构都可以跑
windows: windows目前只支持X86指令集, windows RT支持ARM指令集
android:ARM、X86和MIPS
mac OS:目前是x86,不过苹果宣布将逐步从英特尔处理器换成苹果自研处理器(arm)
IOS: ARM
应用程序的编译流程: 应用程序--->操作系统--->CPU指令,eg:一个.c应用程序,经操作系统编译为CPU指令,在CPU架构上执行。注意:一个应用程序,由操作系统编译为ARM指令,就只能在ARM体系架构上运行;编译为x86指令,就只能在x86体系架构上运行。
操作系统和CPU之间的关系:linux操作系统支持多种指令集,windows操作系统只支持x86指令集。
无论处于上层的软件多么的高级, 想要在CPU执行, 就必须被翻译成"机器码", 翻译这个工作由编译器来执行. 编译器在这个过程中, 要经过"编译", "汇编", "链接"几个步骤, 最后生成"可执行文件". 可执行文件中保存的是二进制机器码. 这串机器码可以直接被CPU读取和执行.
要设计处理器,首先就需要有指令集,规定处理器相应操作,通过指令集去控制处理器实现相应功能。但处理器是一堆硬件电路,只能识别二进制数据,所以指令集是由一堆二进制数据组成。而二进制数据对人类来说读起来很麻烦。为了方便人类操作指令集,发明了汇编语言来描述指令集。汇编语言类似人类语言,读起来方便多了。
虽然汇编语言读起来方便了,但也有缺陷。首先汇编语言操作起来还是挺麻烦的。其次汇编语言对应一条条指令集,所以当指令集改变时,就得修改相应汇编语言,导致其可移植性很差,不能跨平台使用,如ARM的汇编语言与Intel X86的就不同。这时人们就想开发一种更方便操作,超越指令集的语言,于是有了C,C++等高级语言。
但处理器只能识别二进制码,那怎么能识别高级语言呢?于是人们开发了编译器,依照如下顺序,将高级语言翻译成二进制码: 高级语言 汇编语言 二进制机器码。
https://www.zhihu.com/question/386866683/answer/1149429071
以上两种代码,一个是C语言源码,另一个是汇编/机器码。其中汇编/机器码确实对平台要求很多,操作系统不兼容不行、硬件架构不兼容也不行,差一点就没用。也就是说:汇编/机器代码特别不能跨平台。那C语言呢?C语言就是为了跨平台而生的!但这个“跨平台”说的是不修改源码的前提下,可以编译成不同平台的版本。也就是说:不用改C语言代码,但是要换编译器重新编译一次。
解释型语言/编译型语言 -> 解释器/编译器(不同CPU指令集会生成不同的二进制机器码,汇编码也一样) -> CPU可以执行的机器码
C++是解释型语言,winodws下的编译器:MSVC, 类unix下的编译器:GCC;JAVA可以被认为是编译型语言,另不同CPU架构的JVM也是不一样的。