【问题标题】:What is the maximum size of code the compiler can process?编译器可以处理的最大代码大小是多少?
【发布时间】:2015-10-01 09:22:17
【问题描述】:

编译器可以接受和处理的行数/代码大小/等是否有(甚至是不现实的)限制?我在文档中找不到任何关于此的内容。

我们可以说处理一个文件的长度/大小的能力仅受硬件限制吗?

【问题讨论】:

  • 我们的软件,一个exe,就有超过300万行代码,但是代码行数在Delphi中是一个非常模糊的主题。我记得看到一个非常简单的控制台应用程序,去掉所有不必要的代码,似乎添加了一个额外的不可见代码行,这也发生在所有其他单元上。您还必须考虑 Delphi / Pascal 不是特定于行的 - 您可以将 10 行代码压缩为 1 行。
  • 旧版本的 Delphi 限制为 65536 LOC/unit,afaik。现代版本没有,但在某些时候你可能会发现编译一个过大的单元(比任何合理的数量级大)所需的内存量可能会开始严重影响你的编译时间。一个单元中的一百万个 LOC 比分布在多个单元中的一百万个 LOC 更费力。如果您将各个单元保持在合理的大小,那么实际上并没有超出硬件限制的实际限制。
  • 另外,为了好玩,这个总是让我发笑...stackoverflow.com/q/19082534/327083
  • AFAIK,由于文件变得太大而无法以纯文本形式保存时,可以自动将其保存为二进制文件,因此限制与硬件有关。我想这也与允许编译器分配多少内存有很大关系。如果我记得,Delphi 10 Seattle 的一个特点是它可以处理的内存量增加了一倍。

标签: delphi delphi-10-seattle


【解决方案1】:

不,单个单元可以拥有的行数没有限制。
显然,因为 Delphi 是一个 32 位程序,所以在任何分配中都不能超过 2GB。

但是:

1 IDE 和编译速度
如果您在 Delphi 中打开一个单元,IDE 将解析该单元,这将使 IDE 变慢。
将大型项目拆分为多个(大部分)独立单元并让编译器编译这些单元更有意义。
每个单元将创建一个.DCU 文件,链接器可以使用该文件来组合最终的 exe。

如果一个单元与 dcu 匹配,那么 Delphi 将不会重新编译该单元,而只是将 dcu 文件传递​​给链接器。
这导致编译速度更快。

即使是一个单元中的单个编辑也会导致该单元的完全重新编译。
在您假设的巨大单位中,这将需要很长时间。
在您可能拥有的任何 SVN 系统上,它也轻得多。

2 个编译器错误
事故和错误发生。有时编译器会因为错误而无法识别其他正常的代码。
在您百万以上的线单元中,这会很复杂,如果您有较小的单元,则更容易调试。
我想编译器也更容易不触发更小的单元的错误条件。

3 理智
更小的单位更容易维护项目。
如果您将共享功能关系的代码放在一个单元中,则逻辑变得更容易理解。
如果您有较小的单元,则可以更轻松地在另一个项目中重用这些单元中的代码。

【讨论】:

  • 我确定有限制。例如,宇宙中的原子数将提供一个上限。我确信可以找到更小的上限。我怀疑您的意思是说没有应用明确的限制。但是,你怎么知道是这样的呢?有记录吗?
  • 我在呼应宏坎图,据他说没有固定的限制。
  • “在任何分配中不能超过 2GB”是什么意思? 32 位地址空间大小为 4GB。为什么单一分配是相关的?您不需要将源文件保存在连续的内存中。编译一个不适合内存的程序是完全可能的。在过去,所有编译器都这样做。我想我得到的很多东西似乎有点像你在编造一些东西。如果没有明确引用官方文件或声明,也不是 Embarcadero 工程师,你怎么能做出这些声明?
  • @DavidHeffernan 在 Delphi 10 Seattle 之前,IDE 基本上限制为 2 GB 内存,因为旧版本的 IDE 不像 Delphi 10 Seattle 现在那样使用large memory address model。您还必须意识到 Delphi IDE 需要在内存中包含大部分源代码才能使其某些功能正常工作。其中两个最知名的功能是代码洞察力和错误洞察力。 ...
  • ... 在RAD Studio 10 Seattle Deep Dive Session 中,一位演示者提到了最新的Delphi 应该能够处理的大致行数,但我不记得是什么了。您可以通过观看此处提供的回放找到这一点:community.embarcadero.com/blogs/entry/…
猜你喜欢
  • 2013-01-14
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
相关资源
最近更新 更多