为什么以及如何使用Python或Java等语言能够显示精确且易于理解的错误消息,而真实且经过测试的长期C / C ++编译器显示出含糊不清且通常无关的错误消息?
答案 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 ++等旧语言来说非常困难)。例如。更严格的约束可以最大限度地减少潜在的错误类型数量,从而简化精确的错误检测。