6

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

4

1 回答 1

5

我有经验/负责构建数十种语言前端

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

定义这两种语言的人要么几十年来一直在修饰它们(例如,自 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讨论当您有“部分程序”时出了什么问题,这基本上是您在语法错误修复猜测修复时得到的。

于 2012-05-22T17:23:18.620 回答