讨论一下
作为一个java程序员,我们都知道,当我们写完代码,java文件会被编译为class文件,然后交给jvm去执行,那么这个执行过程是啥样的呢??
一般我们得到的解答都是,class代码会被解释(或者编译)成机器码,然后机器就知道如何运行了。
当你去查jvm是如何执行我们的代码的,一般回答到“机器码”就结束了,这是令我最不能理解的地方,怎么?计算机不认识我的java代码,就能认识机器码了?机器码是个啥玩意儿??
机器码
我们来了解一下机器码是什么,来看一下维基百科的解释:
机器语言(machine language)是一种指令集的体系。这种指令集称为机器代码(machine code),是计算机的CPU 或 GPU 可直接解读的资料。
机器代码有时也被称为原生码(Native Code),这个名词比较强调某种编程语言或库与执行平台相关的部分。
机器语言是用二进制代码表示的、计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。机器语言具有灵活、直接执行和速度快等特点。不同种类的计算机其机器语言是不兼容的,按某种计算机的机器指令编制的程序不能在另一种计算机上执行。
要用机器语言编写程序,编程人员需首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员要自己处理每条指令和每一数据的存储分配和输入输出,还需记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。而且,这样编写出的程序完全是0与1的指令代码,可读性差且容易出错。在现今,除了计算机生产厂家的专业人员外,绝大多数程序员已经不再学习机器语言。
机器语言是微处理器理解和使用的用于控制它的操作的二进制代码。
继续疑惑
从上面那段话,我们能知道,机器码是一种指令集,使用二进制代码表示,重点是这句:“它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。”
那么,我可以这样理解吗?
cpu=指令集的物理实现?
指令集是接口,cpu就是实现?
是不是可以理解为这样,cpu内的硬件设计,直接对应指令集的设计,比如指令集规定:0000代表读取操作,那么cpu的电路设计应该有一部分是当电路状态为0000的时候,进行读取。
新的疑惑:译码器?
然后继续查资料,带给我新的疑惑,译码器又是个啥??
译码器是啥子
维基百科是这么解释的:
译码器是电子技术中的一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等),功能与编码器相反。译码器一般分为通用译码器和数字显示译码器两大类。
关注重点:“逻辑电平”
那是不是能这么理解,机器码到了译码器,译码器来指挥cpu咋干。好像没啥毛病。