1. 程式人生 > >關於高階語言編譯、作業系統、硬體的關係思考(二)

關於高階語言編譯、作業系統、硬體的關係思考(二)

首先,最近學習一些java的基礎,並且準備轉向安卓學習,但是本人有個缺點,常常考慮問題太過深入,以至於不能釋懷去繼續學習,這其實對一個新人來說,並不是一件好事,有時候需要儘快入門,才能有助於我們走的更遠,首先,列舉幾個如題目中相關的疑問:

1、 高階語言,如java、c,是否可以直接通過編譯器轉換為硬體識別的機器碼?

為什麼有這個疑問呢,因為學習高階語言一直在強調跨平臺性,本來我以為只是指作業系統,後來瞭解其實也包括硬體系統,即使這樣

如果編譯器也可以實現把高階語言變成機器碼,至多出現一些硬體不相容問題,但是沒有所謂跨作業系統的問題了。

舉例個人電腦,大部分即可以裝windwos系統,也可以安裝linux系統,但是硬體是同一個,如果我們機器上java或者c程式能夠通過一個編譯器直接轉換為

硬體對應的指令集,那麼就解決了跨作業系統的問題,也就是同一個程式可以在不同的作業系統上執行,因為我跳過它,直接和硬體打交道。

我想一定是可以通過一個強大的編譯器去實現的,反正我暫時想不到不能實現的原因。那一定時由於某種現實的考慮,促使後來的高階語言沒有怎麼做

而是高度的依賴作業系統去構建整個執行環境。

2、接著談談為什麼高階程式語言要依賴作業系統?

因為在網上沒有找到明確的說法,但是我自己推斷的原因是這樣,因為不同硬體的指令集不一樣的,所以如果高階語言直接編譯成機器碼,編譯器需要相容

到不同的指令集,這樣才能保證程式在不同的機器上執行;而作業系統在這方面做了很多工作,就是對不同硬體指令集的相容,如CPU,這樣作業系統才能

在不同cpu的電腦上正常安裝和執行。所以作為一個高階語言有沒有必要重新實現這種相容工作,比如是否可以參照windows和linux系統的實現,並把它加入自身的編譯器中

,對於這個可能我不置可否。但最終它還是選擇依賴於作業系統,也就是呼叫作業系統提供的API。

3、既然你依賴與作業系統,那麼不同作業系統提供api不一樣,怎麼跨作業系統,簡單的說,在不同操作上,是否要對應寫一份程式 ?

比如java是通過虛擬機器實現的跨平臺的,也就是隻編寫一個程式,但是它去不同平臺上執行的時候,其實帶了對應的jvm,不同的作業系統由對應jvm

去幫這一個程式去解釋,而不同的jvm由sum公司去實現和更新,而且它會把對不同作業系統的底層呼叫(API)進行封裝,對開發者卻提供了統一的Java API,這樣就

減少程式設計師去了解作業系統API的差異性;

而C++言語,我不是很瞭解 ,但是好像是通過不同的編譯器,在對應的作業系統上重新編譯一下,從而實現的跨平臺的,其實我覺得本質上沒有太多差距。而且我不知道

c++是否有自己統一的API,如果也可以直接呼叫作業系統(因為windows和linux都是c編寫的),會出現呼叫一個API,在windows中存在,在linux不存在或者不是這個名稱,

那麼在linux下編譯時就會出現問題,需要重構原始碼。

4、關於java為什麼不直接在jvm中執行.java檔案,就是java  xxx.java,而是首先通過javac xxx.java編譯成二進位制檔案xxx.class,然後在jvm執行class檔案。

網上很多人說是跨平臺,其實跨平臺是用不同jvm執行同一個檔案 ,從而翻譯給不同平臺。其實完全可以jvm去執行java原始檔,但在虛擬機器中處理時,

可以把java檔案轉換成class,然後再去執行,就是合併這兩個。但是這裡面有一個問題,我們知道編譯時需要檢查語法錯誤等等,如果合併,每次執行一個檔案都需要去

重新檢查一次,這會降低效率,而分離以後,在執行編譯後的檔案時,就不需要再去重複檢查,而且變成而二進位制流檔案,也增加檔案的安全性。 

以後都是2個月菜鳥的一些片面和甚至錯誤的想法,僅供自己記錄和回顧。