Refresh

This website coolshell.cn/articles/8115.html is currently offline. Cloudflare's Always Online™ shows a snapshot of this web page from the Internet Archive's Wayback Machine. To check for the live version, click Refresh.

GCC 用 C++ 来编译

GCC 用 C++ 来编译

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,自举过程。包括 BASICAlgolCC++PascalPL/IFactorHaskellModula-2OberonOCaml,Common LispSchemeJavaPythonScala 等语言都这么干。

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

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

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

(全文完)

(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (22 人打了分,平均分: 3.59 )
Loading...

GCC 用 C++ 来编译》的相关评论

  1. “指指” => “指针”
    “包插” => “包括”?
    话说stl是编译器实现者实现的吧?我读过一点gcc实现的stl,给我感觉就是为通用性付出了性能损失。// 当然也不全怪人家,异常处理太不给力了。。愚见。

  2. Tim Shen :
    “指指” => “指针”
    “包插” => “包括”?
    话说stl是编译器实现者实现的吧?我读过一点gcc实现的stl,给我感觉就是为通用性付出了性能损失。// 当然也不全怪人家,异常处理太不给力了。。愚见。

    为何得出结论STL就是编译器的实现者写的?STL也有不同的实现版本吧,只不过都遵循一个标准接口而已。通用性和性能之间是互相矛盾的,没办法!写库都得遇到类似的问题。

  3. gcc换用什么语言不重要,因为gcc已经不重要了。FreeBSD发行版已经换用llvm了,各大Linux发行版也迟早会弃暗投明的。

  4. C++虽然很容易被误用,不过gcc这么大个开源项目,靠他们的编码规范、文化,肯定还是hold得住的。但我觉得既然都不怕复杂用了C++了,干嘛不直接用D语言得了。

  5. 博主写这文章的主要目的就是想要证明c++不比c差,这是很多人喜欢争论的东西。
    不过为什么通常争论的主体对象不是反过来的呢?

  6. 想不通居然还用讨论GCC转用C++的问题。C++现在又不是新语言,以前版本的GCC就可以编译C++,新的GCC用旧版编译一下就是了。

  7. 慢慢意识到,搞开源那些牛人也不是神,也不总是对的,也会犯一些老顽固

  8. 用吧,然后去比较。
    反正,现在在我的工作范围内主要是用Python,比较有效率,部分C/C++/Java,看场景。
    每个语言都是为了解决某些问题而搞出来的。
    我很奇怪,为什么要拿C和C++来做比较呢?它们根本就没有可比性,就像你拿C和汇编比较一样。
    C看起来好看些,好维护一些,但是,你敢说汇编没用?

  9. acgmohu :
    用吧,然后去比较。
    反正,现在在我的工作范围内主要是用Python,比较有效率,部分C/C++/Java,看场景。
    每个语言都是为了解决某些问题而搞出来的。
    我很奇怪,为什么要拿C和C++来做比较呢?它们根本就没有可比性,就像你拿C和汇编比较一样。
    C看起来好看些,好维护一些,但是,你敢说汇编没用?

    你说的效率是指开发效率吧。python的运行效率实在不敢恭维!

  10. acgmohu :
    用吧,然后去比较。
    反正,现在在我的工作范围内主要是用Python,比较有效率,部分C/C++/Java,看场景。
    每个语言都是为了解决某些问题而搞出来的。
    我很奇怪,为什么要拿C和C++来做比较呢?它们根本就没有可比性,就像你拿C和汇编比较一样。
    C看起来好看些,好维护一些,但是,你敢说汇编没用?

    在一个完整的项目,python的运行效率可以用shit形容

  11. icosagon :

    acgmohu :
    用吧,然后去比较。
    反正,现在在我的工作范围内主要是用Python,比较有效率,部分C/C++/Java,看场景。
    每个语言都是为了解决某些问题而搞出来的。
    我很奇怪,为什么要拿C和C++来做比较呢?它们根本就没有可比性,就像你拿C和汇编比较一样。
    C看起来好看些,好维护一些,但是,你敢说汇编没用?

    在一个完整的项目,python的运行效率可以用shit形容

    当然,如果只是用python而没用过C++开发过项目,可能感觉不到python有多慢,因为压根没见过c++的快

  12. C和Cpp萝卜白菜各有所爱,对于初学者来说只需要能保证支持最新版的C标准和Cpp标准就行了。对于学习有二三年经验的程序猿来说两种不同的代码可以学到不同的知识点。起码我个人是这么理解的。

  13. icosagon :

    acgmohu :
    用吧,然后去比较。
    反正,现在在我的工作范围内主要是用Python,比较有效率,部分C/C++/Java,看场景。
    每个语言都是为了解决某些问题而搞出来的。
    我很奇怪,为什么要拿C和C++来做比较呢?它们根本就没有可比性,就像你拿C和汇编比较一样。
    C看起来好看些,好维护一些,但是,你敢说汇编没用?

    在一个完整的项目,python的运行效率可以用shit形容

    学着做做网页程序, 你会发现Python还是挺快的.

  14. 上次在微博上问你个问题,你没有回应,再问一下
    #include

    int main(int argc, char **argv)
    {
    const int a = 10;
    int *b = &a;
    printf(“%p:%d %p:%d\n”, &a, a, b, *b);
    *b = 5;
    printf(“%p:%d %p:%d\n”, &a, a, b, *b);

    return 0;
    }
    能不能解释一下,用clang编译为什么会有这种结果

  15. 看了一眼,发现

    The FSF is not writting the code.

    被翻译成了

    因为FSF(自由软件基金会)这些人不写代码。

    the code 在这里应该是特指,在这个上下文中应该指 gcc 的代码。再加上时态,is
    writting, 说明是现在没在写。翻译的结果可以理解成

    因为FSF(自由软件基金会)这些人(任何时候)不写(任何)代码。

    不得不说,这一句是一个十分糟糕的翻译。

  16. icosagon :

    icosagon :

    acgmohu :
    用吧,然后去比较。
    反正,现在在我的工作范围内主要是用Python,比较有效率,部分C/C++/Java,看场景。
    每个语言都是为了解决某些问题而搞出来的。
    我很奇怪,为什么要拿C和C++来做比较呢?它们根本就没有可比性,就像你拿C和汇编比较一样。
    C看起来好看些,好维护一些,但是,你敢说汇编没用?

    在一个完整的项目,python的运行效率可以用shit形容

    当然,如果只是用python而没用过C++开发过项目,可能感觉不到python有多慢,因为压根没见过c++的快

    python是一门艺术化的语言,极其简化了按键数量,有效地延长了键盘的寿命。其中某些特性内部执行速度其实和 c 一样的,比如列表解析。只是语句的组合以及不当的用法会拖慢它的效率,总体来说项目越大 python 和 c 实现后的效率差距也大。有时候在开发效率和执行效率上需要一点折中

  17. 曹昊 :
    上次在微博上问你个问题,你没有回应,再问一下
    #include
    int main(int argc, char **argv)
    {
    const int a = 10;
    int *b = &a;
    printf(“%p:%d %p:%d\n”, &a, a, b, *b);
    *b = 5;
    printf(“%p:%d %p:%d\n”, &a, a, b, *b);
    return 0;
    }
    能不能解释一下,用clang编译为什么会有这种结果

    因为看书少而且不求甚解,请自行寻找const的意义

  18. @曹昊 如果你真的想写的话应该在第五行定义b指针的时候 这样 const int *b=&a
    这样编译器就能发现错误了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注