与 C++ 相比,Vala 是一种理智的解析语言吗?

Posted

技术标签:

【中文标题】与 C++ 相比,Vala 是一种理智的解析语言吗?【英文标题】:Is Vala a sane language to parse, compared to C++? 【发布时间】:2011-05-16 11:11:30 【问题描述】:

解析 C++ 的问题是众所周知的。它不能纯粹基于语法来解析,它不能作为 LALR 来完成(不管这个词是什么,我不是语言理论家),语言规范是无数页等等。出于这个原因和其他原因,我'正在为我的个人项目决定另一种语言。

Vala 看起来是一门很好的语言。尽管提供了对 C++ 的许多改进,但解析起来是否同样麻烦?或者它是否有一个简洁、合理长度的形式语法,或一些逻辑描述,适合为编译器、源分析器和其他工具构建解析器?

无论答案如何,这是否适用于 Genie 替代语法?

(我也想知道 D 和其他后 C++ 非 VM 语言,尽管不那么强烈。)

【问题讨论】:

功能是为项目选择某种特定语言的一个很好的理由,但是这种语言的解析难度有什么关系呢? (除非您的个人项目正在为所述语言编写编译器)。需要注意的是,C++ 不像 Java 和 C# 那样是 LR(1) 语法,并且可能涉及无限前瞻。 解析很简单。想要构建编程工具的人似乎将注意力集中在解析为 the 问题上。它只是众多问题中的一个,实际上它是最简单的,因为它解决得很好。更难的部分是获取语言语义并用它们做一些事情。我将此描述为“攀登珠穆朗玛峰”问题;解析将您带到山脚下,这一步很容易。从山麓到山顶需要全新的技术、工程和汗水(请参阅我的简历了解可能的样子)。 解析C++其实是不可判定的***.com/questions/794015/… 对于那些想知道为什么解析能力可能很重要的人,您可能会喜欢 Daniel Friedman 的“编程语言研究在程序员教育中的作用”(参见 cs.indiana.edu/~dfried)。跨度> @jleedev:你似乎在施放 FUD。提到的 SO 文章比您的简短评论中暗示的内容更细微。作为一个实际问题,解析 C++ 是可判定的,否则程序员将停止使用C++ 编译器。本地歧义与模板的混淆不是问题。使用标准解析器技术可以轻松解决某些短语的局部歧义(我在解析器中使用 GLR,效果很好)。计算暂停谓词的模板是不同的,但实际上没有人编写这些,并且编译器对模板处理设置了有限的限制。 【参考方案1】:

C++ 是最复杂(如果不是 最复杂)的编程语言,在常用的解析中是最复杂的。特别困难的是它的名称查找规则和模板实例化规则。使用 LALR(1) 解析器(例如 Bison 和 Yacc 生成的解析器)无法解析 C++,但它绝对是可解析的(毕竟,人们每天都使用解析 C++ 没有问题的解析器)。 (事实上,早期版本的 G++ 是建立在 Bison 的广义 LR 解析器框架之上的实际上不是,请参阅 cmets)在最近被手写递归下降解析器取代之前)

另一方面,我不确定我看到 Vala 对 C++ 提供了哪些“改进”。这些语言试图实现相同的目标。另一方面,您可能不会在使用 Vala 接口编写的 GTK+ 之外找到很多东西。您将使用 C 接口来处理其他所有内容,这确实违背了使用这种语言的意义。

如果您因为 C++ 的复杂性而不喜欢 C++,那么考虑使用 Objective-C 可能是个好主意,因为它是 C 的简单扩展(如 Vala),但拥有更大的程序员社区鉴于它是 Mac 领域一切的基础,供您参考。

最后,我不明白为什么解析语言本身的困难与程序员为了使用该语言应该关心什么有关。只是我的 2 美分。

【讨论】:

+1 对于最后一部分,可解析性甚至不应该成为普通开发人员关心的问题。 我怀疑 g++ 是否基于 Bison 的通用 LR 解析器基础结构:该基础结构已在 2002 年的 1.5 版中添加。AFAIK,3.4 之前的解析器是基于 LALR 的,或多或少有干净的黑客攻击让它处理 C++。 @AProgrammer:恐怕我不明白。使用 LALR 根本无法解析 C++。一个“黑客”如何支持这一点? 早期版本的 GCC 使用 Bison 作为纯 LALR(1) 解析器来解析 C++,其中一些非常糟糕的 hack 涉及符号表和类型信息来解决歧义. (有关其工作原理的更多详细信息,请参阅我的回答 ***.com/questions/243383/…)。较新的版本使用手写的递归下降......我认为相同的基本技巧可以避免前瞻。 就“糟糕的解析语言”而言,很多人都得到了我的投票:php 的定义很差;大型机 自然到处都有关键字,有时可以是标识符,有时不是;如果您想发疯,请尝试解析任何动态 html,其中人们将 javascript 片段与 HTML 块和客户端代码混合在一起,这些代码使用某些第 3 语言(C#、JSP 等)生成 JavaScript 片段。 (如果你想分析一个 HTML 页面,你需要做这样的事情。【参考方案2】:

这很简单。您可以使用 libval​​a 进行解析、语义分析和代码生成,而不是自己编写。

【讨论】:

以上是关于与 C++ 相比,Vala 是一种理智的解析语言吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 的替代语法,Vala 的精灵?

Vala(类 C# 语言)编译成 C?

C语言和ARDUINO语言一样吗

我可以在 Vala 为 iPhone 编码吗?

C++ 是一种递归可枚举的语言吗?

与使用堆栈相比,递归通常被认为是一种过时的遍历方法吗?