2016-11-17 109 views
0

我想知道从Java代码到字节码的详细编译过程,比如一行Java代码如何转换为字节码,所以我想在Java编译器源代码中设置断点,但我不知道如何做到这一点,有没有任何参考或步骤?如何调试Java编译器源代码(Javac)本身?

顺便说一句, 我不问如何使用Java debuger(显然我知道如何使用它),我的意思是如何调试Java编译器源代码而不是Java源代码。

+0

[编译器构建](https://en.wikipedia.org/wiki/Compiler)是一个通常在大学等学习的高级主题。如果您不知道从哪里开始,那么您可能缺少大部分所需的基础知识在这个项目上取得成功。由于编译器是用C++编写的,所以不能只是“放置一个断点”,看看会发生什么。 – Kayaman

+1

@Kayaman:我不知道写了什么JavaC,但是无论写什么语言都有一个调试器,并且你可以设置一个断点。我已经在自己的编译器中完成了无数次。这不是调试它们的唯一技术。 –

+0

@IraBaxter呃,我错了。 Javac确实是用Java编写的,而不是C++(如JVM)。所以这个问题是编译器的一半构造,以及如何使用调试器。我知道其他语言有调试器。如果起点太低,我不相信这很重要。 – Kayaman

回答

2

有关编译器如何工作的问题太宽泛,无法在此处回答。去阅读一个标准的编译器教科书。

关于调试编译:

我倾向于在编译器(自诊断)和专注于不同语言的小目标语言的测试程序的大套房大量使用断言功能,自我验证其正确运行。 (我的最后一个编译器有大约10年的这些测试程序的大约一千个,以及编译和运行它们的脚本)。通常,断言或测试失败会在编译器出错的地方向我提示,仅仅是检查发现错误。

我经常添加特殊代码来转储有关编译器状态和可以使用特殊未公开的命令行开关启用的活动跟踪的关键信息。这些特殊转储指示编译器误入歧途的位置,并且再次经常启用代码检查来识别错误的位置。

如果没有,我使用调试器来编写我编写的语言。

我不认为这些技术特别特别。当尝试处理任何大型复杂的应用程序时,它们非常有用。

+0

我没有问过编译器是如何工作的,我问过如何在Java编译器本身设置断点(假设我们在编译Java源代码时有Java编译器的源代码) –

+0

@Hermas:很有趣,你*我想知道从Java代码到字节码*的编译过程。大多数人会将其解释为“你想知道编译器是如何工作的”。如果那不是你的问题,你没有很好地表达。如果你想知道如何在JavaC中“设置断点”,我建议你得到一个Java开发工具,并了解它的调试器如何设置断点。为什么这不明显? –

+0

我明显知道如何设置IDE中的Java代码的断点,如eclipse或idea,但是如何设置JavaC的断点?这意味着您首先需要将带有源代码的JavaC导入IDE,然后将源代码设置为默认调试器的JavaC,但是如何执行这两个步骤? –