【问题标题】:Complexity of IDE error detection and auto-completion dependent upon language syntax?IDE 错误检测和自动完成的复杂性取决于语言语法?
【发布时间】:2012-05-28 23:32:13
【问题描述】:

为主要由人类可读的短语和单词组成的编程语言(例如 Python、VB.NET)提供开发环境错误反馈和自动完成所需的检查/不太严格的代码分析是否需要更少?这与 C 风格的语言形成对比,后者更多地依赖于符号和标点符号的代码结构。

【问题讨论】:

  • 在定义“容易”之前,请先定义“详细”和“简洁”。
  • @Close Voters:这个问题不是关于 VB 是否比 C# 更好。
  • 我的猜测是,这与冗长无关;相反,这是因为 C# 允许更多的东西,因此解析器有更多的方式来解释一行代码。
  • 解析语言最难的部分不是解析,而是从语法错误中恢复并继续产生有意义的错误。特别是块结构的错误很难处理。说一个方法体缺少一个结束括号。所以是的,对块语法更加口头的语言有助于编译器产生更好的错误。
  • 我做了最后的修改,以获得对这个问题的彻底、无争议的答案。如果它足够具体,现在可以重新打开,我将不胜感激。

标签: static-analysis pre-compilation


【解决方案1】:

我有经验/我负责构建dozens of language front ends

冗长的语言与标点符号的语言通常同样难以解析和静态分析。

定义这两种语言的人要么已经装饰它们几十年(例如,自 1958 年以来的 COBOL),要么构建具有复杂语法、复杂名称解析和类型推断规则的复杂语言(C++、Scala、Ruby);然后编译器供应商继续添加晦涩的语法以支持他们所做的奇怪事情或提供客户锁定(例如,MS“托管 C++”、DLL 声明等)。第三个问题是糟糕的定义;顶级语言可能对它们的工作方式有精确的规则,但许多语言都有草率的定义(例如 PHP),这会产生黑暗的极端情况,必须通过对实际实现的痛苦实验来解决。

C++ 是我们最糟糕的,尤其是。 C++11 委员会最近把事情搞得一团糟。我们拥有完整的 C++ 解析器,但仍在 C++98 实现之上为 C++11 进行全名解析。 (名称解析代码大约有 250,000 行代码,还不够!)。

IBM COBOL 紧随其后;该语言非常庞大,并且有各种有趣的名称解析规则(“如果引用明确,则不合格的名称可以无条件地引用特定名称”那么,在这种情况下,这个名称是明确的引用吗?)。

一旦您通过了解析和名称/类型解析,您就会进入控制流、数据流、指向分析、范围分析、调用图构建……这些工作量通常与早期阶段;拥有支持这些任务的真正优秀的库,我们可以少花钱。

将所有这些作为背景分析,您可以开始进行人们想要的智能类型的“静态分析”。

另一位发帖人指出,从语法错误中恢复并(强调)“继续生成有意义的错误消息”。对此我只能说“阿门,兄弟”。请参阅这个 SO 答案 https://stackoverflow.com/a/6657974/120163 讨论当您有“部分程序”时会出现什么问题,这基本上是您在语法错误修复猜测修复时得到的。

【讨论】:

  • 这是我一直在寻找的答案。我只能说感谢您所做的一切,这听起来确实令人生畏。
  • 恭维,谢谢。有几天我为这个特殊的职业选择感到后悔:-}
猜你喜欢
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2018-07-13
  • 2019-05-19
  • 2016-06-04
  • 2011-03-29
相关资源
最近更新 更多