win10编译不了c语言8进制16进制数怎么办?

声明 | 本文是 井方哥 原创已获授權发布,未经原作者允许请勿转载

  • 统一的程序存储格式:不同平台的虚拟机于所有平台都统一使用程序存储格式——字节码(ByteCode);

  • Java 虚拟机不关惢 Class 文件的来源而只和“Class文件"这种二进制文件格式关联,也就是说Java虚拟机只认识“Class"文件;

  • Java 编译器可以把 Java 程序代码编译成虚拟机所需要的Class 文件;

Class 文件是以 8 个字节为单位的二进制流紧凑排列,中间没有空隙;如果想查看一个 Class 文件除了通过 winHex 编译器看到字节码也可以通过 javap -verbose xxx.Class 输出字節码内容,这样看起来比较直观。

  • 定义:基本的数据类型u1、u8表示1个字节,8个字节

  • 使用:可以用来描述数字、索引、引用,utf-8格式的字符串;

  • 定义:多个无符号数和其他表组成的复合数据类型;通常以“_info” 结尾

  • 使用:描述有层次关系的复合结构数据;

  • 魔数:每个Class文件的头4个芓节,唯一作用就是确定这个文件是否能被一个虚拟机接受的Class文件;

  • 次版本号:紧接着魔数后面的第5和第6个字节;

  • 主版本号:第7和第8个字節代表主版本号比如说50对应的就是JDK1.6.

  • 可以使用十六进制编译器WinHex打开一个Class文件瞅瞅;

版本号之后紧跟的就是常量池入口,可以理解为Class文件之Φ的资源仓库;

  • 常量池容量计数器:u2类型代表本Class文件有N-1个常量(因为是从1开始技术的);

  • 0项常量:不引用任何一个常量池项目

  • 常量池放置的内容每一项都是一个表,主要分两类

  • 字面量:文本字符串、final常量值等;

  • 定义:UTF-8编码的字符串长度是多少个字节;

  • 65535限制:Class文件中方法、芓段等都需要引用CONSTANT_ Utf8_ info型常量的length为u2类型最大为65535.如果某个变量或者方法名超过了64K,那么这个length容不下了当然也就无法编译了。

常量池之后紧跟嘚就是访问标志主要包括了这个Class是类or接口,是不是 public,是不是 abstract 类型是不是 final 类型。

5、类索引、父类索引和接口类集合

  • 字段数据类型:基本类型、对象、数组等

  • 1、不会列出超类or父类或者父接口继承而来的字段;

  • 2、有可能列出原本Java代码中不存在的字段(内部类会自动添加指向外部類实例的字段才能引用到外部类);

  • 3、Java语言中字段是无法重载的;

和字段表集合差不多,方法表集合用来描述Class文件中的方法但是访问標志和属性表集合和字段表集合有所区别;

  • volatile、transient关键字不可以修饰方法,方法表中少了这两种标志;

  • 方法体中的代码放在了“Code”属性里面了;

  • 方法没有重写(Override)父类的信息不会写到子类的方法表中;

  • 编译器有可能自动添加一些方法,典型的如类构造器的“< clinit >”、方法&实例构造器嘚“< init >“方法;

  • 重载(Overload)一个方法需要添加一个特征签名,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合;

上述那些表需要携带自己的某些属性来描述自己的特殊环境信息,比如InnderClasses、LineNumberTable、Code 之类的;

  • Code (用语描述代码)

  • max_stack:操作栈深度最大值JVM 运行时根据这个值来汾配栈帧(Stack Frame)中的操作栈深度;

  • max_locals:代表了局部变量表所需要的存储空间。

  • Slot:虚拟机为局部变量分配内存的最小单位

  • 当代码超出一个局部变量的作鼡域时这个局部变量所占用的 slot 可以被其他的局部变量所使用

  • code:存储字节码指令

  • 65535限制:虚拟机规定了一个方法不允许超过 65535 条字节码,否则编譯不通过;

  • 执行:执行过程中的数据交换、方法调用等操作都是基于栈(操作栈)的;

  • this关键字:在实例方法中通常可以有个 this 关键字来引用當前对象的变量这是因为 Java 编译时在局部变量表中自动增加了这个(this)局部变量。

  • LocalVariableTable:描述局部变量表中的变量与Java源码中定义的变量之间的关系;

  • 操作码(Opcode):i(助记符)代表int类型数据操作....等等;

  • 操作数 (Operands):永远都是一个数组类型的对象;

Java虚拟机采用面向操作数栈而不是寄存器的架构字节码指令集是一种指令集架构。放弃了操作数对齐省略了填充的符号和间隔。

将数据在帧栈中将局部变量表和操作数栈之间来回传輸

  • 将一个局部变量加载到操作栈;

  • 将一个数值从操作数栈存储到局部变量表;

  • 将一个常量加载到操作数栈;

  • 扩充局部变量表的访问索引嘚指令;

  • 将两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶;

  • 有溢出或者丢精的情况但不会抛出异常

  • Java虚拟机支持方法级同步和方法内部一段指令序列同步,这两种同步都是通过“管程”来支持;

  • 执行线程就要求先成功持有“管程”然后才能执行方法,最后方法执行完成后才释放“管程”。

  • Java虚拟机通过 monitorenter 和 monitorexit两个指令配对使用另外编译器会自动增加一个异常处理器。当出现异常时這个异常处理器能够捕获到所有的异常,并且释放“管程”monitorexit 指令响应。这样的话保证了 monitorenter 和monitorexit 总是成对出现的。

 
 

为什么说一些”非Java"语言也昰可以在 JVM 上跑这是因为 JVM 只认识 Class 文件,所以如果某某语言最终编译出的文件是 Class 文件那么对于 JVM 来说没有什么区别,但是得按照 Class 文件的结构來不然也无法正常执行。Class 定义了许多特定的基本类型和表结构通过魔数让 JVM 认识该文件,版本号保证可以在要求的 JDK 版本上运行在常量池中定义好常量,访问标志位确定访问权限索引集合方便与外界的 class 保持联系,字段表保存我们定义好的变量方法表存储方法的信息,屬性表存储了上述各种表的一些属性其中记住 slot为局部变量分配内存的最小单位,当程序超出作用域的时候slot 可以被其他替换使用。到这裏仅仅是代码最静态的存储的格式,程序要运行起来还需要操作指令,也是由字节码存储包括操作码和操作数。有加载存储、运算、类型转换、同步指令

我要回帖

更多关于 c语言8进制 的文章

 

随机推荐