為什麼 C 標準不明確二進位制介面 ABI 標準?

時間 2021-05-06 08:18:21

1樓:黃亮anthony

應用範圍太廣,定不下來。

標準大多是規範,什麼叫規範,就是大家都自己搞了一套,區別又不大,花樣太多,統一一下。

為什麼有多套標準,因為差異太大,只能統一成幾個,統一不成乙個,各自立乙個標準吧。

c++的abi屬於花樣多的大家誰也不想改,gnu自己就有4個不相容的abi,不要說還有ms/intel,關鍵C++還要相容C,C那邊還有一堆嵌入式cpu。

2樓:陳碩

你說的 C++ ABI 具體指什麼?

物件布局?(單繼承、多繼承、虛繼承)

虛函式的實現機制?

name mangling 的規則?

異常的實現機制?

函式呼叫約定?

3樓:靈劍

ABI不是語言能定下來的,得看硬體答應不答應。不同CPU暫存器數量都不一樣,你規定前四個引數用暫存器傳遞,萬一人家空閒的暫存器只有三個怎麼辦?你規定64位以下的引數可以用暫存器傳參,人家暫存器是32位的怎麼辦?

16位的呢?你規定引數按順序入棧,不對齊位元組邊界,萬一人家暫存器不對齊位元組邊界就不能讀取怎麼辦?

再比如,像x86這樣的雖然叫通用暫存器,但不同的暫存器功能是略有區別的,SP就是專用棧指標,可以配合push之類的指令,不能隨便拿來存別的;這樣,已有的暫存器如何分配,哪些通用,哪些保證函式呼叫時不變,哪些不能保證,這些就都需要按照硬體的特性去設計。所以不可能在所有的硬體上都保持相同的ABI。

雖然理論上來說相同的硬體可以用相同的ABI,但還得考慮到作業系統廠商(以及編譯器廠商)誰也不服誰的問題,這樣不同作業系統的ABI又可能會略有區別。

4樓:zpan

其實吧,每個作業系統也都有該作業系統下的標準 C++ ABI 的,比如 Linux 和 macOS 用的 gcc 和 clang 都遵循 Itanium ABI,而微軟則是自己的一套 ABI。而更重要的問題是,每一次 C++ 標準的更新或多或少會引入一些現有 ABI 裡沒有或者需要修改的東西,標準庫里的一些函式和模板的原型也有變化導致 mangle 成不同的符號,於是你只要用了新標準編譯的庫就無法跟舊程式相容,或者你引用了標準庫里的新符號,在舊的庫里沒有。於是要實現新舊系統同時相容,你就必須只能以舊的標準去寫程式,用舊版本編譯,鏈結舊版本的 C++ 標準庫。

因為新的一般還是相容舊的,像 libstdc++ 裡有各個不同版本的符號。

這也是沒辦法的事,如果限制 ABI 不能變,那標準可以發揮的空間就太少了,在加新語言特性的時候要考慮太多東西,限制就太多了。

而對我來說,學會了 C++14 之後,感覺沒有 C++14 簡直是無法忍受的,甚至在公司公升級 CentOS 7 之前,我寧願用 C,再加上同事也更 prefer C API,於是我乾脆又全部改成 C 了……

5樓:Belleve

七八十年代很可能同一家公司不同型號電腦指令集、機器字長度都不一樣

現在司空見慣的「記憶體按位元組定址」是 80 年代才逐漸流行起來的

6樓:

ABI這事其實跟語言無關,跟實現有關。

為什麼C有統一的ABI呢?主要是因為各主流的OS都以C作為系統API介面,所以在OS層面確定了在同一系統內C的ABI。

所以,C的ABI相容性,其實是由OS來制定並且推廣的。對於不同風格的OS(例如說win->*nix),其實一樣是不相容的。

而C++,沒有明確的ABI相容性,主要就是缺少了乙個強有力的推進機構。

7樓:魯哈花

即便不好完全統一,統一了大部分也是好事。

恐怕不是不想統一或者不統一有什麼好處,而是覺悟太晚,各家的abi都已經大行天下、相對成熟穩定了,想搞也搞不成了。

二進位制有什麼好處,為何電腦都採用二進位制?

個人理解,就是之前有人先定了,然後大家認可,就一直這麼做。Eniac當初的十進位制肯定是有點複雜,但我想,三進製s也是可行的,零正負,三種狀態,也很符合認知,比如 贊同 反對 中立 但是目前的基礎都是二進位制了,想改也不太容易了。至於高低電平,為什麼不可以設定乙個中間的呢,高低電平同樣會有干擾區間,...

「二進位制」是什麼?

十萬個為什麼 先說十進位制,逢十進一,就是9 1 10。這裡的1代表了10個數 狀態。從0到9,用數學說就是十的幾次冪 而2進製,逢2進1,就是1 1 10。這裡的1代表了2個數 狀態,分別是0和1,用數學說就是2的幾次冪。 沙漠小草 二進位制,二 有兩個數字,分別是0 1,進 這兩個數迴圈和重複使...

(卡西歐等)為什麼沒有二進位制 十六進製制計算器(實體)?

小林露露 誰說沒有 程式設計師專用計算器 了呢?德州儀器早在1977年就研發出了專供程式設計師使用的進製轉換專用計算器TI Programmer,本人就收藏有一台改良版本的TI LCD Programmer 隨著積體電路和儲存器技術的飛速發展,這種功能單一的專用計算器早就失去了其存在的意義,而被整合...