C語言資料型別是如何被大多數計算機系統所支援?

linux.cn發表於2015-04-03

問題:

在讀K&R版的The C Programming Language一書時,我在[介紹,第3頁]看到這樣一條說明:

因為C語言提供的資料型別和控制結構可以直接被大部分計算機系統所支援,所以在實現自包含程式時所需要的執行庫檔案一般很小。

這段黑體說明了什麼?能否找到一個例子來說明C語言中的某種資料型別或控制結構不被某種計算機系統直接支援呢?

C語言資料型別是如何被大多數計算機系統所支援?

回答:

事實上,C語言中確實有不被直接支援的資料型別。

在許多嵌入式系統中,硬體上並沒有浮點運算單元。因此,如果你寫出下面的程式碼:

float x = 1.0f, y = 2.0f;
return x + y;

可能會被轉化成下面這種形式:

unsigned x = 0x3f800000, y = 0x40000000;
return _float_add(x, y);

然後編譯器或標準庫必須提供’floatadd()’的具體實現,這會佔用嵌入式系統的記憶體空間。依此去計算程式碼在某個微型系統(譯者注:也就是指微型嵌入式系統)的實際位元組數,也會發現有所增加。

另一個常見的例子是64位整型數(C語言標準中’long long’型別是1999年之後才出現的),這種型別在32位系統上也不能直接使用。古董級的SPARC系統則不支援整型乘法,所以在執行時必須提供乘法的實現。當然,還有一些其它例子。

其它語言

相比起來,其它程式語言有更加複雜的基本型別。

比如,Lisp中的symbol需要大量的執行時實現支援,就像Lua中的table、Python中的string、Fortran中的array,等等。在C語言中等價的型別通常要麼不屬於標準庫(C語言沒有標準symbol或table),要麼更加簡單,而且並不需要那麼多的執行時支援(C語言中的array基本上就是指標,以NULL結尾的字串實現起來也很簡單)。

控制結構

異常處理是C語言中沒有的一種控制結構。非區域性的退出只有’setjmp()’和’longjmp()’兩種,只能提供儲存和恢復某些部分的處理器狀態。相比之下,C++執行時環境必須先遍歷函式呼叫棧,然後呼叫解構函式和異常處理函式。

相關文章