是否可以在没有外部程序的情况下用Java编译机器代码?

时间:2016-11-18 12:16:39

标签: java gcc assembly compiler-construction jvm

首先,这不是您的标准“我想将Java代码编译为机器代码”问题。

我正在研究用Java编写的编译器,它将某种语言(在我的情况下:Brainfuck)翻译成x86 Assembly,之后我正计划使用NASM和GCC来生成机器代码。

看到HotSpot JVM可以将Java字节码编译为机器代码,我假设有一些机制可用于将类型A的源代码编译为机器代码。

有没有办法在用Java编写的编译器中使用它?我的主要目标是探索用Java编写编译器的可能性,而不依赖于路径上可用的外部程序,例如GCC和NASM。我需要一个C编译器,因为我正在使用cstdlib链接,因为我在x86汇编代码中使用了这些函数。

澄清一下,我现在正在做以下事情:

  1. 将x86程序集写入bf.asm文件。
  2. 使用nasm -f win32 bf.asm将程序集转换为对象代码。
  3. 将对象代码与Windows操作系统和cstdlib库链接到gcc -o bf bf.obj
  4. 我正在寻找在第2步和第3步中替换使用nasmgcc的可能性,而不是使用Java代码。

2 个答案:

答案 0 :(得分:9)

  

看到HotSpot JVM可以将Java字节码编译为机器代码,我假设有一些机制可用于将类型A的源代码编译为机器代码。

这不符合。

JIT编译器将Java字节码编译为本机代码。除了Java字节码之外,它不了解任何其他内容。字节码不是“源代码”。 (它们实际上是一种机器代码形式......用于抽象计算机...... Java 虚拟机。)

简而言之,没有可用的机制作为JVM 的一部分,用于将源代码编译为机器代码。

事实证明,JIT编译器不是为在其他人可以使用的文件中生成本机代码而设计的。本机代码采用内存块中的原始机器指令的形式。没有符号表。没有搬迁信息。可能充满了对JVM其他部分的硬连线调用。基本上它设计用于在当前运行的JVM中执行,而不是用于其他任何操作。

  

有没有办法在用Java编写的编译器中使用它?

JIT编译器不适用于您的问题......除非您编写编译器以生成有效的Java字节码。如果你这样做,那么JVM可以运行你的代码,JIT编译器会在某些时候将你的字节码编译成本机代码。

底线:如果您的目标是生成可以作为单独的可执行文件运行或链接到单独的可执行文件的本机代码,

  • JIT编译器对你没用,但是
  • 您可以使用包含JIT编译器的JVM作为执行平台,通过生成字节码
  • 您还可以使用普通的Java编程来实现编译器或汇编程序,包括以适合您需要的格式生成和发出本机代码的组件。

答案 1 :(得分:4)

  

是否可以在没有外部程序的情况下使用Java编译到机器代码?

是。用Java编写x86汇编程序。

如果你正在生成x86程序集,那么下一步显然就是组装它。

  

看到HotSpot JVM可以将Java字节码编译为机器代码,我假设有一些机制可用于将类型A的源代码编译为机器代码。

仅仅因为HotSpot可以将Java字节代码转换为x86机器代码,并不意味着它可以将任何其他输入转换为相同的。

您实际上是在询问是否可以使用Java JITter来组合x86 asm。这没有道理。

  

我确实需要一个C编译器,因为我正在使用cstdlib

进行链接

不,您需要链接器。关于链接的任何事情都不需要编译器。