C++ 和 Objective-C 都可以 100% 翻譯為 C 代碼嗎?

是否 C++ 和 Objective-C 都是完全基於 C 實現的?


C++是不可以的,Objective-C是完全可以的


最早的C++語言就是通過一個叫做cfront的前端先被轉化成C語言,然後再通過C編譯器編譯為目標程序的。主要原因是那時候還沒有一個靠譜的C++編譯器而且C++特性比較簡單。但是後來C++加入越來越多的新特性之後,已經沒辦法把它簡單翻譯成C語言了。這點在《C++語言設計與演化》裡面其實是說過的。

所以對於題主關於C++的問題來說,答案是No。

Objecttive-C的話,這個通過個人感覺,有些動態特性(比如selector,再比如消息傳遞機制的出錯處理)恐怕也是僅僅靠翻譯成C代碼而不需要編譯器支持也是做不到的。所以個人感覺應該也是No。


1、C++的C代碼生成器cfront據說是在開始支持exception後做不下去的

2、C#那種泛型虛函數也是沒辦法翻譯成C的

3、匿名用戶說圖靈完備的語言都可以100%,硬要這麼說也可以,我把編譯器和虛擬機的代碼也給你合併進去就行了,然後代碼存成資源嵌入在exe裡面(逃


C++不能,Objective-C應該是可以的(這裡用「應該」是因為不太了解OC的彙編能不能用C語言來實現)。

C++是C基礎上發展而來,最初的C++是可以通過cfront翻譯成C的,但是,後來隨著C++新特性的加入,C++就不再僅僅是C的超集了,很多特性單純用C是沒法實現的。

Objective-C是ANSI C的超集 + Runtime 。ANSI C的超集用純C來實現。 Objective-C runtime 的除了極少數部分比如obj-cache.mm和 obj-class.mm用到了C++的類,但也就構造一個類和調用構造函數而已,沒發現用到諸如繼承、多台、template、iterator什麼的。可能我讀書少,沒看到Objective-C中有用到C++特有並用C無法實現的代碼。至於OC Runtime 中的彙編,我對彙編不太熟悉,不太了解,這個不做評論。


理論是可以的,但無實際價值。比如exception,要生成多少代碼才能達到C++幾行代碼的效果。


圖靈完備的語言都是可以 100% 翻譯的。


推薦閱讀:

搞oi/acm的大神為什麼要#define N 1000+10?
運行時異常處理程序是如何實現的?
為什麼大多數程序主函數都return 0; 不return 1; ?
為什麼使用gcc編譯代碼後局部數組變數的初始值消失了?
怎麼來學習c++?

TAG:編程語言 | C編程語言 | C | Objective-C | CC |