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

时间:2012-07-21 14:57:10

标签: compiler-construction programming-languages compiler-errors

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

3 个答案:

答案 0 :(得分:5)

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

来自旧C编译器的错误消息非常糟糕,以至于有关于它们的笑话;这来自 Unix Haters'Handbook 的第2章:

  

肯·汤普森有一辆他帮助设计的汽车。不像   大多数汽车,既没有速度表,也没有汽油表,也没有   任何困扰现代的其他众多白痴灯   驱动程序。相反,如果司机犯了错误,一个巨大的“?”会亮起来   仪表板的中心。 “经验丰富的司机,”汤普森说,   “通常会知道什么是错的。”

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

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

答案 1 :(得分:1)

编译时间错误

由于条件编译(预处理器,宏)以及非常强大的模板(比例如C#或Java更通用),编译时错误通常是神秘的。

然而,这完全取决于编译器,例如较新的CLang声称更易读的错误信息。

在我看来,开发是顺序的,错误的行号通常就足够了(我真的不需要阅读错误信息)。

运行时错误

效果:C / C ++具有“零开销”目标,例如函数名被剥离,函数内联。并且许多错误是“未定义的行为”以允许更快的实现。它还允许你做任何事情 - 甚至是危险的操作 - 都不加制止。

不是真的:许多C ++编译器可以在异常时产生堆栈跟踪。

答案 2 :(得分:0)

我认为这可能是因为在编程风格/可能性/语法等方面应用了额外的限制(由于需要向后兼容性,这对C / C ++等旧语言来说非常困难)。例如。更严格的约束可以最大限度地减少潜在的错误类型数量,从而简化精确的错误检测。