百科问答小站 logo
百科问答小站 font logo



为什么 C++ 能够源码级兼容C语言? 第1页

  

user avatar   lan-se-52-30 网友的相关建议: 
      
问题1:为什么C++ 能够 源码级兼容C语言?
是编译器内部实现C语言编译器的所有特征吗?

这是从C++设计的时候就做出来的选择。

我有几次做技术分享的时候都被问道过一个问题,那就是C++为什么要选择兼容C?而我的回答则是若不兼容C,或许现在已经没有C++了,不能忘记历史。若回顾C++的成功,这一个选择也无疑是明智的。C++之父Bjarne在The Design and Evolution of C++书籍中曾提到过选择C的四个理由:Flexible, Efficient, Available,Portable。Flexible是指C语言本身并没有什么内在限制,你几乎可以把C应用于任何一个领域。Efficient是大家都知道的,因为C语言足够贴近底层,几乎是直接反映了计算机的基本概念。Available是指无论是嵌入式,还是大型机,都能找到一个可靠的C编译器以及标准库,这是很大的定心丸。Portable则是指C语言的代码很容易迁移,若是使用标准C,无论是从一个操作系统到另外一个操作系统(如Windows到Linux),还是一个体系架构到另外一个体系架构(如Power到x86),虽然说不能说非常顺利,但是这样的代价是完全可以接受的。

于是,正是因为这些优点,让Bjarne决定让C++从C这个基点开始,来设计一个Better C。而为了充分的保留C的优点,Bjarne选择了让C++从源代码级别兼容C,并且对编写C出现的一些主要问题进行了矫正,这主要是类型系统上面,所以,C++在源代码级别是几乎完全兼容的。选择了源代码级别兼容C,那么付出的一个代价则是让语言和编译器都变得复杂,然而在最初设计C++的时候,Bjarne认为这是可以接受的,包括最开始的C++编译器CFront也是把C++转为C。

而再回顾C++的设计,它其实带着有两个目的。一个是可以提供程序员一种载体,以便他们可以描述他们需要执行的行为。而另外一个目的则是可以为程序员提供一组概念(Concepts),以便可以帮助他们思考如何利用语言提供的东西来解决问题。第一个目的则要求语言足够接近底层,可以简单高效的完成,而C在这里也的确是一个很好的选择。而第二个目的,也是C++主要在C的基础上添加的,也是C++进化的时候主要添加的东西。在C++的进化中,Bjarne思考了很多语言,如Ada,Modula-2, Smalltalk,Simula,Clu等,而C++也的确受到了很多语言的影响。这些语言或许在我们这一代中的程序员中都已经很少直接用到,甚至都很少听到了,然而这些语言却对C++有着重要的影响,如Ada为C++提供了namespace,template, exception等灵感,包括Clu, ML也在exception的构造中扮演了重要的角色。而这些老一辈的语言不仅影响着C++这样有一些“老”的语言,若读The Go Programming Language,我们也会发现这些老语言也对Go这样的新语言有着重要的影响,如Modula-2,Oberon,Oberon-2等。

最后,C++选择C还有一个理由,则是Bjarne当时工作在Bell实验室,在那里有着Ken Thompson, Dennis Ritchie, Brian Kernighan,Steve Johnson等人。若C++选择了C,那就意味着有C语言之父和很多大牛可以直接提供指导与反馈,这样的资源必然要利用起来。有了大牛的滋养,加上C++出身名门——Bell实验室,也对C++的成功有了一定的帮助。出身名门不仅对人很重要,其实对于程序语言也是如此。记得有人问过我对Go,Rust,D等语言的看法,当我说到Rust的时候,我就在想,若是Rust可以出身一个更有钱的爹,或许会更顺利一些。

再次回到题主的问题,是编译器内部实现C语言编译器的所有特征吗?不同的编译器会有不同的处理方式,一些编译器(如Clang)是一个前端,一些共同的地方采用共同的组件,不同的地方单独处理。然而有一些编译器则是不同的前端,C和C++是分开的。

除了C++还有什么语言能够源码级兼容C语言?

不严格的说,Objective-C算。




  

相关话题

  怎么形象地理解MFC编程框架? 
  为什么这个程序电脑运行的结果和手机运行的不一样?数值小的时候一样? 
  最短的可以造成崩溃且编译器无法优化掉的 C++ 代码是什么? 
  如果一定要在C++和JAVA中选择,是C++还是java? 
  Borland 是间什么样的公司 他给我们留下了什么文化遗产? 
  运行时异常处理程序是如何实现的? 
  既然谭浩强的c语言教材那么烂,那么应该选择什么书作为c语言教材? 
  C++ 中 new 和定位 new 的返回值都是 void*,却为什么可以被赋值给不同类型的指针? 
  C# 和 Java 哪个更像 C++? 
  有什么像a=a+b;b=a-b;a=a-b;这样的算法或者知识? 

前一个讨论
对付百度卫士、百度杀毒、新毒霸等这些静默安装的软件,这个方法有没有效果?
下一个讨论
C#的Delegate 为什么没在其他主流语言中普及?





© 2025-01-31 - tinynew.org. All Rights Reserved.
© 2025-01-31 - tinynew.org. 保留所有权利