更新時間:2022-12-15 16:47:32 來源:動力節(jié)點 瀏覽1227次
一、什么是字節(jié)碼
1. 先來說一下什么是機械碼
機械碼就是cpu能夠直接讀取并運行的代碼,它是用二進制編碼表示的,也叫做機械指令碼。在編寫這種代碼時,需要主動地去控制cpu的一切資源,而且需要記住全部指令所做的動作,十分的麻煩,當(dāng)然這也是計算機的底層代碼,處理開發(fā)計算機的專業(yè)人員之外,已經(jīng)很少人去研究了。
2.字節(jié)碼
字節(jié)碼是一種中間狀態(tài)的二進制文件,是由源碼編譯過來的,可讀性沒有源碼的高。cpu并不能直接讀取字節(jié)碼,在java中,字節(jié)碼需要經(jīng)過JVM轉(zhuǎn)譯成機械碼之后,cpu才能讀取并運行。
3.使用字節(jié)碼的好處
一處編譯,到處運行。java就是典型的使用字節(jié)碼作為中間語言,在一個地方編譯了源碼,拿著.class文件就可以在各種計算機運行,每個計算機上的jvm就會有所不同了。
4.字節(jié)碼在JVM中的狀態(tài)
5.額外提一點
編譯型語言
只需要編譯一次,就能夠?qū)⒃创a編譯成機械碼。執(zhí)行效率高,可移植性低,依賴編譯器。
典型代表:C、C++、Pascal、Object-C以及最近很火的蘋果新語言swift,GO
解釋型語言
在第一次編譯時,并不會直接將源代碼編譯成機械碼,而是編譯成一種中間狀態(tài)的二進制文件(字節(jié)碼),由虛擬機來對這個二進制文件進行第二次編譯,這次才是編譯成機械碼。執(zhí)行效率比編譯型語言低,但是可移植性高,依賴虛擬機。
典型代表:JavaScript、Python、Erlang、PHP、Perl、Ruby
二、java中的字節(jié)碼
1.查看字節(jié)碼的方式
首先打開idea,在里面創(chuàng)建一個.java文件
package test;
public class ByteCodeTest {
private int a = 0;
public int get() {
return a;
}
}
然后在另一個類上,運行main方法,調(diào)用這個類
2.找到編譯后的.class文件
out文件夾下面會多出一個我們剛剛編寫的java文件相同名稱的.class文件
3.下載一個Sublime Text,然后打開.class文件
cafe babe 0000 0034 0016 0a00 0400 1209
0003 0013 0700 1407 0015 0100 0161 0100
0149 0100 063c 696e 6974 3e01 0003 2829
5601 0004 436f 6465 0100 0f4c 696e 654e
756d 6265 7254 6162 6c65 0100 124c 6f63
616c 5661 7269 6162 6c65 5461 626c 6501
0004 7468 6973 0100 134c 7465 7374 2f42
7974 6543 6f64 6554 6573 743b 0100 0367
6574 0100 0328 2949 0100 0a53 6f75 7263
6546 696c 6501 0011 4279 7465 436f 6465
5465 7374 2e6a 6176 610c 0007 0008 0c00
0500 0601 0011 7465 7374 2f42 7974 6543
6f64 6554 6573 7401 0010 6a61 7661 2f6c
616e 672f 4f62 6a65 6374 0021 0003 0004
0000 0001 0002 0005 0006 0000 0002 0001
0007 0008 0001 0009 0000 0038 0002 0001
0000 000a 2ab7 0001 2a03 b500 02b1 0000
0002 000a 0000 000a 0002 0000 0003 0004
0004 000b 0000 000c 0001 0000 000a 000c
000d 0000 0001 000e 000f 0001 0009 0000
002f 0001 0001 0000 0005 2ab4 0002 ac00
0000 0200 0a00 0000 0600 0100 0000 0600
0b00 0000 0c00 0100 0000 0500 0c00 0d00
0000 0100 1000 0000 0200 11
2.一個疑惑
我也希望有大佬能夠解答一下我疑惑,我去查百度也找不到答案,可能是我搜索方式有問題。
上面是.class文件的十六進制形式
在idea中有這樣一個功能,view->Show ByteCode
用這個功能打開的是
// class version 52.0 (52)
// access flags 0x21
public class test/ByteCodeTest {
// compiled from: ByteCodeTest.java
// access flags 0x2
private I a
// access flags 0x1
public <init>()V
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
L1
LINENUMBER 4 L1
ALOAD 0
ICONST_0
PUTFIELD test/ByteCodeTest.a : I
RETURN
L2
LOCALVARIABLE this Ltest/ByteCodeTest; L0 L2 0
MAXSTACK = 2
MAXLOCALS = 1
// access flags 0x1
public get()I
L0
LINENUMBER 6 L0
ALOAD 0
GETFIELD test/ByteCodeTest.a : I
IRETURN
L1
LOCALVARIABLE this Ltest/ByteCodeTest; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
}
我想知道這個跟十六進制文件的區(qū)別是什么?
它們倆是怎么轉(zhuǎn)換的?
以上就是動力節(jié)點小編介紹的"快速了解字節(jié)碼是什么",希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為您務(wù)。
初級 202925
初級 203221
初級 202629
初級 203743