计算机分为运算器,控制器,存储器,输入设备和输出设备五个部分.
CPU包括运算器和控制器;存储器包括cache,内存和外存(硬盘).
各个部件由总线连接,包括地址总线,数据总线,控制总线.
整体的执行流程如下:
(1) 上电,由晶振电路产生时序电路,作为计算机的脉搏,此后,每个时序边沿到来,都会驱动数字电路进行运算.
(2) 点击Rst,系统复位,在时序电路的触发边沿,将一个地址放到程序计数器,这个地址就是主板bios中的固定程序的首地址
(3) cpu将bios程序的第一行放入到指令寄存器,开始执行代码,
(4) bios完成系统初始化,并加载系统的bootloader到内存,执行完毕后,跳转到bootloader开始执行
(5) bootloader做一系列初始化,将OS调入,开始执行操作系统代码.
指令代码执行流程:
再来研究一下java代码的执行流程,先写一个测试类:
package com.pulma.test.codepactice;
public class Main {
public static void main(String[] args) {
compute();
}
public static void compute() {
int a = 1;
int b = 2;
int c = a + b;
System.out.println(c);
}
}
将代码反编译成字节码:
Compiled from "Main.java"
public class com.pulma.test.codepactice.Main extends java.lang.Object
SourceFile: "Main.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #6.#16; // java/lang/Object."<init>":()V
const #2 = Method #5.#17; // com/pulma/test/codepactice/Main.compute:()V
const #3 = Field #18.#19; // java/lang/System.out:Ljava/io/PrintS
tream;
const #4 = Method #20.#21; // java/io/PrintStream.println:(I)V
const #5 = class #22; // com/pulma/test/codepactice/Main
const #6 = class #23; // java/lang/Object
const #7 = Asciz <init>;
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Asciz LineNumberTable;
const #11 = Asciz main;
const #12 = Asciz ([Ljava/lang/String;)V;
const #13 = Asciz compute;
const #14 = Asciz SourceFile;
const #15 = Asciz Main.java;
const #16 = NameAndType #7:#8;// "<init>":()V
const #17 = NameAndType #13:#8;// compute:()V
const #18 = class #24; // java/lang/System
const #19 = NameAndType #25:#26;// out:Ljava/io/PrintStream;
const #20 = class #27; // java/io/PrintStream
const #21 = NameAndType #28:#29;// println:(I)V
const #22 = Asciz com/pulma/test/codepactice/Main;
const #23 = Asciz java/lang/Object;
const #24 = Asciz java/lang/System;
const #25 = Asciz out;
const #26 = Asciz Ljava/io/PrintStream;;
const #27 = Asciz java/io/PrintStream;
const #28 = Asciz println;
const #29 = Asciz (I)V;
{
public com.pulma.test.codepactice.Main();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
public static void main(java.lang.String[]);
Code:
Stack=0, Locals=1, Args_size=1
0: invokestatic #2; //Method compute:()V
3: return
LineNumberTable:
line 6: 0
line 7: 3
public static void compute();
Code:
Stack=2, Locals=3, Args_size=0
0: iconst_1
1: istore_0
2: iconst_2
3: istore_1
4: iload_0
5: iload_1
6: iadd
7: istore_2
8: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
11: iload_2
12: invokevirtual #4; //Method java/io/PrintStream.println:(I)V
15: return
LineNumberTable:
line 10: 0
line 11: 2
line 12: 4
line 13: 8
line 14: 15
}
每个平台有不同的JVM实现,例如,在X86平台,JVM就需要将iadd等字节码指令翻译成cpu可以识别的指令,然后按照前述的指令执行步骤,进行执行,就可以实现代码的运行了.