编译器如何管理它们的内存占用?
How do compilers manage their memory footprint?
编译器能够编译大量的源代码。这个巨大的代码在编译阶段被翻译成 AST。
我想如果代码很大,这个 AST 也会变得很大。
我们能否假设编译器永远不会 运行 通过构建 AST 并将其保存在内存中而使现代计算机内存不足?
的确,编译器的内存需求通常随着输入大小的增加而增长。
编译器与内存需求取决于输入大小的任何其他程序没有什么不同:您只需假设有足够的空间,否则就优雅地死去。
听起来太简单了?好吧,你不能与数学作斗争。如果一个人真的需要那个记忆,要么足够了,要么你运气不好。就这么简单。
使用虚拟内存,compiler/linker 工具实际上不必太担心内存占用问题。
该工具请求它需要的东西,而 OS 要么在进程地址 space 中提供足够的虚拟内存,要么 [对特定机器的策略决定] OS 拒绝该工具请求在某个时候增加 space,并且该过程出现错误并通常退出。
当然,您的系统可能有巨大的 VM 限制并且没有足够的物理内存来支持它。然后该工具将翻页直到成功或操作员厌恶地停止它。
[我们有自己的编译器,经常用来编译几百万行的单体程序。该编译器通常需要数百兆字节的 VM 来处理该程序。大多数现代 PC 都可以轻松提供此功能。]
编译器能够编译大量的源代码。这个巨大的代码在编译阶段被翻译成 AST。 我想如果代码很大,这个 AST 也会变得很大。
我们能否假设编译器永远不会 运行 通过构建 AST 并将其保存在内存中而使现代计算机内存不足?
的确,编译器的内存需求通常随着输入大小的增加而增长。
编译器与内存需求取决于输入大小的任何其他程序没有什么不同:您只需假设有足够的空间,否则就优雅地死去。
听起来太简单了?好吧,你不能与数学作斗争。如果一个人真的需要那个记忆,要么足够了,要么你运气不好。就这么简单。
使用虚拟内存,compiler/linker 工具实际上不必太担心内存占用问题。
该工具请求它需要的东西,而 OS 要么在进程地址 space 中提供足够的虚拟内存,要么 [对特定机器的策略决定] OS 拒绝该工具请求在某个时候增加 space,并且该过程出现错误并通常退出。
当然,您的系统可能有巨大的 VM 限制并且没有足够的物理内存来支持它。然后该工具将翻页直到成功或操作员厌恶地停止它。
[我们有自己的编译器,经常用来编译几百万行的单体程序。该编译器通常需要数百兆字节的 VM 来处理该程序。大多数现代 PC 都可以轻松提供此功能。]