是否可以在没有外部程序的情况下用Java编译成机器代码?
首先,这不是您标准的“我想把Java代码编译成机器代码”问题 我正在开发一个用Java编写的编译器,它将把一种特定的语言(在我的例子中是Brainfuck)翻译成x86汇编,之后我目前计划使用NASM和GCC生成机器代码 鉴于HotSpot JVM可以将Java字节码编译成机器码,我假设有某种机制可以将A类型的源代码编译成机器码 有没有办法在用Java编写的编译器中使用它?我的主要目标是探索在不依赖路径上可用的外部程序(例如GCC和NASM)的情况下用Java编写编译器的可能性。我确实需要一个C编译器,因为在x86汇编代码中使用这些函数时,我正在链接cstdlib 为了澄清,我目前正在做以下工作:是否可以在没有外部程序的情况下用Java编译成机器代码?,java,gcc,assembly,compiler-construction,jvm,Java,Gcc,Assembly,Compiler Construction,Jvm,首先,这不是您标准的“我想把Java代码编译成机器代码”问题 我正在开发一个用Java编写的编译器,它将把一种特定的语言(在我的例子中是Brainfuck)翻译成x86汇编,之后我目前计划使用NASM和GCC生成机器代码 鉴于HotSpot JVM可以将Java字节码编译成机器码,我假设有某种机制可以将A类型的源代码编译成机器码 有没有办法在用Java编写的编译器中使用它?我的主要目标是探索在不依赖路径上可用的外部程序(例如GCC和NASM)的情况下用Java编写编译器的可能性。我确实需要一个C
bf.asm
文件nasm-f win32 bf.asm
将程序集转换为目标代码gcc-o bf.obj
将目标代码与Windows操作系统和cstdlib库链接nasm
和gcc
的可能性,而使用Java代码
是否可以在没有外部程序的情况下用Java编译成机器代码
对。用Java编写x86汇编程序
如果要生成x86程序集,下一步显然是组装它
鉴于HotSpot JVM可以将Java字节码编译成机器码,我假设有某种机制可以将A类型的源代码编译成机器码
仅仅因为HotSpot可以将Java字节码转换为x86机器码,并不意味着它可以将任何其他输入转换为相同的代码
您本质上是在询问是否可以使用Java抖动来组装x86 asm。这毫无意义
我确实需要一个C编译器,因为我正在链接cstdlib
不,你需要一个链接器。关于链接的任何内容都不需要编译器
鉴于HotSpot JVM可以将Java字节码编译成机器码,我假设有某种机制可以将A类型的源代码编译成机器码
但事实并非如此
JIT编译器将Java字节码编译为本机代码。除了Java字节码,它什么都不懂。字节码不是“源代码”。(它们实际上是机器代码的一种形式……用于抽象计算机……Java虚拟机。)
简而言之,JVM中没有将源代码编译成机器代码的机制
而且,事实证明,JIT编译器并不是为在其他文件中生成本机代码而设计的。本机代码以内存块中的原始机器指令的形式存在。没有符号表。没有搬迁信息。可能充满了对JVM其他部分的硬连线调用。基本上,它是为在当前运行的JVM中执行而设计的,而不是为其他任何东西
有没有办法在用Java编写的编译器中使用它
JIT编译器不适用于您的问题。。。除非编写编译器生成有效的Java字节码。如果您这样做了,那么JVM可以运行您的代码,JIT编译器会在某个时候将您的字节码编译为本机代码
底线:如果您的目标是生成可以作为单独的可执行文件运行或链接到单独的可执行文件的本机代码
- JIT编译器对您没有用处,但是
- 您可以使用JVM(包括JIT编译器)作为执行平台,方法是生成字节码,然后
- 您还可以使用普通Java编程来实现编译器或汇编器,其中包括一个组件,该组件以适合您需要的格式生成并发出本机代码
cstdlib
部分。。。他还需要这个库本身,也许那个人把OP弄糊涂了,以为他需要整个编译器?由于C编译器通常与所有基本库捆绑在一起分发,所以程序员获取它们的方式很常见。另外,如果您还使用编译器包装器链接最终二进制文件,则很容易忽略链接器作为工具链中独立工具的存在。谢谢您的回答。我刚刚更新了帖子,加入了我现在正在做的事情的列表,我意识到我忘了添加这个,因此这个问题可能看起来不完整,对此表示抱歉。谢谢你的回答。我刚刚更新了帖子,把我现在正在做的事情列了一个清单,我意识到我忘了添加这个和qu