windows系統使用c++實現一個小型jvm(一)------------環境介紹及背景說明

  背景說明:

   首先,本個小demo並不是我自己寫的,說是小demo,實際也不小,總共的代碼量有3兆多了。原創的大牛在這兒-----用 C++ 實現了一個小型的 jvm!!!!   

  當我看到這個貼子時候以及它的代碼量之後,心裏是既高興,又猶豫的。  爲什麼呢? 高興是因爲,沒想到能夠有機會接觸這麼底層的東西,當把它吃透後,想想自己的java造詣也能再進一步吧,同時也能呼應上一篇文章中我所講的 java的gc機制。猶豫是因爲它只支持linux和mac版本,而我較爲系統的練習c++的時間,滿打滿算也才一週左右,對windowsd的api不熟悉,究竟能不能吃下它,是一個大問題。

  當然了,我此刻在這會寫文章,足以表明我做了明智的決定,那就是吃下它,並且要好好地消化它。中間遇到的困難,也是溢於言表啊。

  我算上昨天,我花了總共兩週整零五天的時間,全精力的投入它的實踐。 第一週根據源碼,編寫其頭文件,也就是api了。 這個過程我80%是手敲的,一方面爲了熟悉代碼,另一方面,也爲了更好的移植。 第二週,就是根據源碼,編寫實現代碼,也就是.c文件。 剛開始手敲了一部分,發現這個過程一直手敲的話,戰線拉的太長,不利於整體學習。之後基本是複製的,當然複製也有一個原則,那就是絕不整個文件複製,而是以方法,或者代碼塊爲單位複製,複製完後瞟一眼,留一個大體映像。 第三週,也是最痛苦的一週,那就是在windows平臺進行調試,說實話這個階段我差點就放棄了!!!想一想,在幾千行代碼,棧深度不確定的環境,調試某一個小小的錯誤,無異於大海撈針了。  我承認,我的成功,運氣成分也少不了的,其中有一個細節,如果不是因爲我前面複製的粒度夠細的話,則整個大盤將無法運行(即,windows的原生線程優先級 與 自定義線程優先級的區別)。

  我想把這個過程記錄下來,一方面是爲了幫助有跟我這樣需求差不多的朋友,另一方面,是爲了鞏固深化,更好的消化相關的知識。 

環境介紹:

  我採用的開發環境是:windows10(64位機) + mingw64 + clion + cmake + jdk_1.8_161的rt.jar(注意,不同版本的jdk的核心庫,本地實現會有細微差別)。

   這裏主要注意有如下較大的區別:

     1.原代碼裏面引用了 boost庫的相關內容,考慮到windows平臺使用boost的的各種不方面(尤其是,我不是使用vs進行開發),最終我是選擇用代碼將 boost所使用的庫的內容進行了替換

     2.原代碼使用的是 基於 Linux的pthread線程庫,但是這個庫在windows中,是不支持的。所以,所有與線程,鎖,消息通知相關的部分,我均用windows的api進行了替換

     3.是關於cpu架構的,我的cpu架構是 x64 ,原代碼中的 cpu架構是 x86的,這會導致編譯失敗。機智如我,將這塊代碼塊給注了,代碼編譯就成功了,一切能這麼順利,我也是沒想到。(令我更沒想到的是,這將爲我埋下第一個大大的坑。)

代碼結構:

運行結果:

  在代碼中可以發現,這裏面實際上是不包括 java編譯器的,但是我們完全可以用我們的本地java環境,寫好源代碼後,直接編譯成字節碼即可。   這裏我使用了最簡單的  hello,world!  程序,作用是輸出 "hello,world!" 到程序的控制檯上。 


  這一篇,暫時寫到這吧,貼出源碼地址:地址!

  後面幾篇,我將從 windows需要避免的坑jvm的運行機制jvm的啓動流程java的類加載細節java的gc流程 的邏輯層面來進行本次demo的消化。  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章