-1

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

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

2 回答 2

1
  1. 是的,后端至少合理地独立于语言。是的,它适用于Ada
  2. GCJ生成使用运行时库的本机代码。垃圾收集器是运行时库的一部分。
  3. GCJ 实现了CNI,它允许你用 C++ 编写代码,这些代码可以被 Java 代码用作本机方法——但能够做到这一点是他们设计它的结果,而不仅仅是使用相同的意外副产品后端。
于 2012-04-29T14:09:59.413 回答
0
  1. 这是可能的,因为调用约定是兼容的,但是名称修改不同(C 中没有修改)。要从 C++ 调用 C 函数,您应该使用extern "C". 并且要从 C 调用 C++ 函数,您应该使用重命名的名称声明它(并且可能使用其他或不同的类型 args)。在某些情况下也可以调用 Fortran 代码,但参数传递约定不同(在 Fortran 中通过 ref 传递)。实际上有一个从 C++ 到 C (cfront) 和从 fortran 到 c (f2c) 的转换器,并且仍然使用它们的一些解决方案。

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

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

于 2012-04-29T14:14:28.070 回答