GCC技术细节

时间:2012-04-29 13:50:34

标签: gcc

我不知道这是否适合这样的事情,但我很好奇GCC前端/后端架构的几个方面:

  1. 我知道我可以从C代码编译.o文件并将它们链接到C ++代码,我想我也可以反过来这样做。这是否有效,因为两种语言相似,或者因为GCC后端真的与语言无关?这也适用于ADA代码吗? (我甚至不知道这是否有意义,因为我不知道ADA或者它是否具有“功能”,但问题是理解的。如果没有意义,请考虑“Pascal”甚至“我自己的习惯”语言前端“)
  2. 垃圾收集在哪里实施?例如,Java前端。我理解的方式,如果编译到JVM后端,“平台”将负责GC,因此前端不需要做任何事情,但如果编译为本机代码,前端会是将垃圾收集GENERIC代码发送到后端,还是打开一些标志告诉后端产生垃圾收集代码?第一个对我来说更有意义,但这意味着前端会根据目标产生不同的输出,这似乎忽略了GCC的前端/后端架构。
  3. 语言特定的图书馆会去哪里?例如,标准Java类或标准C头。如果它们最后被链接在一起,那么C程序理论上是否可以从Java库中调用函数或类似的东西,因为它只是另一个链接库?

2 个答案:

答案 0 :(得分:1)

  1. 是的,后端至少与语言无关。是的,它适用于Ada
  2. GCJ生成使用运行时库的本机代码。垃圾收集器是运行时库的一部分。
  3. GCJ实现了CNI,它允许你用C ++编写可以被Java代码用作本机方法的代码 - 但能够做到这一点是他们设计它的结果,而不仅仅是使用相同后端的意外副产品。

答案 1 :(得分:0)

  1. 因为调用约定是兼容的,但名称修改是不同的(C中没有修改)。要从C ++调用C函数,您应该使用extern "C"声明它。要从C调用C ++函数,您应该使用错位名称声明它(并且可以使用其他类型的args)。在某些情况下调用Fortran代码也是可能的,但参数传递约定是不同的(在Fortran中通过ref传递)。 实际上有一个从C ++到C(cfront)和从fortran到c(f2c)的转换器,仍然使用它们的一些解决方案。

  2. 垃圾收集在运行时库中实现,例如贝姆。后端应生成与所选GC库兼容的对象。

  3. 编译器驱动程序(g ++,gfortran,..)将为链接步骤添加特定于语言的库。