Compiler construction 最大方法名长度

Compiler construction 最大方法名长度,compiler-construction,programming-languages,specifications,name-length,Compiler Construction,Programming Languages,Specifications,Name Length,有没有人知道您选择的编程语言中方法名的最大长度是多少?我本想把这个问题变成一个C#特定的问题,但我想如果能了解整个范围,那就太好了 涉及哪些因素: 语言规范对此有限制吗 编译器将其限制为什么? 32位机器和64位机器上有什么不同吗 对于C,我不认为有明确的硬限制。(例如,C#5规范的第2.4.2节没有给出限制。)Roslyn v2.2.0.61624似乎有1024个字符的限制;这远远超出了可读性的范围,甚至超出了机器生成的合理名称的范围 对于Java,声明: 标识符的长度是无限的 Java

有没有人知道您选择的编程语言中方法名的最大长度是多少?我本想把这个问题变成一个C#特定的问题,但我想如果能了解整个范围,那就太好了

涉及哪些因素:

  • 语言规范对此有限制吗
  • 编译器将其限制为什么?
    • 32位机器和64位机器上有什么不同吗
对于C,我不认为有明确的硬限制。(例如,C#5规范的第2.4.2节没有给出限制。)Roslyn v2.2.0.61624似乎有1024个字符的限制;这远远超出了可读性的范围,甚至超出了机器生成的合理名称的范围

对于Java,声明:

标识符的长度是无限的 Java字母序列和Java 数字,其中第一个数字必须是 Java字母


PHP似乎只受到脚本内存限制的限制

使用128Mb,我能够创建一个包含400万个字符的类(和方法)

<?php
ini_set('memory_limit', '128M');
$i = 1024 * 1024;

while ($i < 10000000)
{
    $className = str_repeat('i', $i);
    eval("class $className { public function $className() { echo '$i<br>'; } }");
    new $className();
    $i *= 2;
}

?>

公共Lisp符号的名称是字符串;字符串的长度限制为
数组维度限制

array dimension limit
的值是一个正整数,它是数组中每个单独维度的独占上限。此界限取决于实现,但不会小于1024。(鼓励实施者在不牺牲性能的情况下,将此限制尽可能大。)

实际上,这可能相当大

Welcome to Clozure Common Lisp Version 1.3-dev-r11583M-trunk  (DarwinX8664)!
? array-dimension-limit
72057594037927936
? 

Welcome to Clozure Common Lisp Version 1.3-dev-r11583M-trunk  (DarwinX8632)!
? array-dimension-limit
16777216
? 

这个答案忽略了方法名的包名;这可能会使长度增加一倍。

在D中,我不知道会是这种情况,但我怀疑这是某种疯狂的东西,比如>100MB。这可能是一件记忆犹新的事情。这是因为我和其他人知道,符号名的对象文件格式限制约为11kB,并且这一限制已被修复。

在Java中,我相信没有给出长度限制:

变量名区分大小写。一个变量的名称可以是任何合法的标识符-一个无限长的Unicode字母和数字序列,以字母开头

像上面的其他人一样,我猜长度取决于可用内存。

在C#中是511个字符长度。

微软的C#实现是511,VB.NET实现是1023

Visual Studio将只为标识符的前511个字符(对于VB为1023)上色,其余字符保持黑色。

我刚刚在C#Visual Studio 2010(x64)中做了一个测试:制作了一个标识符:

int a123456789a123...;
重复着。在512个字符处,VS给了我一个错误“标识符太长”。不过511还可以。(已选中Word中的字符计数。)

另一个例子:

int whyintheworldwouldyoueverhaveanidenfifierthislongitsreallyjustquiteridiculousimeancmonyoucouldatleasthavethecommoncourtesyofmakingitcamelcasesoitsnotsohardtoreadcmonjuststopnowyourereallyreachingtomakethisaslongaspossiblearentyou123412341234alrightwellthatsenoughnowisntitwelliguessnotbecauseimstillgoingthisisofficallytheworstidentifiereverಠ_ಠokaynowthatithasunicodeitsofficialbutseriouslythisthingissolongthatihadtogetupinthemiddleofittotakeabreakbeforesittingdowntofinishtoppingitofftothemaxcharlimitof___511;

正在进行(OpenEdge)限制为32个字符。

我很想知道你为什么需要这个LOL的答案,主要是好奇。我和一位同事正在编写一些单元测试方法,其中一种方法非常详细(在任何限制下都可以),但我们对允许的最大长度很感兴趣。好吧,只是检查一下,我想是这样的。我唯一一次遇到类似的情况是VC6中关于调试版本的愚蠢警告消息,这些版本包含STL-符号名称超过256个字符或其他一些字符,因此它们会被截断。@Tim:我每天都会遇到成千上万的警告…我有一个项目,在那里我看到了带有损坏符号的错误消息名称的长度足以刷新5000行回滚缓冲区。但这是Uber模板元的东西。IDE可能会对行施加一些限制,但C#规范没有施加任何限制。编译器,而不是IDE。IDE只会给名字的前511个字符上色,其余的字符保持黑色。你的答案似乎与Kirill Osenkov和DLeh对511的答案相矛盾。如果你能为你的C#声明提供一个参考,那就太好了,因为我相信你在这里错了…@SerjSagan:我刚刚试过,它大于511,尽管有一个限制。我想说的是,它仍然超出了可读性和合理的机器生成名称的界限。我将在这个时间点用精确的限制进行编辑…你的答案似乎与约翰·斯基特的答案相矛盾。如果你能为你的511号C#索赔提供参考,那就太好了