【问题标题】:How do compilers manage their memory footprint? [closed]编译器如何管理它们的内存占用? [关闭]
【发布时间】:2016-09-25 21:30:41
【问题描述】:

编译器能够编译大量源代码。这个巨大的代码在编译阶段被翻译成 AST。 我想如果代码很大,这个 AST 也会变得很大。

我们可以假设编译器在现代计算机上通过构建 AST 并将其保存在内存中永远不会耗尽内存吗?

【问题讨论】:

  • 大多数源文件都很小。
  • 链接器不需要很多内存。编译器会这样做,但它们可以分成多个通道。
  • @melpomene 你会感到惊讶。我曾经有一个编译器(Watcom)打印编译的行数,.c 或 .cpp 文件通常为几百行,.h/.hpp 文件为数千行。
  • 现代计算机具有千兆字节的 RAM。即使源代码的每个字节生成一个单独的 AST 节点,开销超过 1000 字节(完全不现实),您仍然可以将数兆字节源文件的 AST 放入 RAM 中。您最后一次看到 1 MB 大的源文件是什么时候?我见过的最大的是来自 LLVM 的 X86ISelLowering.cpp:大约 1.2 MB 或 32000 行代码,加上 #includes 扩展到的任何内容,这是一个真正的极端示例。

标签: compiler-construction theory


【解决方案1】:

使用虚拟内存,编译器/链接器工具不必担心内存占用。

工具请求它需要的东西,操作系统要么在进程地址空间中提供足够的虚拟内存,要么 [特定机器的策略决策] 操作系统拒绝工具在某个时间点增加空间的请求,并且进程收到错误并通常退出。

当然,您的系统可能具有巨大的 VM 限制,并且没有足够的物理内存来支持它。然后该工具会一直翻页,直到它成功或操作员厌恶地停止它。

[我们有自己的编译器,我们经常使用它来编译几百万行的单片程序。该编译器通常需要数百兆字节的 VM 来处理该程序。大多数现代 PC 都可以轻松提供此功能。]

【讨论】:

    【解决方案2】:

    确实,编译器的内存需求通常会随着输入大小而增长。

    编译器与内存需求取决于输入大小的任何其他程序没有什么不同:您只需假设有足够的内存,否则就优雅地死掉。

    听起来太容易了?好吧,你不能与数学对抗。如果一个人真的需要那个记忆,要么足够了,要么你不走运。就这么简单。

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 1970-01-01
      • 2018-08-17
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      相关资源
      最近更新 更多