作業系統是軟體層面的,提供CPU排程、記憶體管理、裝置管理等功能。
計算機CPU執行的時候並沒有組合語言、高階語言概念,只有指令:算術運算、邏輯運算、資料傳輸、指令跳轉等。不論哪種語言編寫的程式執行的時候都是轉換成了機器指令,但轉換和載入的時機和方式不同。
微控制器這種,用匯編語言和C語言開發,程式碼編譯後轉成機器碼,連結時分配地址(直接物理地址),全部寫入晶片ROM內,執行時將可讀寫的內容載入到RAM,常量和程式碼在ROM,CPU指令直接訪問。
帶作業系統(完整作業系統,嵌入式實時作業系統有所不同)的與之差別很大,本身硬體複雜很多、軟體規模大很多。上電以後先進行一些基本的硬體初始化,並進行程式碼的複製(從外部價格便宜容量大但讀寫速度慢的儲存裝置),之後會載入作業系統核心,進行作業系統的初始化。作業系統一直迴圈執行響應系統指令、管理任務。
這時記憶體使用的不是實地址,會有分段分頁,根據程式執行時區域性性,根據需要複製程式碼段到記憶體中執行。對應用程式按程序、執行緒進行管理,分配堆、棧、資料段、程式碼段的地址空間,進行載入。
大多數作業系統是C語言編寫的,底層程式碼(如前面硬體初始化、C語言執行環境還沒建立時,如微控制器啟動程式碼中也有)會用到一些彙編程式碼。但作業系統核心程式碼編譯後都是機器指令,不會有彙編程式碼。
高階語言分編譯型和解釋型有所不同。
編譯型的在執行前就會轉換成目的碼(主要是機器指令)。上層應用程式會有大量的API呼叫,編譯時分靜態編譯和動態編譯,靜態編譯就直接把用到的程式碼複製過去了,動態編譯執行時再載入呼叫的部分,生成的目標檔案較小。既然應用程式執行時不是實地址(微控制器就相當於只有靜態編譯),那麼連結時是沒辦法直接跳轉到呼叫處地址的(本身也可能還沒調入記憶體),執行中作業系統還須處理。推測程式碼還有會標號、相對地址存在。
另外一個問題中的描述供參考。
暫存器、加法器、閘電路是組成計算機硬體的基礎,現在這些都是用電訊號的所以是電子計算機,如果能用其它的表示就可以構成其它型別的計算機。
硬體上計算機內部最基本就是資料傳來傳去(暫存器、記憶體、運算器、匯流排等)加上算術和邏輯運算。
計算機科學是分層的,電路>機器指令組成的機器>組合語言指令的機器>作業系統抽象軟體機器>高階語言指令的機器。加上有了資料、文字、圖形、音訊、影片等各種數字化表示方法,資料庫、網路,各種演算法處理構成的應用,就發展出豐富的計算機世界。
所謂程式碼,C\C++,JAVA,Python這些高階語言離電路隔著蠻多層的。
其中C語言是純編譯型的語言,又有一些偏底層的特性,相對來說離硬體更近(偏底層),控制硬體更容易(無論是對應到CPU機器指令>電路還是控制外設)。比如C語言做微控制器開發,最終生成目的碼就是指令和資料。
其中指令就是操作碼+運算元(可以沒有運算元),比如讀取記憶體某地址的一個數或是做加法。執行起來就是透過控制訊號接通某暫存器或是資料輸出埠到匯流排,接著又開通另一處資料繼續往下傳或者透過訊號選擇做加法還是減法。
控制訊號是按序列發出的,決定這個序列的就是機器指令(正在執行的那條儲存在指令暫存器),其中能分解的動作叫微指令。控制器的設計可以是邏輯電路設計(CPU時序訊號+機器指令作為輸入,控制訊號序列為輸出),也可以是微控制器(微指令序列儲存在ROM中,根據機器指令做不通的分解動作)。
JAVA編譯後是位元組碼,執行在虛擬機器上,位元組碼中對應的是虛擬機器的指令,還要在轉換成機器指令;Python是指令碼語言,不編譯,執行時一句一句解釋執行。
這樣的應用程式在儲存時就不是機器碼,而是執行時再轉換。
在某些情況下,為了提高執行效率(現在Android系統app執行就有這樣的機制,前一陣華為方舟編譯器就與這相關)或者免去執行環境搭建(執行時環境,虛擬機器、直譯器),也可以提前轉成目的碼。
作業系統是軟體層面的,提供CPU排程、記憶體管理、裝置管理等功能。
計算機CPU執行的時候並沒有組合語言、高階語言概念,只有指令:算術運算、邏輯運算、資料傳輸、指令跳轉等。不論哪種語言編寫的程式執行的時候都是轉換成了機器指令,但轉換和載入的時機和方式不同。
微控制器這種,用匯編語言和C語言開發,程式碼編譯後轉成機器碼,連結時分配地址(直接物理地址),全部寫入晶片ROM內,執行時將可讀寫的內容載入到RAM,常量和程式碼在ROM,CPU指令直接訪問。
帶作業系統(完整作業系統,嵌入式實時作業系統有所不同)的與之差別很大,本身硬體複雜很多、軟體規模大很多。上電以後先進行一些基本的硬體初始化,並進行程式碼的複製(從外部價格便宜容量大但讀寫速度慢的儲存裝置),之後會載入作業系統核心,進行作業系統的初始化。作業系統一直迴圈執行響應系統指令、管理任務。
這時記憶體使用的不是實地址,會有分段分頁,根據程式執行時區域性性,根據需要複製程式碼段到記憶體中執行。對應用程式按程序、執行緒進行管理,分配堆、棧、資料段、程式碼段的地址空間,進行載入。
大多數作業系統是C語言編寫的,底層程式碼(如前面硬體初始化、C語言執行環境還沒建立時,如微控制器啟動程式碼中也有)會用到一些彙編程式碼。但作業系統核心程式碼編譯後都是機器指令,不會有彙編程式碼。
高階語言分編譯型和解釋型有所不同。
編譯型的在執行前就會轉換成目的碼(主要是機器指令)。上層應用程式會有大量的API呼叫,編譯時分靜態編譯和動態編譯,靜態編譯就直接把用到的程式碼複製過去了,動態編譯執行時再載入呼叫的部分,生成的目標檔案較小。既然應用程式執行時不是實地址(微控制器就相當於只有靜態編譯),那麼連結時是沒辦法直接跳轉到呼叫處地址的(本身也可能還沒調入記憶體),執行中作業系統還須處理。推測程式碼還有會標號、相對地址存在。
另外一個問題中的描述供參考。
暫存器、加法器、閘電路是組成計算機硬體的基礎,現在這些都是用電訊號的所以是電子計算機,如果能用其它的表示就可以構成其它型別的計算機。
硬體上計算機內部最基本就是資料傳來傳去(暫存器、記憶體、運算器、匯流排等)加上算術和邏輯運算。
計算機科學是分層的,電路>機器指令組成的機器>組合語言指令的機器>作業系統抽象軟體機器>高階語言指令的機器。加上有了資料、文字、圖形、音訊、影片等各種數字化表示方法,資料庫、網路,各種演算法處理構成的應用,就發展出豐富的計算機世界。
所謂程式碼,C\C++,JAVA,Python這些高階語言離電路隔著蠻多層的。
其中C語言是純編譯型的語言,又有一些偏底層的特性,相對來說離硬體更近(偏底層),控制硬體更容易(無論是對應到CPU機器指令>電路還是控制外設)。比如C語言做微控制器開發,最終生成目的碼就是指令和資料。
其中指令就是操作碼+運算元(可以沒有運算元),比如讀取記憶體某地址的一個數或是做加法。執行起來就是透過控制訊號接通某暫存器或是資料輸出埠到匯流排,接著又開通另一處資料繼續往下傳或者透過訊號選擇做加法還是減法。
控制訊號是按序列發出的,決定這個序列的就是機器指令(正在執行的那條儲存在指令暫存器),其中能分解的動作叫微指令。控制器的設計可以是邏輯電路設計(CPU時序訊號+機器指令作為輸入,控制訊號序列為輸出),也可以是微控制器(微指令序列儲存在ROM中,根據機器指令做不通的分解動作)。
JAVA編譯後是位元組碼,執行在虛擬機器上,位元組碼中對應的是虛擬機器的指令,還要在轉換成機器指令;Python是指令碼語言,不編譯,執行時一句一句解釋執行。
這樣的應用程式在儲存時就不是機器碼,而是執行時再轉換。
在某些情況下,為了提高執行效率(現在Android系統app執行就有這樣的機制,前一陣華為方舟編譯器就與這相關)或者免去執行環境搭建(執行時環境,虛擬機器、直譯器),也可以提前轉成目的碼。