天天看點

作業系統 編譯器 解釋器

 随便寫的,便于以後做論證

關于作業系統和編譯器

作業系統,用來管理硬體和軟體。

假如由我來設計,怎麼做?

首先,讓裝置導入。

程式:分别檢測:記憶體 -> 主機闆 -> CPU -> 硬碟 -> 顯示器 -> 鍵盤 -> 滑鼠

          回報信号  有  證明:相關硬體  存在

          導入驅動程式:位置指針 (programs include reading/writting interface to access to hardware)

          (驅動程式  一級 API )

          裝置導入 成功

          回報信号  無  證明:相關硬體  不存在

          利用  主機闆 BIOS int調用 打字資訊 :出錯! 相關硬體不存在

          (BIOS int調用程式 零級 API)

          裝置運作 失敗

其次,使裝置可以運做。

     事前工作 [

      讓裝置運做,事先得編寫好運做程式。

      如對記憶體:編寫記憶體管理程式,實作記憶體讀寫操作程式( 可視為:對其驅動程式API的調用封裝);

                記憶體讀寫操作程式 = 記憶體驅動讀寫程式API + 記憶體管理邏輯

      其他裝置同于記憶體,都事先寫好各自的運做程式。

    ]

    把全部的硬體運做程式導入,儲存在記憶體中(已實作對運做程式的調用),記錄各硬體運做程式指針,以便調用。(運做程式 二級 API);

    完成以上,硬體處于可運做狀态。

再次 ,輸寫一個作業系統0号程式。

   事先工作[

             用c編寫0号程式:    

                  main() {

                   啟動多線程程式;//一個線程一個shell,線程分為作業系統1号程式,2号程式,3号程式.....N号程式;

             }

  ]

      以某種方式導入0号程式。

第四: 裝入虛拟機程式 。

      所謂虛拟機程式大家可能很熟悉了,比若Windows,Linux,Unix  

      虛拟機程式調用 ===>運做程式 二級 API  ,行成硬體虛拟機下的運做程式 ,可以把它看成  [虛拟機運做程式 三級API];

      把虛拟機安裝在作業系統1号程式下,讓它每次都第一個啟動;

第五:虛拟機的管理邏輯思想。

      自從虛拟機有了[虛拟機運做程式 三級API],它也就有了各種資源的控制權,成為作業系統的代理。

      windows 和linux 有差別。windows我不熟悉, 若 linux ,它邏輯可不是簡單幾句話可以說清楚,

      我還沒有到那水準。windows是嫁接在DOS 上的,以上四步有DOS 來完成;而Linux 則不然,它是很

      直接的,把以上四步都直接自己做了。

      但是,可以想,在啟動 linux的時候,提供了很多 console 資訊,可以比較明顯的看出以上步驟的

      執行。

      linux 把作業系統的活都給幹了,那就不能叫它為虛拟機了,而應該叫它為作業系統。

第六 關閉裝置運做程式。   

==========================================

編譯器

    我覺的掌握好一計算機語言,就是掌握該語言的編譯器設計思想。

    我寫好一個 test.java程式,存在 /home/Java/ 下

      # javac  test.java

      在/home/Java/多出一個test.class檔案。

    這個 javac 是不是應該純粹是一個, 詞法文法分析器,翻譯成JVM 讀的二進制檔案,然後調用

    [虛拟機運做程式 三級API]做檔案儲存。

     運作 # java test.class

    這個 java  要做連接配接工作(makefile),翻譯工作(詞法文法分析),翻譯成本地CPU二進制檔案。除

    此之外,我想,還應該有其他工作。java程式記憶體中,有靜态資料、堆,棧的概念。而作業系統,

    劃給應該程式的記憶體中隻有,程式data塊,靜态資料塊和棧,我想java編譯器至少要自己從棧中再

    劃出一塊給堆。

    對記憶體操作,感覺好象要用彙編語言來寫,其實不用,作業系統已經事先把各段應用記憶體指針寫好了

    那樣可以用C 語言,調用[運做程式 二級API]來寫。

    假如以上說法正确,那麼用C 彙編後運作的程式,和java彙編後運作的程式,他們在記憶體的資料結構

    組織方式應該是不同的了???因為2個是2種不同的語言。

    但是從作業系統角度看,應該是資料結構相同的。有人可以回答我嗎?肯定是我概念搞混了。

   ========

我自己的回答:

    編譯器要做兩個任務,第一是把某種語言翻譯成機器語言;第二,讓這種機器語言成為可以運作的程式。

那JAVA 來說,由對象class 構成 ,class包括成員變量和成員方法,其成員變量和方法要在對應的記憶體中

給他們開辟空間,假如對空間開辟不給予一定規劃,那記憶體中的組織結構會非常的混亂,程式可能就會無法

或者效率很低的運作。這就是運作環境。《編譯原理》課程中基本上有運作環境的介紹,對于其結構說明

基本上分為三類,C 和JAVA 編譯器建構運作環境雖然說都是基于棧式的,但是其實作的管理邏輯估計肯定

是不相同的,編譯器要對代碼區域(由程式1,程式2....等靜态代碼構成)、全局資料區域、資料區域(由

程式1活動記錄1,程式2活動記錄2...等構成)進行管理。

   假如讓我設計一個編譯器,我會制定一種新語言規則,實作其文法詞法分析,但是如何建構我的運作環境

倒是覺的有點難,估計,這段運作環境代碼要用彙編語言和C 語言合起來寫。

 有了編譯器,新的語言在設計程式時候再也不用考慮程式的記憶體組織的具體形式了,對設計者而言,成為

透明的了。

  這給人感覺,好象每個程式的運作時候,就得加上一段代碼,也就是組織記憶體的代碼,對于JAVA 而言,

自己的設計程式,在執行運作的時候,就得給我的代碼最前面加上Java.dll裡的記憶體組織管理程式。

  作業系統先是給整個硬體,比如給記憶體劃分了系統和使用者區域,規定了他們的大小,對于系統這塊的運作

次序,作業系統本身就可以對其記憶體進行組織,而對于使用者區域的具體怎麼劃分,作業系統就管不到了,但是

作業系統會喚醒使用者區域程式的編譯器,告訴它程式要運作,你要把程式的運作環境在該使用者區域裡搞起來。

   這樣解釋的話,我們來看一下HotSpot ,我們一運作java.exe程式(比如:# java   /home/myjava.class),

在lanucher的java.c 裡,第一件事就是先把jvm.dll導進來,jvm.dll的源程式我沒有看見,估計就是一些運作

環境的管理程式,當然還有其他的一些什麼,比如連接配接,垃圾回收,代碼安全性檢測啊什麼的(自己猜的)。

有了這個前提條件,我的myjava.class 才可以運作。

================

編譯器的弟弟是解釋器

這兩個覺的應該差不多的,隻是在設計邏輯上不同,當然程式差別還是很明顯的,因為解釋語言在運作時,

同時進行“編譯”和運作,好象不産生中間代碼的樣子(?),速度上肯定會稍微的慢些,是以,對有些

“小程式語言”來說,設計成解釋語言,還是不錯的。現在流行動态語言,我個人了解就是些“小程式語言”,

他們具有靈活性,因為每次運作的時,它都得進行“編譯”,無中間代碼的拖累,估計每次生産的運作環境

都會是有不少差距的,像JavaScript的弱變量定義,雖然編譯器也可以這麼做,但對編譯器而言,代價可能非常

的大,犧牲效率性,還不如讓解釋語言來做。這樣兩者結合使用,可以顧全大局,同時也展現,程式的子產品化設計

思想。

JAVA 非常特殊,從原理上講她即有編譯又有解釋。