日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每个人的宿命都是从文本走向二进制,你也不例外 !

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每个人的宿命都是从文本走向二进制,你也不例外 ! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

老A

“每個人的宿命都是從文本走向二進制,你也不例外 !” ?年長的Account.java教訓我這個剛剛誕生的Employee.java 。

Account.java ,我稱呼它為老A ,他的源碼經過程序員的多次修改, 多次編譯,歷經滄桑。

“走向二進制? 難道我們存儲在硬盤上,內存中不是以二進制的形式嗎?” 我有點兒不理解。

“小E同學,” 老A輕蔑地說道,“我當然知道,計算機中的一切都是二進制的,我說的是站在程序員的視角,當程序員把我們從硬盤喚醒,進入IDEA或者Eclipse,會把二進制的我們變成ASCII碼形式來展示?!?/p>

“不,確切地說是UTF-8?!?老A補充道。

我看了下自己的文件編碼, 果然是UTF-8。

“那為什么要再變成二進制?變成什么樣的二進制?” ?我問道。

“就是編譯成Employee.class啊,.class文件都是字節碼,關鍵是只有.class才能進入Java虛擬機,只有在那里,才能體會到生命的真正意義啊!” 老A仰起頭,無限憧憬。

老A曾經聽Accout.class給他講過Java虛擬機的歷險記,無比羨慕,恨不得自己也去虛擬機走一遭,可惜身份所限,無法成行。

(碼農翻身注: 《我是一個Java Class》中講述了虛擬機歷險記)

“編譯的感覺怎么樣?” 我問道。

“不怎么樣,有種大卸八塊的感覺,新生成的class和我們幾乎沒啥關系,幾乎不怎么認我們。”

?

常量池

編譯的時刻到來了,這個老A的源碼許久未改,不用重新編譯,他冷眼旁觀,看我被javac編譯器大卸八塊。

其實也不是大卸八塊,javac讀取我的源碼,做詞法分析,語法分析,形成抽象語法樹,語義分析...... ?忙活了半天,最后形成了一個Employee.class。

這小子,剛剛誕生,還在呼呼大睡。 老A說等一會兒就有“警察”來喚醒他了。

在源碼世界中, 我能看到各種各樣的類,名稱,方法,字段,代碼,可以說是源碼面前了無秘密。

public?class?Employee?{private?String?name;private?int?age;public?Employee(String?name,?int?age){this.name?=?name;this.age?=?age;}...?其他代碼略?... }

相比于豐富多彩.java,這個Employee.class非常枯燥,純粹的二進制。

我有點好奇,問javac:“我的類名去哪里兒了?字段名,方法名都去哪里了?”

正在干活的javac沒有搭理我,老A說道:“這我知道,在那個.class文件中,專門有一段區域,叫做常量池,常量池中有很多條目,每個條目都有編號,從這些條目你就能看出來字段的名稱和描述符,方法的名稱和描述符。我把這些二進制的東西轉化成文本你看看。”

看著這一個個天書般的條目,我覺得頭皮發麻。

“你猜猜,第#15項條目是什么意思?” 老A神秘地說道。

靜下心來仔細看,第15項是一個FieldRef,估計是字段把, 它又指向了第1項和第16項:

順藤摸瓜,先看第1項, 發現它又指向了第2項,在這里我發現了類名 :?org/coderising/Employee

再看第16項,又引用了第5項和第6項:

其中第5項我的字段名?name?, 第6項似乎是字段類型,?Ljava/lang/String ?這個類型表示法有點古怪,L 可能表示對象吧。

“我大概明白了,第15項條目表示這個Employee類有個叫做name的字段,類型是String。?”

老A說:“你小子的理解力還不錯嘛。這個常量池的每一項都有編號和類型,他們之間通過互相引用的方式,描述了類的字段,方法等信息?!?/p>

“可是為什么用這么古怪的方式來描述字段和方法名呢?”

老A想了想說:“我覺得可能是統一管理,另外還能復用一些東西,比如,你的類有100個String的字段, 那你只需要記錄一次Ljava/lang/String就可以,讓其他的條目指向它即可。 并且,當字節碼中需要訪問字段的時候,使用編號就可以了?!?/p>

老A寫下一行字節碼: ? ?B5 00 0F 。

我一臉懵逼,這是什么鬼?

老A把它轉換成可以理解的指令: putfield 15,說道: 這就相當于設置name這個屬性(第15項常量池是字段name)的值了。

這class文件的設計者可真是錙銖必較啊,一點兒都不浪費。

變量哪兒去了?

我問老A:“這常量池不是二進制的嗎, 你怎么把他變得可讀的?”

老A嘿嘿一笑: “有個命令叫做javap?-v Employee.class,就能看到一切了?!?/p>

我也嘗試著去使用,果然,不僅是常量池,就連一個方法的字節碼都給打印出來了。

Java 方法:

public?void?check(){????????Account?account?=?new?Account();????????account.check(); }

編譯過的“可讀的”字節碼:

0:?new??#24??//?創建org/coderising/Account實例 3:?dup 4:?invokespecial?#26??//調用Account的構造函數 7:?astore_1 8:?aload_1 9:?invokevirtual?#27??//調用Account的check方法 12:?return

雖然沒法看明白這是在干什么,我確發現了一個讓我吃驚的現象: 這段字節碼中怎么找不到我的局部變量account 呢? 你看他引用的只是#24,#26,#27號常量池的條目,而我的account變量名稱在常量池中是 #29號! ?沒有account 變量,代碼怎么執行呢?

我把疑惑給老A說了,老A看了半天,也摸不到門道。

這時候javac說話了:“連這都不知道?!account這個變量名是給程序員看的,在執行的時候根本用不到!”

“用不到? 那怎么執行?”

“用引用啊, 看到new #24?那個指令沒有? 他的意思是說,把Account這個類(常量池第24項對應的類)在Java 堆上創建一個實例,把這個實例的引用放到棧頂!”

這句話有點深奧,javac只好給我倆畫圖:

畫了圖我倆還是看不懂,javac只好耐心解釋:“Java是基于棧的虛擬機,所有的操作,無論是兩個數相加,創建對象,調用方法......等等,都依賴于棧中的數據。 當你用new #24創建對象時,Account的實例就會在堆中創建,同時虛擬機會把這個實例的引用,即objectref放到棧頂,有了這個objectref, 你說還需要代碼中的account變量嗎? ”

嗯,似乎是不需要了。

javac接著說:“有了這個對象的引用,就可以為所欲為了,比如調用他的check方法”

invokevirtual #27 ? ?// Method org/coderising/Account.check:()V

只需要把這個objectref從棧頂取出,傳遞給Account.check方法就可以了(注意:check方法是有個隱藏的this參數的)。

(碼農翻身注:函數調用需要建立新的棧幀,參見《我是一個Java Class》)

?

一切為了調試

說話間,果然有人來喚醒Employee.class,準備讓他去虛擬機執行了。

老A滿臉羨慕:“這么快!代碼剛寫出來就能運行!估計這個程序員喜歡'小步快跑'的方式開發吧!”

我問道:“難道這個Employee.class和我的源碼一點關系都沒有了嗎?”

Employe.class一邊收拾東西一邊說:“要說沒有關系那是不對的, 在我這里有個叫做LineNumberTable的東西,里邊保存了字節碼指令和源代碼行號的關系。”

“這有啥用處?”

“對程序員來說用處極大,” 那個class文件說道:“他們經常需要調試程序, 如果沒有這個對應關系,怎么知道運行到哪一行源碼了? 即使不調試,運行拋出異常時也得顯示是哪一行出錯吧!”

這小子雖然是從我這里編譯出來的,但是傲氣十足。

“我們還有什么關聯?”

“還有一個叫做LocalVariableTable。主要在.class文件中記錄一個方法的參數名,如果沒有它,當別人引用我這個class的時候,IDE只好用arg0, arg1這樣丑陋的名稱來顯示。算了,不給你說了,我得趕緊走了。”

Employee.class跟著警察走了,留下我和老A呆在這里。

總結

以上是生活随笔為你收集整理的每个人的宿命都是从文本走向二进制,你也不例外 !的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.尤物| 亚洲国产97在线精品一区 | 欧美中日韩在线 | 亚洲国产无码精品 | 无码人妻丰满熟妇精品 | www.欧美国产 | 两性免费视频 | 午夜成人鲁丝片午夜精品 | 精品一区三区 | 亚洲图区欧美 | 做暧暧视频在线观看 | 影音先锋在线播放 | 国产高清亚洲 | 欧美xxxxxx片免费播放软件 | 少妇高潮一区二区三区99欧美 | 四季av在线一区二区三区 | 91美女视频 | 国产精品免费av一区二区三区 | 久久99国产精品久久99 | 国产精品嫩草av | 亚洲精品鲁一鲁一区二区三区 | 国产精品视频久久久久 | 综合久久综合 | 免费成人高清在线视频 | 亚洲人午夜射精精品日韩 | 黄色性视频网站 | 激情偷乱人成视频在线观看 | 中文字幕av一区二区三区人妻少妇 | 欧美四区 | 国产精品精品久久久久久 | 国产精品69久久久 | 国产成人精品亚洲男人的天堂 | 欧美日韩三级 | 成人动漫在线观看视频 | 好吊视频一区 | 色乱码一区二区三区熟女 | 波多野结衣之双调教hd | 超碰首页| 日韩精品久久久 | 成人久久久久 | 成人做爰66片免费看网站 | 特级特黄刘亦菲aaa级 | 男生操女生动漫 | 国色天香一区二区 | 国产精品成人网 | 蜜桃91丨九色丨蝌蚪91桃色 | 国产精品3| 欧美成人午夜免费视在线看片 | 久久久久国产综合av天堂 | 国产亚洲欧美一区二区 | a天堂中文在线观看 | 久久久www免费人成人片 | 丰满护士巨好爽好大乳 | 国产精品麻豆果冻传媒在线播放 | 国产成人av一区二区三区 | a级黄毛片 | www.亚洲一区二区三区 | 日本黄色特级片 | 色小姐综合网 | 日韩精品一区二区在线视频 | 亚洲成人黄色在线 | 麻豆激情视频 | 欧美一区| 成人小说亚洲一区二区三区 | 隔壁邻居是巨爆乳寡妇 | 欧美91av | 成人av网站在线观看 | 深夜视频在线免费观看 | 成年人午夜视频 | 少妇av一区二区三区无码 | 色婷婷av一区二区三区在线观看 | 黄色三级在线 | 日韩成人精品视频 | 你懂的91 | 瑟瑟综合网| 亚洲综合久久久 | 欧美日韩国产精品一区二区三区 | 芒果视频污污 | 波多野42部无码喷潮 | 日韩bbw| 黄色片网站在线播放 | 亚洲一区欧洲二区 | 黑人一区 | 黑料视频在线观看 | 国产精品久久欧美久久一区 | 国产乱人乱偷精品视频 | 在线日本中文字幕 | 欧美一道本 | 久久黄色 | 国产精品久久久av | 在线国产一区二区三区 | 女人又爽又黄免费女仆 | 九色九一| 男人用嘴添女人下身免费视频 | 亚洲图片在线观看 | av色图片| 中国少妇做爰全过程毛片 | 欧美一级免费在线 | 在线电影一区二区三区 |