如何理解語言的跨平臺?
背景:
第一次聽到跨平臺是在學習java的時候,"Java是一種跨平臺,適合於分散式計算環境的面向對象編程語言。"經常看到諸如此類的描述。當時以為,因為有虛擬機,所以java實現了跨平臺,所以沒有虛擬機的語言就不能跨平臺。
後來,接觸了go語言,在網上看到了這樣的文章"Golang跨平臺交叉編譯"
再後來,接觸了nodejs,又看到了這樣的描述"Node.js 平臺的最大優勢就是跨平臺開發、跨平臺部署、跨平臺運行。"
最後,在後來惡補C語言的時候,又看到了可移植這樣的說法。
總之搞的一頭霧水,所以查閱了一些資料,自己總結了一個不成熟的結論,如下:
正文:
1.應用程序的執行本質是cpu指令的執行,而cpu指令分為特權指令和非特權指令。
2.語言用來編寫源代碼,其中「非系統調用」的部分,被編譯器或者解釋器轉化為非特權指令,而「系統調用的部分」通過鏈接器定位到對應的特權指令,從而最終實現對硬體的管理。
3.所以平臺指的是不同的cpu(對應不同的cpu指令集)和不同的操作系統(對應不同的系統調用),跨平臺就是保證在不同的平臺上,一種源代碼最終能被翻譯成正確的cpu指令,並且得到相同的執行結果。
4.一種語言要想跨平臺,首先要在多個平臺都有編譯器或解釋器,但是不同平臺的編譯器對某些相同的源代碼會轉化成不同的cpu指令,所以需要在編寫代碼的時候避免這種情況。
5.其次,各種標準(比如POSIX)用來保證不同操作系統有相同的系統調用,一個標準內容越少,實現的操作系統就越多。但是可以使用條件編譯的方式針對不同的操作系統執行不同的系統調用來避開這個問題。
結論:
估計以後回頭看到這個總結會有想扇自己的衝動,但是至少能暫時解決自己的一些疑惑
1.java虛擬機可以理解為各個平臺的解釋器,和自己封裝的系統調用。
2.go語言通過交叉編譯轉換成平臺相關指令,通過某種方式(沒有深入研究)提供統一的系統調用介面。
3.javascript 是解釋型語言,本身就是平臺無關的。
4.C語言在各個平臺都有編譯器,通過標準庫函數保證可移植性。
本小菜一枚,查閱資料的時候,看見網上眾說紛紜,運氣不好,沒看到講的特別清晰的文章,一直覺得知乎大神雲集,希望大神看見,指點迷津。
===============以下內容更新於2018-11-21
之前查閱資料的時候,遇到了下面這幾個詞,關係不是很清楚,最近重讀csapp有了一點思路整理在這:
這三個詞語是:系統調用、c語言標準庫函、 posix標準
舉個例子:
<unistd.h> 這個頭文件裏 有write 方法 |posix標準 |系統調用
<fcntl.h> 這個頭文件中有 open 方法 |posix標準|系統調用
<stdio.h>這個頭文件中有fopen 方法 |c標準|庫函數
整理以後 其實這裡邊有兩個維度的分類,一個是[系統調用和庫函數],一個是[c標準和posix標準]
1.[系統調用和庫函數] 這兩個的區別在於,在unix中,編譯器遇到系統調用會編譯成syscall指令,而遇到庫函數會編譯成jmp指令,總結就是區別在於編譯器對方法的處理不同。
2.[c標準和posix標準] 這個區別是介面規範,就沒有什麼必要說的了。
最後,讓我們保持獨立思考,不卑不亢。長成自己想要的樣子!
(引用自 我非常喜歡的B站up主 」獨立菌兒「的口頭禪嗶哩嗶哩 ( ゜- ゜)つロ 乾杯~ Bilibili)
推薦閱讀: