如果C#源文件的令牌超过40亿,会发生什么?

时间:2014-12-20 23:49:45

标签: c# language-lawyer roslyn

Roslyn overview说:

  

跨度

     

每个节点,令牌或琐事都知道它在源文本中的位置   以及它所包含的字符数。文字位置是   表示为32位整数,这是一个从零开始的Unicode   人物指数。 TextSpan对象是起始位置和a   字符数,均表示为整数。如果TextSpan有   零长度,指的是两个字符之间的位置。

那么如果您尝试编译具有超过40亿个令牌的有效C#源文件会发生什么? C#标准是否说明了单个C#源文件的最大文件大小或最大标记号?

2 个答案:

答案 0 :(得分:4)

  

那么如果您尝试编译一个包含超过40亿个令牌的有效C#源文件会发生什么?

它会失败。你的限制实际上小于那个,因为即使整数是无符号的,实际上大多数标记也会大于一个字符,并且许多标记需要它们之间的空格分隔。因为这样的字符索引不足以满足其中的一小部分,除非C#代码类似于a+a+a+a+a+a…

  

C#标准是否说明了单个C#源文件的最大文件大小或最大令牌数?

没有。编译单元(源文件)在9.1节中介绍,但没有提到大小限制。

这就是Roslyn无法满足规范所涵盖的所有可能情况的方式。

软件虽然在设计时考虑了特定用例。其中许多包括在现实世界中可行的#34;作为一个隐含的案例。

如果你写了一些大于你疯狂的东西。当你完成时比你开始时至少长7岁(假设不断地以最高的竞争级别打字速度打字,不用睡觉,食物或浴室休息)。如果您以编程方式生成了这么多代码,那么您几乎肯定没有采用最佳方法;编译程序的大小是多少?

如果真的需要编译这样的程序,那么定制编译器可能会出于其他原因而出现。

答案 1 :(得分:0)

我不能说我曾经尝试这个,但简单的答案可能是“它会引发溢出异常。”

我认为C#规范没有说明任何内容,因为这是实现的限制(尽管非常实用),而不是语言。 C#对于拥有数十亿和数万亿令牌没有任何问题,这将属于编译器的范围。我不知道它是否在其他任何地方都有记录,因为它是如此不重要,但很可能编译器确实具有最大文件大小。否则 - 我说这是一个对它如何实际解析文档知之甚少的人 - 它在运行时很容易耗尽内存。

但正如人们在评论中所说,如果这对你来说成了问题,那么你会遇到更大问题。他们编写的编译器非常好,所以如果你的代码太大而无法解析,那可能就是你的错。我当然明白,这只是你的一个理论问题,我尊重这一点,但我怀疑那里有很多很棒的答案。

另一方面,如果您动态构建源代码,那可能会成为一个问题。但同样,如果你将这么多字符放在一个文档中,那不是编译器的问题,而且它可能表明存在更大的问题。