程式的可移植性

2021-09-01 20:45:00 字數 2231 閱讀 8597

程式語言的可移植性意味著,用一種程式語言在乙個系統上編寫的程式經過很少改動或者不經修改就可以在其他系統平台上執行。

什麼是程式

首先,我們得知道程式的本質是什麼?程式的本質就是一連串能被cpu識別並執行的有0、1**組成的指令即目標**(0、1組成的**)。不同型別的cpu指令集是不同的,相同的一段0、1**intelcpu能識別,arm cpu就不能識別產生錯誤。

其次,我們得知道程式的執行原理是什麼?大家都知道程式是執行在作業系統之上的,而大家不知道的是:程式要想在作業系統上執行就需要在程式的頭部嵌入一段啟動**,此**相當於程式和作業系統之間的介面,它包含作業系統所需要的載入和重定位資訊。如果沒有這段啟動**程式很難在windows,linux等作業系統上作為乙個普通應用程式執行。到這裡我們可以清楚的知道:程式=目標**+啟動**,兩者缺一不可,只有這樣程式才能在系統上執行起來。

不同的作業系統,它們的啟動**介面是不同的,例如在intel cpu上執行的xp和linux的啟動**介面是不同的,所以同一種程式它們的啟動**是不同的。但是因為都是intel cpu,所以程式的目標**(0、1**)是相同的。

什麼是程式呢,程式=目標**+啟動**

什麼是系統平台

這裡的系統平台是指cpu+作業系統的組合:如intel cpu+windows xp、intel cpu+mac os x、intelcpu+linux這是三個不同的系統平台,arm cpu+linux與intel cpu+linux也是不同的系統平台。

為什麼系統平台是cpu+作業系統的組合呢,我們從上面了解到程式=目標**+啟動**。目標**隨著cpu型別的不同而不同,啟動**隨著作業系統的不同而不同,因此系統平台是cpu+作業系統。

可移植性的本質

那麼目標**和啟動**是怎麼生成的呢?答案是編譯器。程式語言編寫的程式首先要被編譯器編譯成目標**(0、1**),然後在目標**的前面插入啟動**,最終生成了乙個完整的程式。所以程式語言的可移植性依賴於它們的編譯器是否強大,是否在多個平台上都有這種程式語言的編譯器。例如c編譯器在大約40種系統上可用,包括從8位微處理器的計算機到cray超級計算機。

要注意的是,程式中為訪問特定裝置(如顯示器)或者作業系統(如windows xp  的api)的特殊功能而專門編寫的部分通常是不能移植的。

綜上所述,乙個程式語言的可移植性強不強取決於1.不同平台編譯器的數量  2.對特殊硬體或作業系統的依賴性

移植是基於作業系統的。但是這個時候,我們需要注意一點:基於各種作業系統平台不同,應用程式在二級制級別是不能直接移植的。我們只能在**層去思考可移植問題,在api層面上由於各個作業系統的命名規範、系統呼叫等自身原因,在api層面上實現可移植也是不大可能的。那怎麼才能實現可移植呢? 我們首先來看看現在主流的windows和linux平台下**可移植性。有什麼辦法解決這個問題呢?答案是:在各個平台之間,基於大部分需求抽象出乙個中間層。在中間層中,中間層用了遮蔽底層細節,在我們程式設計師看來c言語庫就是這樣乙個中間層的作用。在各個平台下,我們預設c標準庫中的函式都是一樣的,這樣基本可以實現可移植。但是對於c庫本身而言,在各種作業系統平台下其內部實現是完全不同的,也就是說c庫封裝了作業系統api在其內部的實現細節。 因此,c語言提供了我們在**級的可移植性,即這種可移植是通過c語言這個中間層來完成的。 當然,大家都可以看出上面的可移植是有條件的,c語言本身不能實現完全的可移植,為什麼呢?因為,在我們程式中,我們經常會呼叫系統api,由於這些api在c語言中沒有對其封裝,所以我們只能用使用其原始的api,對於原始的api在各個作業系統中他們命名不同,就不能跨平台移植。所以,我們要寫出完完全全的跨平台的程式,還是需要其他的一些手段。例如在我們的**中下功夫。以下**可以幫助我們實現各平台之間的可移植:

#ifdef _windows_

createthread(); //windows下執行緒的建立

#else

pthread_create(); //linux下執行緒的建立

#endif

對於標頭檔案,也使用同樣的預編譯巨集來實現。如:

#ifndef _windows_

#include #else

#include #endif

這樣就可以實現**的可移植了。在編譯的時候只要通過#define就可以選擇在那個平台下完成程式的編譯。

綜上所述,我們都是將c,c++等各種語言當作中間層,以實現其一定程度上的可移植。如今,語言的跨平台的程式都是以這樣的方式實現的。但是在不同的平台下,仍需要重新編譯。

CppUnit的可移植性

因為假期要打工要使用bcb來做東西,所以在bcb6 sp4下試一下cppunit,結果發現1.8.0對vc的支援比較好,但是在bcb下不能直接編譯。而1.10.2就可以直接在bcb下編譯通過,我將所有cppunit目錄下的檔案都加入乙個lib工程,直接編譯成lib然後平時使用時,在工程中加入標頭檔案...

程式語言的可移植性

假如,你為執行windows 2000 的老式奔騰pc編寫了乙個很好用的c 程式,而管理人員決定使用不同作業系統 如mac os x 或者 linux 和處理器 如sparc處理器 的計算機替換它。該程式 是否可以在新平台上執行呢?當然,必須使用為新平台設計的c 編譯器對程式重新編譯後再執行。如果在...

Unix設計哲學之可移植性

一 問題引導 1.什麼是可移植性?所謂可移植性,即 編寫一次,簡單地做一些修改或者原封不動地就能執行在其他的體系架構機器上而繼續發揮餘熱,充分利用前期工作結果的效用,為軟體開發提供了很好的復用模組,提公升開發效率。2.為什麼移植性很重要?i.資訊革命走過的時間不過半個多世紀,其中發生了翻天覆地的變化...