2019独角兽企业重金招聘Python工程师标准>>>

GCC在2012年8月15日的时候,merge了一个patch - Merge from cxx-conversion branch,这意味着,以后在GCC的编译只能用C++的编译器了,也意味着,gcc的实现代码开始转向C++了。

你可能会有两个问题,

  • 一个问题是为什么GCC要转成C++的实现?
  • 没有C++的编译器,我怎么编译C++编译器的代码?这不是“鸡生蛋还是蛋生鸡”的问题么?

那,我们来看一看吧。

为什么要用C++

在GNU的C++ Conversion文档中,我们可以在Background中看到这样的描述:

Whether we use C or C++, we need to try to ensure that interfaces are easy to understand, that the code is reasonably modular, that the internal documentation corresponds to the code, that it is possible for new developers to write new passes and to fix bugs. Those are the important issues for us to consider. The C++ features which are not present in C – features which are well documented in many books and many web sites – are not an important issue.

这句话的意思可以理解为,今天GCC在用C语言的实现已经有点hold不住了,因为,开发人员觉得,不管我们用C或C++,都需要努力确保接口是容易理解的,这样我们的代码是想当理性地被模块化的,这样内部文档和代码一致,这样可以更好地组织代码,这样有利于新人了fix-bug。而C++正好可以让他们更好的完成这些东西。

GNU还给出了下面这些理由:

  • C++ 是一种标准化的,大众的,流行的语言。
  • C++ 是C90的超集。
  • C++作为C的扩展和C在性能上一样好。
  • C++ 在一些有意义的案例上支持更干净的代码。
  • C++ 让你更容易去写一个更干净的接口。
  • C++ 永远不会让你的代码变得更丑。
  • C++ 不是万灵药,他是C的一个改进。

然后,给了一个PDF http://airs.com/ian/cxx-slides.pdf,这是Google 的 Ian Lance Taylor的的一个PPT,这个文档可以让大家更好地理解我在《C++的坑多吗?》一文中那些观点。我都不知道我要说多少遍C++的封装,继承和多态比C语言在代码组织上要好得多得多。大家还是自己看一下代码吧:

数据结构的操作 —— 你写的一定不会有STL好

结构套结构还是继承?

函数指针还是多态?

垃圾回收 还是 智能指针?

Why not C++? 

  • C++慢吗?某些特性会慢,但是有时C++更快,你可以只用你喜欢的C++特性。
  • C++复杂吗?它只不过是另一种编程语言,他可以让你对程序员维护更简单。
  • FSF不喜欢C++!因为FSF(自由软件基金会)这些人不写代码。

Bootstrapping

最后,我想来介绍一下Bootstrapping。 所谓Bootstrapping,就是用自己这个语言写编译器来编译自己,也就是说如果你要编译gcc,你需要用一个c的编译器来编译之,这个就是bootstrapped process,自举过程。包括 BASIC, Algol, C, C++, Pascal, PL/I, Factor, Haskell, Modula-2, Oberon, OCaml,Common Lisp, Scheme, Java, Python, Scala 等语言都这么干。

这样干的好处主要是,自己可以测试自己,编译器的改善和语言的改善相辅相成。

但是,这是一个“鸡生蛋,还是蛋生鸡”的问题,如果你需要用X语言来写一个X语言编译器的语言,你可以这样干:

  • 用Y语言来实现X的语言解释器或编译器。 Niklaus Wirth 说 Pascal 的第一个编译器是由 Fortran 写的。
  • 已存在用Y语言写的X语言的编译器或解释器。Scheme 就是这么干的。
  • 已经有一个编译器来编译一个早期版本的X语言,然后就可以用早期版本的X语言来编译新版本的X语言了。Java,Haskell, 和最初版的 Free Pascal 就是这么干的。
  • X在某平台上的编译器已经存在,可以使用交叉编译技术来编译另一个平台上X语言,C语言就是这么干的。
  • 用X语言写一个编译器,然后手动编译之(不需要特别优化),(注:手动编译估计就是手动翻译成机器汇编代码),然后再运行这个手动编译的编译器来编译这个编译器的源码,并优化之。Donald Knuth 在他的 WEB literate programming 系统里用到了这个方法。

转载于:https://my.oschina.net/u/218425/blog/84390

GCC 用 C++ 来编译(酷壳)相关推荐

  1. 程序员练级(转自酷壳)

    月光博客6月12日发表了<写给新手程序员的一封信>,翻译自<An open letter to those who want to start programming>,我的朋 ...

  2. 程序员练级攻略----转自酷壳网coolshell.c n

    月光博客6月12日发表了<写给新手程序员的一封信>,翻译自<An open letter to those who want to start programming>,我的朋 ...

  3. 酷壳: 程序员技术练级攻略

    http://coolshell.cn/articles/4990.html 前言 你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友 ...

  4. 学习java 程序员技术练级攻略 作者:酷壳

    好文章要转载:http://blog.csdn.net/androidmylove/article/details/8990828 文章结束给大家来个程序员笑话:[M] 月光博客6月12日宣布了< ...

  5. UNIX传奇[转自酷壳]

    酷壳原文地址:http://coolshell.cn/articles/2322.html 本来是一篇老文章,最近翻出来一是作为一个程序员的编年史消遣一下:二是试图从其中找到业界这么多年来计算机文化的 ...

  6. 程序员技术练级攻略---酷壳_陈皓

    月光博客6月12日发表了< 写给新手程序员的一封信>,翻译自< An open letter to those who want to start programming>,我 ...

  7. 如何学好C++语言—酷壳

    注:转载自酷壳,觉得写的不错! 昨天写了一篇如何学好C语言,就有人回复问我如何学好C++,所以,我把我个人的一些学习经验写在这里,希望对大家有用.首先,因为如何学好C语言中谈到了算法和系统,所以这里就 ...

  8. 对技术的态度(酷壳)

    (转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途) --=== 访问 酷壳404页面 寻找遗失儿童. ===-- 最近人品爆发,图灵社区,InfoQ,51C ...

  9. 陈皓,酷壳coolshell.cn博主

    芝兰生于深谷,不以无人而不芳 .君子修身养德,不以穷困而改志. "码农人物志"第二期码农代表:陈皓(@左耳朵耗子),酷壳coolshell.cn博主. 14年软件开发相关工作经验, ...

  10. Web工程师的工具箱 | 酷壳 - CoolShell.cn

    Web工程师的工具箱 | 酷壳 - CoolShell.cn Web工程师的工具箱 | 酷壳 - CoolShell.cn Web工程师的工具箱 2012年12月19日 陈皓 发表评论 阅读评论 30 ...

最新文章

  1. 【怒怼老乔】居然苹果手机IOS系统还不支持css3的transparent属性值,我去~~~~
  2. 【Zookeeper】源码分析之Leader选举(一)
  3. 绿色番薯 GHOST XP SP3 新春贺岁版
  4. [administrative] windows 下制作USB启动盘的工具
  5. 一张图告诉你什么是系统架构师
  6. MongoDB高级——复制(副本集)
  7. (7)JavaScript字面量
  8. python中的real是什么意思_为什么“1.real”语法错误,但“1 .real”在Python中有效?...
  9. 枚举与常量需要注意的一个问题
  10. Bailian4077 出栈序列统计【卡特兰数】(vijos P1122)
  11. 实现CTF智能合约题目的环境部署
  12. firefox浏览器一分钟去广告--去广告插件安装教程(adblock plus)
  13. 七夕表白攻略:原来数学才是世界上最浪漫的学科!
  14. 厦大C语言上机 1360 算日期
  15. 阿里天池工业蒸汽量预测baseline-数据探索篇
  16. 【Python】三维画图——matplotlib以及np.mgrid的使用
  17. 水电设计院信息管理系统1.0
  18. html点击弹出文本框,html制作,点击文字超链接显示文本框,再点击文字超链接隐藏文本框...
  19. python基于PHP+MySQL的志愿者管理系统
  20. UGUI源码分析:开关组件Toggle与ToggleGroup

热门文章

  1. solr5 导入oracle,Solr7使用Oracle数据源导入+中文分词
  2. spss主成分综合得分_使用SPSS对美国50个州情况分析
  3. 【BZOJ1911】【codevs1318】特别行动队,斜率优化DP
  4. C ++ 类 | 类的例子,构造函数(Constructors),析构函数(Destructors)_2
  5. 佳能打印机g3800如何安装到计算机,佳能Canon PIXMA G3800 驱动
  6. python清理垃圾_用Python自动清理系统垃圾,再也不用360安全卫士了
  7. mysql导出结构及数据结构,Mysql导出数据结构 or 数据
  8. C#下实现的基础K-MEANS多维聚类
  9. ztree局部刷新节点_神经网络训练的世界记录是怎样被刷新的 -- 总结分布式训练的计算场景...
  10. mqtt调试助手_腾讯物联网开发平台入门操作,如何使用MQTT协议上传温度湿度数据...