解析c++的语法结构是否比其他语言更难?
Is it more difficult to parse the syntactic structure of C++ than other languages?
我观察到,几乎在所有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++不提供这个功能。
- Java 和其他语言在生成子序列时的输出差异
- 与其他语言相比的 Ruby 和指针
- 其他语言的Qt键盘输入
- 我需要知道什么才能开始用c++/其他语言编程合成器
- 从其他编程语言调用 c++ dll 类函数
- 实时在语言之间流水线传输或以其他方式传输数据
- 动态C++与其他语言的比较 - 在不知道类型的情况下无法在对象上调用方法
- 用java编写源代码,并将其编译为其他语言的各种可执行文件?多重编译
- 如何使C枚举类型可用于其他语言
- 使用大多数Java代码制作可执行文件,但可能添加了其他语言
- 用Cpp或其他快速语言反转大型哈希表
- 如何用其他语言编写带有绑定的Qt插件系统
- 为什么在C语言的标题中使用"#"符号?为什么不是任何其他符号?
- 库在C/C++和其他语言中重现Java原语hashCode逻辑
- WebAPI2 Async .是与所有其他语言兼容的
- 从 bash 拆分的流是否可以转置为其他语言
- 更改其他应用程序的输入语言
- 用PHP或任何其他语言上传巨大的文件
- 如何在Ruby和其他语言之间共享文本文件(或互斥/信号量)
- 通过Win7上的C++与其他英语操作系统语言进行SOCKET通信