不同语言的代码是怎样让硬件看懂的?

李华
  • 32

解释器把高级语言翻译后,是怎么让硬件读懂的?

回复
阅读 4.5k
5 个回答

复习一下大学知识,不知道老师教得对不对(捂笑)

  1. 由编译器将高级语言转换为中间语言(比如MSIL),或汇编语言
  2. 由运行时编译器(JIT)将IL或汇编语言解析成CPU指令/Processor-specific instructions,称为机器语言,我随便搜索了下,比如这一篇《机器指令程序编写方法》http://blog.csdn.net/broadview2006/article/details/8189314
  3. 得到机器语言后,机器就能懂了,到了这一块,就得去了解机器指令、逻辑电路(什么与非门之类)知识领域了http://baike.baidu.com/view/23361.htm

感兴趣的话,可以去看《编译原理》http://baike.baidu.com/subview/29903/5127170.htm

前面的编译之类的别人说过了,我就试着描述一下机器语言如何工作的吧

嗯,假设我们有个非常非常原始的CPU,里面有4个寄存器(用Ri,i=0~3表示),外面有64K内存全部为一个程序占有,这个程序的机器码可能占了0~10K位置的内存,然后CPU指令集可能看起来是这个样子的

0~3 <地址>: 读内存<地址> 到寄存器Ri
4~7 <地址>: 把寄存器i的内容写进内存
8~11 <值>: 赋值给寄存器Ri
12~15 <地址>: 读内存<地址>,加寄存器i的值写回寄存器i

那么有个程序

a=1;
b=2;
c=a+b;

机器码可能看上去是这样的

8 1//R0=1
4 65535//a=R0 注意由于程序占了0~10K的内存,所以运行时的变量地址是倒过来放的
8 2//R0=2
4 65534//b=R0
0 65535//R0 = a
12 65534//R0 += b
4 65533//c=R0

然后CPU内还会有指令寄存器存放当前执行的指令,有还有个PC(Program Counter)寄存器存放当前执行的代码在内存里的位置

整个CPU的循环大致就是
获取指令 => 读取内存/寄存器 => 执行运算 => 写入内存/寄存器 => 写PC寄存器

然后goto其实就是写PC寄存器指定值,switch就是写PC寄存器一个变化的值,if就是根据别的寄存器的状态决定是否要写PC寄存器……等等

看一下这本书 《编码

简单理解的话就是中间有个翻译过程,把你写的程序翻译成了硬件能够懂的语言。
每个硬件体系都有自己的一套指令集,说白了就是这个硬件所真正能够认识的语言,在运行时它读取并执行这些指令。但是我们不可能直接用这些指令集去写程序,我们期望用对人类更加友好的方式去组织代码,这种期望促使着一大群牛人去开发出了高级语言,而开发高级语言的过程其实就是针对高级语言的规则(语法)去写一个翻译器(编译器/解释器)的过程,翻译器以用高级语言写的程序作为输入,输出硬件能够认识的指令集构成的程序,这样就能最终执行这个程序了。

以C语言为例子(编译语言):C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件
请输入图片描述

解释语言主要不依靠编译,在运行时直接解析成为机器语言