Compiler construction 编译器如何管理内存占用?

Compiler construction 编译器如何管理内存占用?,compiler-construction,theory,Compiler Construction,Theory,编译器能够编译大量的源代码。这段巨大的代码在编译阶段用AST翻译。 我想如果代码庞大,这个AST也会变得庞大 通过构建AST并将其保存在内存中,我们是否可以假设编译器永远不会耗尽现代计算机上的内存?的确,编译器的内存需求通常会随着输入大小的增加而增加 编译器与任何其他内存需求取决于输入大小的程序没有什么不同:您只需假设有足够的内存,否则就会优雅地死去 听起来太容易了?嗯,你不能和数学对抗。如果一个人真的需要这种记忆,那么要么就足够了,要么就是你运气不好。就这么简单。有了虚拟内存,编译器/链接器工

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


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

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

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


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

有了虚拟内存,编译器/链接器工具实际上不必太担心内存占用

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

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


[我们有自己的编译器,经常用来编译几百万行的单片程序。该编译器通常需要几百兆的VM来处理该程序。这是大多数现代PC很容易提供的。]

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