Unix設計哲學之可移植性

2021-07-30 12:34:13 字數 2964 閱讀 6879

一:問題引導

1. 什麼是可移植性?

所謂可移植性,即**編寫一次,簡單地做一些修改或者原封不動地就能執行在其他的體系架構機器上而繼續發揮餘熱,充分利用前期工作結果的效用,為軟體開發提供了很好的復用模組,提公升開發效率。

2. 為什麼移植性很重要?

i.資訊革命走過的時間不過半個多世紀,其中發生了翻天覆地的變化,從intel公司於1971年推出的intel 4004微處理器開始,到現在的core i7系列,其中的電晶體的數量從2250個到幾十億的變化,呈現幾何倍數增長,其複雜都可見一斑,x86如此,其他體系架構亦是如此,什麼mips、powerpc、arm等等。

ii.硬體的發展早於現代意義上的軟體發展。軟體最早是以二進位制指令序列來體現的,後來發明了助記符形式的程式設計方法-彙編方法,彙編相對於二進位制而言,更友好和更易維護,但它還是和具體的體系架構資訊緊密聯結。後來到了20世紀70年代初期,c/c++等高階語言相繼誕生,遮蔽了具體的硬體資訊,使得軟體開發人員根本不需要了解體系結構的暫存器和以及定址方式,這些所有工作都扔給了編譯器,極大地降低了軟體開發的難度。與此同時也提高了軟體在不同體系架構之間的可移植性。

iii.高階語言產生,使得軟體發展的速度遠超於硬體。軟體的超強靈活性使得軟體飛速發展,相對於發展較慢的硬體而言,大量編寫過的軟體可以重新被復用並且新增新的特性發揮餘熱。軟體行業的發展就是在這樣的不斷迭代中一步一步跑過來的。因此,移植性對於軟體開發而言,至關重要,不需要從頭造輪子,在現有的基礎上新增新的特性從而適應新時代對軟體行業提出的新要求和新挑戰。

3. 在移植性和效率方面,如何選擇?

i.可移植性概念包含了一層含義:就是在具體硬體資訊和軟體之間增加了乙個層的概念,一般而言它是一些系統軟體,比如編譯器,它完成軟體到二進位制的中間的轉換過程,以適應不同的體系架構。

ii.俗話說,魚和熊掌不可兼得,二進位制形式的軟體效率無疑是最高的,因為它充分利用硬體的資源和特性,而經過中間層的可移植軟體則不具有如此快的速度。

iii.一般而言,在一些簡單並且注重效率方面,使用彙編這樣高效率的實現方式,而一些複雜通用的部分,可以考慮使用高階語言編寫的可移植性程式。比如linux作業系統,99.9%都是用c語言寫的,而只有少部分的啟動和初始化**是用特定架構的彙編完成的。

二:具體闡述

1. 捨棄高效率而取移植性

i.程式設計師要面對的乙個艱難選擇就是:高效率和可移植性。這是乙個極其磨人的抉擇,因為偏向高效率往往導致**不可移植,而選擇可移植性卻又會讓軟體的效能不那麼盡如人意。

ii.高效率的軟體不會浪費cpu週期,它充分利用了底層硬體的特性,可往往完全忽視了可移植性的問題,比如利用了圖形加速器,高速緩衝儲存器以及專門的浮點指令等硬體功能。

iii.雖然高效率的軟體非常有吸引力,但是可移植性意味著軟體能夠執行在不同的機器上,這使得人們考量的天平向可移植性這一端傾斜。一代代處理器如滾雪球般發展,半導體設計世界的動向令人目不暇接,晶元的效能不斷呈現螺旋式加速上公升,根據摩爾定律,每個18個月硬體的速度翻倍,當然,現實的發展速度快於定於所言。從這個意義上,可移植性更具優勢。

iiii .在轉移到乙個新平台的時候,充分考慮了可移植性因素的軟體大大降低他的平台轉移成本,開發人員不需要耗費太多時間在移植工作上,因此他們可以把更多的時間用於開發新功能,由此吸引更多的使用者,同時也賦予產品新的商業優勢。

2. 最高效的方法往往不可移植

任何時候,但凡乙個程式利用了其某些特殊硬體功能的優勢,它往往變得高效,但卻也變得不那麼可移植了。特殊功能有時候會極大提高軟體的效能,但他們需要採用於硬體裝置相關的**,但目標硬體被更快的版本取代以後,人們就需要更新**。

3. 不要花太多時間去優化程式

還是那一點:晶元的效能不斷呈現螺旋式加速上公升,硬體效能越來越快,在有限的時間用於開發更加有用的功能。

4. 常用的一些可移植的處理方式

i .shell指令碼編寫的軟體在類unix系統上幾乎通用。比如各大linux發行版。ubuntu,redhat。

ii .採用純文字檔案來儲存資料,所謂純文字就是應該只包括一組由換行符字元或者newline分割的位元組流。 文字是通用的可轉換格式,幾乎說有的目標平台都能處理文字編碼的資料,效用文字可以消除很多麻煩,你不需要將自己的資料從一種二進位制格式轉化到另一種二進位制格式。

CppUnit的可移植性

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

程式的可移植性

程式語言的可移植性意味著,用一種程式語言在乙個系統上編寫的程式經過很少改動或者不經修改就可以在其他系統平台上執行。什麼是程式 首先,我們得知道程式的本質是什麼?程式的本質就是一連串能被cpu識別並執行的有0 1 組成的指令即目標 0 1組成的 不同型別的cpu指令集是不同的,相同的一段0 1 int...

程式語言的可移植性

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