走近计算机,走进二进制,爪哇国的诞生

走进二进制.


  • 二进制的来源
  • 自古以来,就有太极生两仪,两仪生四象,四象生八卦的文化传说。天与地,明与暗,是与非,有与无,宇宙万物貌似都是在这两个极端之间存在的。然而在计算机的世界里,这个世界又是怎样存在的呢,对的,就是用二进制来表示的。

  • 二进制的转化
    • 十进制转二进制
    •  250除二取余数,后面的余数居最高位,得11111010 	
      
    • 十进制转八进制
    •  250除八取余数,后面的余数居最高位,得372
      
    • 二进制转八进制
    •  11111010补全前面的位数,9位(3的倍数)得011 111 010,得372
      
  • 原码与反码,补码
    • 正数的原码与反码,补码都相同,即它的二进制数
    • 负数的补码稍微复杂一些。【所有的数据运算都是采用补码进行的】
    • 负数补码的推算
      • 方法一:直接推算法
      •   利用原码加上补码等于0的特性,比如:5的二进制为0101+(-5的补码)=0(十进制),得-5的补码为1111 1011
        
      • 方法二:公式推算法
      •   负数得补码=正数得二进制取反+1, 比如5的二进制取反为11111010,+1之后,得1111 1011
        

计算机语言


  • 定义

    是指用于人与计算机之间通讯的一种特殊语言,是人与计算机之间传递消息的媒介。

  • 分类

    • 低级语言

      • 机器语言

        直接用二进制指令表达。指令是用0和1组成的一长串代码。有一定的位数,并分成若干段,各段的编码表示不同的含义。

      • 汇编语言

        使用一些特殊的符号代替机器语言的二进制码(又称符号语言),计算机不能直接识别,需要用一种软件将汇编语言翻译成机器语言,依赖于硬件体系,开发难度较大。

    • 高级语言

      高级语言是相对于低级语言来说的,高级语言是按照人的思维编写出来的语言,比如C语言、C++、JAVA、Python等,其可读性高,但执行效率较低级语言较低,编写的程序叫作源程序。

那么问题来了,对于高级语言,如果程序想运行,必须翻译成计算机能识别的低级语言才行,那么,高级语言是怎么翻译的呢?

翻译语言


  • 分类
    • 编译型语言
    • 在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了,执行效率高。比如C语言、C++

    • 编译示意图
      在这里插入图片描述
    • 解释型语言
    • 不需要编译,运行时使用一个专用的解释器去翻译,每一条语句都是执行的时候才翻译,所以这类程序每执行一次就要翻译一次,执行效率较低。比如Python

    • 解释示意图
      在这里插入图片描述
    • 混合型语言 在这里插入图片描述
    • 适用情况
      • 运行速度要求高,优选编译型【这就能够理解为什么游戏要用C语言开发了】
      • 跨平台性,优选解释型

Java的跨平台性的原理.


  • 编译过程

  • 用IDE编写好JAVA源代码之后,会自动编译成class文件(字节码文件),里面存放的是Class类的信息。【这里并不是将程序编译成机器语言,可以将字节码文件看作中间语言,在程序运行时,由JVM将字节码再翻译成机器语言。】

  • 运行机制
    在这里插入图片描述

  • JAVA的跨平台性 在这里插入图片描述

  • JAVA模型概念

    • Java Virtual Machine

      Java虚拟机(Java Virtual Machine),简称JVM,它是运行所有Java程序的虚拟计算机,好比是街机游戏的模拟器。

    • Java Runtime Environment
    • JRE(Java Runtime Environment):Java运行环境,如果要运行Java程序,就需要JRE的支持,JRE里包含JVM。

    • Java Development Kit
    • JDK(Java Development Kit):Java开发工具,包含开发Java程序的所有工具,如javac和java等,JDK里包含JRE。

  • JAVA模型概念图在这里插入图片描述

HelloWorld的执行原理.


  • HelloWorld源码
public class HelloWorld{
	public static void main(String[] args){
		String s="Hello World";
		System.out.println(s);
	}
}
  • 编译(javac) HelloWorld.java 在这里插入图片描述
  • 查看编译后的HelloWorld.class文件
cafe babe 0000 0034 001d 0a00 0600 0f09
0010 0011 0800 120a 0013 0014 0700 1507
0016 0100 063c 696e 6974 3e01 0003 2829
5601 0004 436f 6465 0100 0f4c 696e 654e
756d 6265 7254 6162 6c65 0100 046d 6169
6e01 0016 285b 4c6a 6176 612f 6c61 6e67
2f53 7472 696e 673b 2956 0100 0a53 6f75
7263 6546 696c 6501 000f 4865 6c6c 6f57
6f72 6c64 2e6a 6176 610c 0007 0008 0700
170c 0018 0019 0100 0b48 656c 6c6f 2057
6f72 6c64 0700 1a0c 001b 001c 0100 0a48
656c 6c6f 576f 726c 6401 0010 6a61 7661
2f6c 616e 672f 4f62 6a65 6374 0100 106a
6176 612f 6c61 6e67 2f53 7973 7465 6d01
0003 6f75 7401 0015 4c6a 6176 612f 696f
2f50 7269 6e74 5374 7265 616d 3b01 0013
6a61 7661 2f69 6f2f 5072 696e 7453 7472
6561 6d01 0007 7072 696e 746c 6e01 0015
284c 6a61 7661 2f6c 616e 672f 5374 7269
6e67 3b29 5600 2100 0500 0600 0000 0000
0200 0100 0700 0800 0100 0900 0000 1d00
0100 0100 0000 052a b700 01b1 0000 0001
000a 0000 0006 0001 0000 0001 0009 000b
000c 0001 0009 0000 0025 0002 0001 0000
0009 b200 0212 03b6 0004 b100 0000 0100
0a00 0000 0a00 0200 0000 0300 0800 0400
0100 0d00 0000 0200 0e
  • 反编译javap
    在这里插入图片描述

  • 反编译得到的class信息

Classfile /Users/alongso_pro/Desktop/HelloWorld.class
  Last modified Jun 21, 2019; size 431 bytes
  MD5 checksum e5dc9048708a55f1a6cb70f9d30d1d93
  Compiled from "HelloWorld.java"
public class HelloWorld
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#15         // java/lang/Object."<init>":()V
   #2 = String             #16            // Hello World
   #3 = Fieldref           #17.#18        // java/lang/System.out:Ljava/io/PrintStream;
   #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #21            // HelloWorld
   #6 = Class              #22            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               SourceFile
  #14 = Utf8               HelloWorld.java
  #15 = NameAndType        #7:#8          // "<init>":()V
  #16 = Utf8               Hello World
  #17 = Class              #23            // java/lang/System
  #18 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;
  #19 = Class              #26            // java/io/PrintStream
  #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
  #21 = Utf8               HelloWorld
  #22 = Utf8               java/lang/Object
  #23 = Utf8               java/lang/System
  #24 = Utf8               out
  #25 = Utf8               Ljava/io/PrintStream;
  #26 = Utf8               java/io/PrintStream
  #27 = Utf8               println
  #28 = Utf8               (Ljava/lang/String;)V
{
  public HelloWorld();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: ldc           #2                  // String Hello World
         2: astore_1
         3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         6: aload_1
         7: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        10: return
      LineNumberTable:
        line 3: 0
        line 4: 3
        line 5: 10
}
SourceFile: "HelloWorld.java"
  • 运行HelloWorld在这里插入图片描述
  • HelloWorld的编译过程
    jvm加载class文件
  1. 第一阶段 找到.class文件并把这个文件包含的字节码加载进内存。
  2. 第二阶段 又分为三步,分别是字节码验证、Class类数据结构分析和内存分配、符号表的链接。
  3. 第三阶段 对类中静态属性和初始化赋值,以及静态块的执行。
  • HelloWorld的内存分配在这里插入图片描述
  • HelloWorld的执行过程
    1. 执行HelloWorld.java文件,生成HelloWorld.class字节码文件;
    2. 虚拟机执行HelloWorld.class,将这个类加载到内存中(即方法区的类代码区中);
    3. 虚拟机通过类找到HelloWorld的主方法(程序的入口方法),访问权限为public(公有可用),虚拟机传递String类型参数的地址到主方法的args中去,并在栈区为args开辟内存空间,返回一个void的返回值;
    4. 创建一个“Hello World”对象,对象“Hello World”在方法区的常量数据区开辟空间,属性即为:Hello World.
    5. 定义一个String(标准类库中的)类型的变量(在栈区开辟空间)s,变量s存放对象“Hello World”的地址;
    6. 虚拟机找到标准类库中的System.class类并加载到内存中(即方法区的类代码区中),System.out为标准字节输出流对象(),并调用println()方法将变量s的值打印到屏幕上。

参考博客:

解释性语言和编译型语言的区别和不同

CSDN-markdown 文字样式设置(字体, 大小, 颜色, 高亮底色)

从一个class文件深入理解Java字节码结构

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值