百科问答小站 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算。




  

相关话题

  如何对一个元素只有0和1的数组进行排序? 
  有什么高质量的现代 C++ 风格的开源代码? 
  strcpy的源代码中返回值是指针的意义是什么? 
  老师要求我只能使用C++、C或者Java写算法,如何看这种做法? 
  怎么解决TCP网络传输「粘包」问题? 
  何时使用 Protected 继承? 
  面向对象程序设计比传统的面向过程程序设计更有什么好处? 
  把 string 当 enum 用,有性能损失吗? 
  为什么把内核镜像放在u盘里,电脑(BIOS)加载失败? 
  虚函数效率真的低吗? 

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





© 2024-05-20 - tinynew.org. All Rights Reserved.
© 2024-05-20 - tinynew.org. 保留所有权利