hbcab偏高是什么意思| 牛肉与什么食物相克| 额头上长小疙瘩是什么原因| 梦见偷鸡是什么预兆| 舌头麻是什么病的前兆| 圆圆的什么| 冬枣是什么季节的水果| 公务员是干什么工作的| 属牛男和什么属相最配| 白蛋白下降是什么原因| 女生下边长痘痘是什么病| 脾大吃什么可以缩脾| 嗓子干疼是什么原因| 宠物蛇吃什么食物| 胃疼想吐恶心是什么原因| 下巴疼是什么原因| 空心菜长什么样| 旗袍配什么鞋| graff是什么牌子| a血型和o血型生出宝宝是什么血型| 送命题是什么意思| 血小板低是什么问题| 膝盖积液用什么药最好| 不能吃辛辣是指什么| 为什么会得风湿| 硬下疳长什么样| 皮肤过敏擦什么药膏好得快| 经期有血块是什么原因| 4月13日是什么星座| 什么的拼音怎么写| 什么国家的钱最值钱| 胯骨疼挂什么科| 七月八号是什么日子| 3000年前是什么朝代| 猫鼬是什么动物| 青蛙靠什么呼吸| 胸口闷堵是什么原因| 涤棉是什么材质| 一个提手一个京念什么| 中国最高学位是什么| 张柏芝什么星座| 豆汁是什么做的| 属狗的和什么属相最配| 评估是什么意思| 在减肥期间吃什么最好| 广州白云区有什么好玩的地方| 凝聚力是什么意思| 梦到拆房子是什么意思| 榨菜是什么菜| 什么叫有氧运动| 赵云的马叫什么| 着凉肚子疼吃什么药| 梦到吃苹果是什么意思| 阴虚是什么意思| 乙肝抗体是什么意思| 长痔疮是什么引起的| gn什么意思| 什么是黑户| 弥漫是什么意思| 腿酸胀是什么原因| 10度左右穿什么衣服合适| 借口是什么意思| 感冒流黄鼻涕吃什么药| 意大利买什么包便宜| 缓刑是什么意思还要坐牢吗| 甲乙丙丁戊己庚辛壬癸代表什么| 91年出生的属什么| 头疼是为什么| 免疫是什么意思| 霸气是什么意思| 纵隔是什么意思| 雪燕是什么| 无蔗糖是什么意思| 理化检验主要检验什么| 肆无忌惮的意思是什么| 山芋是什么| 咳嗽有痰是什么原因| 东莞市委书记什么级别| 孕妇梦见小蛇是什么意思| 汗疱疹用什么药| 子宫为什么会长息肉| 南京立秋吃什么| 智是什么意思| 疝气挂什么科| 蔻依属于什么档次| 情人节送妈妈什么花| 血糖高的人应该吃什么食物最好| 血脂高挂什么科| 中药和中成药有什么区别| 黑裤子配什么颜色的鞋| 海底捞是什么| 女朱读什么| 做b超前需要注意什么| 双子座和什么座最不配| 前列腺增大伴钙化是什么意思| 出家人不打诳语是什么意思| 风热感冒咳嗽吃什么药| 糖醋里脊是什么肉做的| 辐照食品什么意思| 三伏天什么意思| 玩手机头疼是什么原因| 什么叫缘分| 痤疮用什么药膏最有效| 痛风吃什么食物好得快| 发小是什么| 今天是什么节气| 工薪阶层是什么意思| 身上起疙瘩是什么原因| 七月有什么花| 大三阳是什么| 肚子痛去药店买什么药| 拌黄瓜需要什么调料| 什么是海市蜃楼| hbsag阳性是什么意思| 鱼生是什么| 艾附暖宫丸什么时候吃| 8月11是什么星座| 糖尿病人吃什么水果| 机缘是什么意思| 脚上长鸡眼去医院挂什么科| 汗毛重是什么原因| 头疼是什么原因引起的| 背疽是什么病| 狗狗感冒了吃什么药| 六点半是什么时辰| sd是什么| 猫舔人是什么意思| 萧字五行属什么| 为什么白天能看到月亮| 拿什么拯救你我的爱人演员表| 乙字五行属什么| 十二月十二日是什么星座| 什么样的伤口需要缝针| 第二学士学位是什么意思| ph值高是什么原因| 高危性行为是什么意思| 乔治白属于什么档次| 气阴两虚吃什么中成药| 汉尼拔是什么意思| 什么是性格| 口腔溃疡用什么药好得快| 心率变异性是什么意思| 骨质增生是什么意思| 浅表性胃炎伴糜烂吃什么药效果好| 大连六院是什么医院| 味蕾是什么意思| 血糖高是什么引起的| 女人出黄汗是什么原因| 农历七月初六是什么星座| 五指毛桃有什么功效| 物流专员是做什么的| 7.9是什么星座| 高良姜是什么姜| 点解是什么意思| 喝酒打嗝是什么原因| 子宫内膜16mm说明什么| 阴道发热是什么原因| 12月27日什么星座| 什么食物含蛋白质高| 什么钙片补钙效果好| 例假不能吃什么水果| 粉色代表什么| 膝盖窝疼是什么原因| 自言自语说话是什么病| 淋巴结长什么样| 心电图窦性心律是什么意思| p4是什么意思| 尿道炎症状吃什么药| 卫校有什么专业| 焯水是什么意思| 什么声什么气| 早上醒来嘴苦是什么原因| 蔗去掉草字头读什么| 什么的什么好吃| 大便常规检查能查出什么| 工勤人员是什么意思| 夏天的诗句有什么| 人造海蜇丝是什么做的| 2003年属什么| 网易是什么| 雾化后为什么要漱口| 枕芯用什么填充物好| 怀孕初期要注意什么| 水瓶座是什么象星座| 二月二十一是什么星座| 梦见洗澡是什么意思| dsa检查是什么意思| 狼狗是什么品种| 芭乐是什么季节的水果| 血糖偏高吃什么食物好| 促排药什么时候开始吃| 吃什么可以让卵泡长得快| 火腿炒什么菜好吃| 学姐是什么意思| 谷丙转氨酶高挂什么科| 白化病是什么| 虱子用什么药可以根除| 孕妇抽筋是什么原因引起的| 托孤是什么意思| 心灵鸡汤是什么意思| 耳呜吃什么药最好| 什么生肖站着睡觉| 土土心念什么| 棍子鱼又叫什么鱼| 陌上是什么意思| 吃什么补气| 情妇是什么意思| 郭德纲什么学历| 待产包需要准备什么| 财鱼是什么鱼| 煤油是什么油| 冷冻跟冷藏有什么区别| 卒中优先是什么意思| 过是什么结构的字| 太阳最后会变成什么| 刮痧用什么油刮最好| 鹦鹉为什么会学人说话| 什么是疱疹| 脚气是什么菌感染| 嗓子有异物感吃什么药| 6月6是什么星座| 肠炎什么症状| 病变是什么意思| 娥皇女英是什么意思| 鹅蛋治什么妇科病| 女人白虎是什么意思| 葛根是什么| 吃亏是什么意思| 不亚于是什么意思| 手突然抖动是什么原因| 造影是检查什么| 大便潜血阳性意味着什么| 权志龙为什么这么火| 鼻子长痘是什么原因| 改嫁是什么意思| 建档立卡是什么意思| 三伏贴什么时候贴最好| 林伽是什么| 苟同什么意思| 白带像豆腐渣用什么药| 脚麻木是什么原因| 爱上一个人是什么感觉| 末梢神经炎吃什么药| 西洋参吃多了有什么副作用| 皮肤发白一块一块的是什么病| 两情相悦什么意思| 屁股上有痣代表什么| conch是什么牌子| 复光是什么意思| 3月21日是什么星座| 十指连心是什么意思| 必承其重上一句是什么| 肾不好有什么症状| 腿发热是什么原因引起的| 除夕是什么意思| 心脏跳的快什么原因| 海燕是什么鸟| 血糖偏高可以吃什么水果| 小圆细胞阳性什么意思| 北京户口有什么好处| 屁股长痘是什么原因| 什么是朱砂| 窘迫什么意思| 毛重是什么| 百度跳转到内容

用车你是否也被骗了几十年? 5000公里换机油的

本页使用了标题或全文手工转换
维基百科,自由的百科全书
百度 7、在之后的“提供付款信息”界面中,如果希望当前注册的账号可以下载收费的软件、游戏等,请如实填写各信息,如果只希望下载免费的软件、游戏,那么各信息可以不真实。

Java 字节码(英语:Java bytecode)是Java虚拟机执行的一种指令格式。大多数操作码英语Opcode都是一个字节长,而有些操作需要参数,导致了有一些多字节的操作码。而且并不是所有可能的256个操作码都被使用;其中有51个操作码被保留做将来使用。除此之外,原始Java平台开发商,太阳微系统,额外保留了3个代码永久不使用。

与Java的关系

[编辑]

一个Java程序员并不需要理解所有的Java字节码。但是,就像IBM developerWorks周刊建议的那样:“理解字节码以及理解Java编译器如何生成Java字节码与学习汇编知识对于C/C++程序员有一样的意义。”[1]

指令

[编辑]

指令码为一个字节,有256个可能的代码值(28=256),因此一个字节的指令码最多可能有256种不同的操作。其中,0x00、0xFE、0xCA、0xFF被指定保留。例如0xCA作为一个Java调试器的中断指令而从未被语言使用。相似地,0xFE和0xFF也未被语言使用[2]

指令可以基本分为以下几类:

  • 存储指令 (例如:aload_0,istore)
  • 算术与逻辑指令 (例如: ladd,fcmpl)
  • 类型转换指令 (例如:i2b,d2i)
  • 对象创建与操作指令 (例如:new,putfield)
  • 堆栈操作指令 (例如:swap,dup2)
  • 控制转移指令 (例如:ifeq,goto)
  • 方法调用与返回指令 (例如:invokespecial,areturn)

除此之外,还有一些更特殊的指令,作为异常抛出或同步等作用。

大多数的指令有前缀和(或)后缀来表明其操作数的类型。如下表

前/后缀 操作数类型
i 整数
l 长整数
s 短整数
b 字节
c 字符
f 单精度浮点数
d 双精度浮点数
z 布尔值
a 引用

例如,"iadd"指令将两个整数相加;而"dadd"指令将两个double浮点数相加。

"const"、 "load"、 "store"等涉及存储命令还会使用"_n"后缀,其中 "load"和"store"命令中的n可以为0到3之间的整数;而"const"命令中的n由类型指定。"const"指令把一个指定类型的值放入堆栈。例如"iconst_5"指令将一个整数5放入堆栈;而"dconst_1"将一个双精度浮点数1放入堆栈。"aconst_null"指令是放入一个null进堆栈。而对于"load" "store"指令中的n,指定了变量表中的存储位置。"aload_0"指令把在变量0中的对象(通常是"this"对象)放入堆栈,"istore_1"指令把栈顶的一个整数放入变量1。对于更高的变量,后缀将被去除,而这条指令将需要操作数。

计算模型

[编辑]

Java字节码的计算模型是面向堆栈结构计算机的。例如,一个x86处理器的汇编代码如下

mov eax, byte [ebp-4]
mov edx, byte [ebp-8]
add eax, edx
mov ecx, eax

这段代码将两个数值相加,并存入另一个地址。相似的反汇编字节码如下

0 iload_1
1 iload_2
2 iadd
3 istore_3

在这里,需要相加的两个操作数被放入堆栈,而相加操作就在栈中进行,其结果也被放入堆栈。存储指令之后把栈顶的数据放入一个变量地址。在每条指令前面的数字仅仅是表示这条指令到方法开始处的偏移值。这种堆栈结构也可以推广到面向对象模型上。例如,有一个"getName"方法如下

 Method java.lang.String getName()
 0 aload_0       // "this"对象被存入变量0
 1 getfield #5 <Field java.lang.String name>
                 // 这个指令从栈顶取出一个对象,并从中搜索一个指定的域
                 // 并将相应的数据存入栈顶。
                 // 这个例子中,"name"域对应于该类中的第五个常量。
 
 4 areturn  	 // 返回栈顶的对象作为函数的返回值

例子

[编辑]

考虑如下Java代码

  outer:
  for (int i = 2; i < 1000; i++) {
      for (int j = 2; j < i; j++) {
          if (i % j == 0)
              continue outer;
      }
      System.out.println (i);
  }

假设上述代码位于一个函数中,Java编译器可能将代码翻译成下述的Java字节码。

  0:   iconst_2
  1:   istore_1
  2:   iload_1
  3:   sipush  1000
  6:   if_icmpge       44
  9:   iconst_2
  10:  istore_2
  11:  iload_2
  12:  iload_1
  13:  if_icmpge       31
  16:  iload_1
  17:  iload_2
  18:  irem
  19:  ifne    25
  22:  goto    38
  25:  iinc    2, 1
  28:  goto    11
  31:  getstatic       #84; //Field java/lang/System.out:Ljava/io/PrintStream;
  34:  iload_1
  35:  invokevirtual   #85; //Method java/io/PrintStream.println:(I)V
  38:  iinc    1, 1
  41:  goto    2
  44:  return

基于Java字节码的语言

[编辑]

最常用的基于Java字节码的语言就是开发出Java字节码的Java语言。刚开始,只存在一个由太阳微系统开发的一个编译器javac。而现在Java字节码规范已经可以得到,因此,第三方公司亦开发出支持Java字节码的编译器。例如:

  • Jikes,编译Java源代码到Java字节码(由IBM开发,用C++实现)
  • Espresso,编译Java源代码到Java字节码(仅支持Java 1.0)
  • GCJGNU Compiler for Java,编译Java代码到Java字节码;亦可以编译到机器代码。作为GNU Compiler Collection (GCC)的一部分提供。

有一些项目提供Java汇编器以便于直接用Java字节码进行开发。主要的Java汇编器如下:

  • Jasmin,读取Java类的文字描述;用一种简单的使用Java虚拟机指令的类汇编语法,输出Java类文件 [3]
  • Jamaica, 一种为Java虚拟机编写的宏汇编语言。其中,类与接口由Java语法定义,而其中的方法却由Java字节码定义。[4]

还有其他的一些编译器,对于其他语言生成Java字节码,使其可以运行在Java虚拟机之上。

运行

[编辑]

当前已经有很多种Java虚拟机产品,包括了自由软件和商业软件。如果在Java虚拟机之中执行Java字节码并不理想,则可以使用一些工具例如GNU Compiler for Java将Java代码或Java字节码编译成机器码并由硬件直接运行。 而有一些处理器可以直接运行Java字节码,这种处理器名为Java处理器。

对动态语言的支持

[编辑]

Java虚拟机对动态类型语言提供了一定的支持。但绝大多数的Java虚拟机指令集是基于静态类型语言的。在静态类型机制下,方法调用中的类型分析都是在编译时执行的,而且缺乏一种机制在运行时确定一个类型已经确定相应的方法。

JSR292[5]中,在Java虚拟机层次增加了一种支持动态类型的指令invokedynamic,以支持在动态类型检测中的方法调用。 达芬奇机器英语Da Vinci Machine则是一种支持这种动态类型调用的虚拟机。 而所有支持JSE 7的Java虚拟机都应支持invokedynamic操作码。

参考文献

[编辑]
  1. ^ Understanding bytecode makes you a better programmer. [2025-08-05]. (原始内容存档于2025-08-05). 
  2. ^ 存档副本. [2025-08-05]. (原始内容存档于2025-08-05). 
  3. ^ Jasmin Home Page. [2025-08-05]. (原始内容存档于2025-08-05). 
  4. ^ Jamaica: The Java Virtual Machine (JVM) Macro Assembler. [2025-08-05]. (原始内容存档于2025-08-05). 
  5. ^ see JSR 292. [2025-08-05]. (原始内容存档于2025-08-05). 
娇滴滴是什么意思 拔完牙不能吃什么 ot什么意思 胸闷什么原因 阳气不足吃什么药
什么叫社保 什么是伪娘 炎性结节是什么意思 孕妇羊水多是什么原因造成的 胃溃疡吃什么药好得快
消化不好吃什么药最好 巧囊是什么原因形成的 剖腹产吃什么下奶快 梦见好多葡萄是什么意思 肠胃炎能吃什么食物
拂尘是什么意思 脂肪肝适合吃什么食物 绿草如茵是什么生肖 沙虫是什么 印绶是什么意思
钢琴10级是什么水平hcv8jop0ns6r.cn 钠偏低是什么原因huizhijixie.com 维生素D有什么食物hcv9jop2ns9r.cn 痈疡是什么意思hcv8jop2ns5r.cn 嗣读什么hcv8jop0ns7r.cn
射频是什么hcv9jop8ns0r.cn 什么是心脑血管疾病hcv8jop3ns5r.cn 其多列是什么意思hcv9jop1ns9r.cn 晒伤涂什么hcv9jop2ns3r.cn 尿失禁是什么意思hcv9jop4ns9r.cn
plory是什么牌子hcv9jop4ns3r.cn 最高人民法院院长什么级别hcv8jop9ns5r.cn 妈妈的姐妹叫什么hcv8jop8ns7r.cn 算了是什么意思hcv8jop6ns9r.cn 腰疼是什么原因引起的女性hcv8jop8ns3r.cn
小囊肿是什么病严重吗hcv8jop5ns6r.cn 阿奇霉素主治什么hcv8jop9ns0r.cn 风湿三项检查是什么hcv8jop6ns9r.cn 疝气嵌顿是什么意思hcv8jop4ns3r.cn 梦见老人去世预示什么hcv7jop9ns2r.cn
百度