除了 ANTLR,还有什么其他工具可以帮助我创建针对 JVM 的小型语言?
What other tools can help me create a small language targeting JVM, besides ANTLR?
(我几天前开始使用 ANTLR 进行语言冒险。我对语言理论和编译器构造的了解非常 有限。如果这不是一个有效的问题,请原谅。)
ANTLR 是一个 解析器 生成器,具体来说,是一个 ALL(*)
解析器。根据here,解析器是:
the part of a compiler that tries to make syntactic sense of the
source code.
据我所知,一个编译器应该由 5 个阶段组成:
- 词法分析
- 语法分析
- 语义分析
- IL 表示和优化
- 代码生成
所以 ANTLR 似乎只涵盖了 1 和 2。
因此,如果我想为一种以 JVM 上的 Java 字节代码为目标的教育型语言编写编译器。我可以在第 3-5 阶段利用哪些其他工具?
加 1
为什么 ANTLR 只涵盖了 1 和 2?我猜 4 和 5 被跳过了,因为它们对目标平台来说太具体了。但是为什么 3 被 ANTLR 跳过了?
关于 ADD1:
ANTLR 执行 1) 和 2),因为这是为它定义的目标。作者认为您很乐意从头开始编写任何编译器的 "rest"。
我同意,需要走得更远。有一个巨大的 Life After Parsing.
如果你想要一个处理不仅仅是解析的工具,你需要
目标相应更大的人。
更通用的 class 工具是 Program Transformation Systems (PTS)。这些工具允许你定义一个语法,而不是像 ANTLR,并将生成一个解析器,自动从该语言的源代码构建抽象语法树,提供修改这些 AST 的方法(通常 "source-to-source" 重写规则)并最终漂亮地打印修改 AST 以生成等效的源代码输出。
许多 PTS 一次仅限于 "one" 种语言;您可以转换该语言,这不适用于代码生成。他们通常允许进行黑客攻击,您可以在其中构建两种语言(源语言和目标语言)的联合语法,然后您可以修改源语言中的 AST 以生成目标语言中的 AST。这确实允许代码生成,但是联合语言特技造成了很多混乱。例如,如果您有一个“+”节点,它是源语言中的“+”节点还是目标语言中的“+”节点?你肯定不想翻译两次。
我们的 DMS Software Reengineering Toolkit 将同时处理多种(包括 "two")种语言。您可以从源语言转换为目标语言,并漂亮地打印结果。因为源“+”节点与目标“+”节点不同,所以不会混淆。
通常 PST 只做 AST 操作。您 可以 通过将 "rewrite" AST 的重写规则滥用为表示语义谓词结果的布尔值来实现任意语义分析。这很尴尬。
DMS 通过 属性语法 提供语义分析,这是使用语法规则作为指南根据 AST 计算定义任意分析的方法。您可以轻松地构建符号表、控制流图并以这种方式进行典型的类型检查。 DMS 还提供了跨控制流图进行数据流分析的方法。
使用各种语义分析,可以验证源程序是否有效,运行 依赖于在源程序中找到的信息 "far away" 的复杂转换,并提供优化转换"target" 语言。
如果将目标语言定义为 IL,则可以进行源到 IL 的转换和优化。
定义是 JVM 代码的 IL 并不是那么容易;毕竟,这是虚拟指令集的二进制表示。使用像 DMS 这样的 PTS,您将定义一种目标语言,它是 JVM 指令的表面语法(例如,JVM 转储会产生什么),生成它,然后 运行 一个相当琐碎的 post-将其转换为实际 JVM 二进制代码的处理步骤。使用 DMS,您可以将 post 处理步骤实现为 JVM 表面语法目标语言的 AST 上的属性语法计算。
[附注:DMS 可以通过 Java 前端获得。这包括用于解析和处理 JVM 二进制代码的额外支持机制。这可用于实现 post-process-to-JVM 二进制步骤。或者,您可以自己滚动]。
DMS 作为工具的设计目标是涵盖广泛的应用程序,包括语言翻译("compiling" 是一个特例)和程序分析。它比ANTLR相应的更宏大,更大,相应的更强大。
既然你似乎在磨练 ANTLR 我建议你购买一份
“Language Implementation Patterns - Create Your Own Domain-Specific and General Programming Languages”和
"The Definitive ANTLR 4 Reference" by Terrence Parr
What other tools can I leverage for stages 3-5?
Terrence Parr the creator of ANTLR also created String Template which can be used for AST transformations, but there are other tools that fill this niche. See: List of program transformation systems。请注意,Ira 已经在他的回答中注明了 DMS。
第三阶段,语义分析,可以使用ANTLR。请参见:ANTLR: How to replace specific nodes in a subtree using a Tree grammar? 示例。书中还讨论了其他进行语义分析的方法。
第 4-5 阶段阅读第 10 章,Building Bytecode Interpreters
。
对于初学者来说,这是一个很好的起点,但它只会让你开始。
或
对于第 4-5 阶段的快速搜索,我发现这个在快速阅读后很有意义,所以我会提到它,但不能保证。简而言之,第 4-5 阶段使用 Javac。由于博客托管在 Oracle 上,我认为只有 Oracle Javac 才能运行。
A quite interesting approach is to construct AST nodes representing
the structure of the java code, then generate byte code from that.
Actually, this is what the javac does.
Generating java byte code by building AST trees
Why ANTLR just covers as far as 1 and 2?
Because most ANTLR users don't build compilers, I decided to focus on
the other applications for ANTLR v4: parsing and extracting
information and then translations.
所以
对于第 1、2 和 3 阶段,您将使用 ANTLR,
对于 AST 转换,如有必要,您可以使用字符串模板和
对于第 4 和第 5 阶段,您可以使用 Javac。
这只是一个开始,您还有很长的路要走,需要做很多研究。我建议你一路上做大量的笔记。
(我几天前开始使用 ANTLR 进行语言冒险。我对语言理论和编译器构造的了解非常 有限。如果这不是一个有效的问题,请原谅。)
ANTLR 是一个 解析器 生成器,具体来说,是一个 ALL(*)
解析器。根据here,解析器是:
the part of a compiler that tries to make syntactic sense of the source code.
据我所知,一个编译器应该由 5 个阶段组成:
- 词法分析
- 语法分析
- 语义分析
- IL 表示和优化
- 代码生成
所以 ANTLR 似乎只涵盖了 1 和 2。
因此,如果我想为一种以 JVM 上的 Java 字节代码为目标的教育型语言编写编译器。我可以在第 3-5 阶段利用哪些其他工具?
加 1
为什么 ANTLR 只涵盖了 1 和 2?我猜 4 和 5 被跳过了,因为它们对目标平台来说太具体了。但是为什么 3 被 ANTLR 跳过了?
关于 ADD1:
ANTLR 执行 1) 和 2),因为这是为它定义的目标。作者认为您很乐意从头开始编写任何编译器的 "rest"。
我同意,需要走得更远。有一个巨大的 Life After Parsing.
如果你想要一个处理不仅仅是解析的工具,你需要 目标相应更大的人。
更通用的 class 工具是 Program Transformation Systems (PTS)。这些工具允许你定义一个语法,而不是像 ANTLR,并将生成一个解析器,自动从该语言的源代码构建抽象语法树,提供修改这些 AST 的方法(通常 "source-to-source" 重写规则)并最终漂亮地打印修改 AST 以生成等效的源代码输出。
许多 PTS 一次仅限于 "one" 种语言;您可以转换该语言,这不适用于代码生成。他们通常允许进行黑客攻击,您可以在其中构建两种语言(源语言和目标语言)的联合语法,然后您可以修改源语言中的 AST 以生成目标语言中的 AST。这确实允许代码生成,但是联合语言特技造成了很多混乱。例如,如果您有一个“+”节点,它是源语言中的“+”节点还是目标语言中的“+”节点?你肯定不想翻译两次。
我们的 DMS Software Reengineering Toolkit 将同时处理多种(包括 "two")种语言。您可以从源语言转换为目标语言,并漂亮地打印结果。因为源“+”节点与目标“+”节点不同,所以不会混淆。
通常 PST 只做 AST 操作。您 可以 通过将 "rewrite" AST 的重写规则滥用为表示语义谓词结果的布尔值来实现任意语义分析。这很尴尬。
DMS 通过 属性语法 提供语义分析,这是使用语法规则作为指南根据 AST 计算定义任意分析的方法。您可以轻松地构建符号表、控制流图并以这种方式进行典型的类型检查。 DMS 还提供了跨控制流图进行数据流分析的方法。
使用各种语义分析,可以验证源程序是否有效,运行 依赖于在源程序中找到的信息 "far away" 的复杂转换,并提供优化转换"target" 语言。
如果将目标语言定义为 IL,则可以进行源到 IL 的转换和优化。
定义是 JVM 代码的 IL 并不是那么容易;毕竟,这是虚拟指令集的二进制表示。使用像 DMS 这样的 PTS,您将定义一种目标语言,它是 JVM 指令的表面语法(例如,JVM 转储会产生什么),生成它,然后 运行 一个相当琐碎的 post-将其转换为实际 JVM 二进制代码的处理步骤。使用 DMS,您可以将 post 处理步骤实现为 JVM 表面语法目标语言的 AST 上的属性语法计算。
[附注:DMS 可以通过 Java 前端获得。这包括用于解析和处理 JVM 二进制代码的额外支持机制。这可用于实现 post-process-to-JVM 二进制步骤。或者,您可以自己滚动]。
DMS 作为工具的设计目标是涵盖广泛的应用程序,包括语言翻译("compiling" 是一个特例)和程序分析。它比ANTLR相应的更宏大,更大,相应的更强大。
既然你似乎在磨练 ANTLR 我建议你购买一份
“Language Implementation Patterns - Create Your Own Domain-Specific and General Programming Languages”和
"The Definitive ANTLR 4 Reference" by Terrence Parr
What other tools can I leverage for stages 3-5?
Terrence Parr the creator of ANTLR also created String Template which can be used for AST transformations, but there are other tools that fill this niche. See: List of program transformation systems。请注意,Ira 已经在他的回答中注明了 DMS。
第三阶段,语义分析,可以使用ANTLR。请参见:ANTLR: How to replace specific nodes in a subtree using a Tree grammar? 示例。书中还讨论了其他进行语义分析的方法。
第 4-5 阶段阅读第 10 章,Building Bytecode Interpreters
。
对于初学者来说,这是一个很好的起点,但它只会让你开始。
或
对于第 4-5 阶段的快速搜索,我发现这个在快速阅读后很有意义,所以我会提到它,但不能保证。简而言之,第 4-5 阶段使用 Javac。由于博客托管在 Oracle 上,我认为只有 Oracle Javac 才能运行。
A quite interesting approach is to construct AST nodes representing the structure of the java code, then generate byte code from that. Actually, this is what the javac does.
Generating java byte code by building AST trees
Why ANTLR just covers as far as 1 and 2?
Because most ANTLR users don't build compilers, I decided to focus on the other applications for ANTLR v4: parsing and extracting information and then translations.
所以
对于第 1、2 和 3 阶段,您将使用 ANTLR,
对于 AST 转换,如有必要,您可以使用字符串模板和
对于第 4 和第 5 阶段,您可以使用 Javac。
这只是一个开始,您还有很长的路要走,需要做很多研究。我建议你一路上做大量的笔记。