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




  

相关话题

  怎样吸引优秀的C++程序员? 
  3个小时,用 C++ 写不出AVL树,有些迷茫,怎么办? 
  为什么C++库开发人员都喜欢自己造一个字符串类?你见过性能最好开源字符串类是哪个? 为什么? 
  想做 C++ 方面开发,是基于 Linux 还是基于 Windows 平台? 
  为何void类型指针不能解引用,却可以参与强制类型转换? 
  这个图左边这个程序的输出值不太懂为啥是10? 
  有哪些关于C++高性能服务器开发的高质量博客? 
  C 语言中的 double 类型所能表示的数的范围为什么这么大,不是说只占32(或64)位吗? 
  为何对于无符号数,右移必须是逻辑的? 
  C++ 中,如果指针换了被指向的东西,那被指向的原来的东西(是被 new 出来的)所占的内存会立刻被释放吗? 

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





© 2025-02-20 - tinynew.org. All Rights Reserved.
© 2025-02-20 - tinynew.org. 保留所有权利