解析c++的语法结构是否比其他语言更难?

Is it more difficult to parse the syntactic structure of C++ than other languages?

本文关键字:语言 其他 c++ 语法结构 是否 解析      更新时间:2023-10-16

我观察到,几乎在所有ide中,Java和c#的代码补全都比c++的好。例如,在Netbeans中,Java的自动完成功能远远优于c++的自动完成功能,而在Visual Studio中,c#的自动完成功能远远优于Visual c++。

有大量的ide提供非常好的Java自动完成功能,但是对于c++来说却不是这样,尽管它是一种较老的语言。

解析c++是否更困难?如果是,为什么?

解析c++比较困难,因为语法是有状态的。要知道A * b;是指针声明还是乘法,取决于当前作用域中的标识符A是否指向类型或变量。

但这不仅仅是解析。自动补全需要语义分析、重载解析、模板展开、模板特化选择、constexpr函数求值(因为它们可以出现在模板参数列表中)……

基本上,为了确定任意c++表达式的类型并列出该类型的成员,除了机器代码生成之外,您需要所有非优化编译器。

上面的大多数步骤不适用于没有模板专门化的语言。

c++ FQA有大量关于这方面的信息(尽管它是以一种可以被描述为"非常非正式"的风格编写的)。

以下是它所涉及的一些因素:

AA BB(CC);对象定义或函数声明?事实证明,答案在很大程度上取决于语句之前的代码——"上下文"。这表明(在直观的层面上)c++语法是非常上下文敏感的。

那么让我们找到CC的定义然后继续,好吗?

没有办法知道CC是在哪些文件中定义的,或者必须解析哪些文件才能"理解"它的定义

所有这些都是在我们开始考虑图灵完备模板系统之前,它可以在编译时自动生成新代码。

Java和c#在这方面相对于c++的另一个优势是反射。一旦编译了Java类,就可以将其加载到JVM中(您知道它在哪个文件中,因为Java指定了这些内容),并使用标准接口查询它的方法等。c++不提供这个功能。