为什么较新的语言能够显示更好,更精确的错误消息?

The*_*One 2 compiler-construction programming-languages compiler-errors

为什么以及如何使用Python或Java等语言能够显示精确且易于理解的错误消息,而真实且经过测试的长期C/C++编译器显示出神秘且常常不相关的错误消息?

Nor*_*sey 5

这不是语言; 这是编译器的时代.自从20世纪70年代末Unix开始进入大学以来,C已成为事实上的标准.Microsoft Windows的市场渗透只强化了这一标准.因为C是标准,所以没有人必须编写一个很好的编译器来让人们使用它.并且在20世纪70年代和80年代,生成漂亮错误消息的机器花费了时间和空间,这被认为是宝贵的资源.即使错误消息很糟糕,人们也很乐意获得免费的C编译器.

来自旧C编译器的错误消息是如此糟糕,以至于有关于它们的笑话; 这是来自Unix Haters手册的第2章:

Ken Thompson有一辆他帮助设计的汽车.与大多数汽车不同,它既没有速度计,也没有气体计,也没有任何困扰现代驾驶员的其他众多白痴灯.相反,如果驾驶员犯了一个错误,一个巨大的"?"会在仪表板的中央亮起."经验丰富的司机,"汤普森说,"通常会知道什么是错的."

到了20世纪90年代,当新语言传播时,机器更快,内存更多,提供良好的错误信息是改善思想共享的一种方法.

如果你尝试一个相对年轻的C编译器,比如clang,你会发现它会产生出色的错误信息 - 有时甚至包括突出显示和颜色.(我打赌来自Visual Studio的错误消息也很好,但我不确定.)