走进二进制.


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

  • 二进制的转化
    • 十进制转二进制
    •  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.classLast modified Jun 21, 2019; size 431 bytesMD5 checksum e5dc9048708a55f1a6cb70f9d30d1d93Compiled from "HelloWorld.java"
public class HelloWorldminor version: 0major version: 52flags: 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: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 1: 0public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=2, args_size=10: ldc           #2                  // String Hello World2: astore_13: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;6: aload_17: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V10: returnLineNumberTable:line 3: 0line 4: 3line 5: 10
}
SourceFile: "HelloWorld.java"
  • 运行HelloWorld
  • HelloWorld的编译过程
  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. 计算机采用二进制原因

    要知道计算机为什么采用二进制,首先需要清楚进制.计算机的发展.基本电子元器件.逻辑门电路 一.进制简单介绍 进制:一种进位的计数方式 常见的进制有二进制,八进制,十进制,十六进制,其转换方式如下: 二 ...

  2. 二进制计算机课教案,计算机与二进制教案.pdf

    学习必备 欢迎下载 计算机与二进制教学方案 学校: 海南师范大学 执教人姓名: 孙鹏程 课 题 计算机与二进制 教学模块 初中信息技术基础 教学年纪 七年级 基 本 教学教材 湖南科学技术出版社 说 ...

  3. 计算机为何用二进制而不用十进制,为什么计算机使用二进制而不是十进制?

    计算机内部之所以采用二进制,其主要原因是二进制具有以下优点: 技术上容易实现.用双稳态电路表示二进制数字0和1是很容易的事情.计算机使用二进制进行编码,而不是我们熟悉的十进制,最重要的原因是二进制物理 ...

  4. 简述计算机用二进制的原因,简述计算机采用二进制的原因

    简述计算机采用二进制的原因? 1. 技术实现简单.2.简化运算规则.3.适合逻辑运算.4.易于进行转换. 什么是定点数?什么是浮点数? 定点数:小数点的位置是固定的,因而小数点不必使用特别的记号表示, ...

  5. 计算机中二进制的加法

    位运算符: &:位逻辑与    将操作数转换成二进制数,然后将两个二进制操作数对象从低位到高位对齐,每位求与.若操作数对象同一位都为1,则结果对应位为1,若操作数对象同一位为0. | :位逻辑 ...

  6. 二进制推广者电子计算机,31-戏说计算机与二进制那点事儿

    第一台计算机的生日只比共和国早了没两年,于1946年出生在美国,叫ENIAC(音:艾尼艾克),可以说它就是个超级大胖子!怎么讲?将近30顿重,得用一间170平的大房子才能装得下!为啥这么重?因为用的材 ...

  7. 爪哇国政府有个绑架局

    爪哇国家里福洲有个农民汤木,听说联邦政府在东南部的佛落里洲建设特别区,需要大批劳力.吃不上饭的汤先生就打算去那里混饭吃了. 到了佛落里洲之后,才知道这里竟然在洲政府序列里有个绑架局.绑架局是干什么的呢 ...

  8. 15 计算机底层——二进制到汇编学习

    计算机底层--二进制到汇编学习 1.概述 语言 机制 进制如何计算 二进制 数据宽度 有符号和无符号数 原码和反码 位运算 位运算计算 汇编 寄存器 内存 汇编指令 内存复制 堆栈的指令 汇编如何写函 ...

  9. Java(计算机底层——二进制到汇编)(先导课)

    Java(计算机底层--二进制到汇编)(先导课) 参考视频:最通俗易懂的计算机底层教学,二进制到汇编学习!(狂神) 1. 概述 语言 进制 进制如何运算 二进制 数据宽度 有符号数和无符号数 原码反码 ...

最新文章

  1. C# Excel转换为Json
  2. mysql ( )=,(mysql)
  3. hashmap扩容机制_图文并茂,HashMap经典详解!
  4. WEB测试—兼容测试
  5. vivado 2017.4安装教程
  6. 网站制作流程详解(学做网站第一步)
  7. 惠普电脑u盘重装系统步骤_惠普电脑怎么用u盘重装系统步骤
  8. Android dev 设备访问权限 777,Android Studio:/ dev / kvm设备权限被拒绝
  9. 解决Windows桌面部分快捷方式图标变为空白的问题
  10. 京东自营客服初级考试
  11. django母版用法
  12. Centos修改时间为24小时制
  13. 熟悉mysql数据库设计和性能优化_MySQL性能优化学习笔记-(1)数据库设计
  14. 华为OD机试 - 玩牌高手(Python) | 机试题算法+思路 【2023】
  15. liunx安装node
  16. DNS和BIND总结
  17. 计算机组成原理实验三思考题,计算机组成原理实验三:存储器部件教学实验
  18. 【QT】Qt Compiler Detection(编译)
  19. 如何用r语言分析数据
  20. 英语学习(10个句子练到极致)

热门文章

  1. 库卡(KUKA)机器人入门学习必备知识
  2. mysql怎样发给别人_怎么把数据库发给别人
  3. 金蝶EAS,序时簿界面ListUI数据不允许修改、删除
  4. java正则校验密码 长度不少于8位且至少包含大写字母、小写字母、数字和特殊符号中的四种组合 或者 其中任意三种组合
  5. 对Redis中主从复制、哨兵模式和集群进行部署
  6. 一个很精致的HelloWorld,你看得懂么?
  7. access查询两列信息合并输出_如何在Access中合并两个数据表中的数据
  8. windows服务器安全设置详解攻略
  9. 在Windows 7 Media Player中轻松播放Flac,Ogg和其他文件格式
  10. Project 2016中如何管理工时?