C語言數(shù)據(jù)類型是如何被大多數(shù)計算機系統(tǒng)所支持?
問題:
在讀K&R版的The C Programming Language一書時,我在[介紹,第3頁]看到這樣一條說明:
因為C語言提供的數(shù)據(jù)類型和控制結(jié)構(gòu)可以直接被大部分計算機系統(tǒng)所支持,所以在實現(xiàn)自包含程序時所需要的運行庫文件一般很小。
這段黑體說明了什么?能否找到一個例子來說明C語言中的某種數(shù)據(jù)類型或控制結(jié)構(gòu)不被某種計算機系統(tǒng)直接支持呢?
回答:
事實上,C語言中確實有不被直接支持的數(shù)據(jù)類型。
在許多嵌入式系統(tǒng)中,硬件上并沒有浮點運算單元。因此,如果你寫出下面的代碼:
float x = 1.0f, y = 2.0f;
return x + y;
可能會被轉(zhuǎn)化成下面這種形式:
unsigned x = 0x3f800000, y = 0x40000000;
return _float_add(x, y);
然后編譯器或標準庫必須提供’floatadd()’的具體實現(xiàn),這會占用嵌入式系統(tǒng)的內(nèi)存空間。依此去計算代碼在某個微型系統(tǒng)(譯者注:也就是指微型嵌入式系統(tǒng))的實際字節(jié)數(shù),也會發(fā)現(xiàn)有所增加。
另一個常見的例子是64位整型數(shù)(C語言標準中’long long’類型是1999年之后才出現(xiàn)的),這種類型在32位系統(tǒng)上也不能直接使用。古董級的SPARC系統(tǒng)則不支持整型乘法,所以在運行時必須提供乘法的實現(xiàn)。當然,還有一些其它例子。
其它語言
相比起來,其它編程語言有更加復(fù)雜的基本類型。
比如,Lisp中的symbol需要大量的運行時實現(xiàn)支持,就像Lua中的table、Python中的string、Fortran中的 array,等等。在C語言中等價的類型通常要么不屬于標準庫(C語言沒有標準symbol或table),要么更加簡單,而且并不需要那么多的運行時支 持(C語言中的array基本上就是指針,以NULL結(jié)尾的字符串實現(xiàn)起來也很簡單)。
控制結(jié)構(gòu)
異常處理是C語言中沒有的一種控制結(jié)構(gòu)。非局部的退出只有’setjmp()’和’longjmp()’兩種,只能提供保存和恢復(fù)某些部分的處理器狀態(tài)。相比之下,C++運行時環(huán)境必須先遍歷函數(shù)調(diào)用棧,然后調(diào)用析構(gòu)函數(shù)和異常處理函數(shù)。