Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在没有外部程序的情况下用Java编译成机器代码?_Java_Gcc_Assembly_Compiler Construction_Jvm - Fatal编程技术网

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

是否可以在没有外部程序的情况下用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

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

我正在开发一个用Java编写的编译器,它将把一种特定的语言(在我的例子中是Brainfuck)翻译成x86汇编,之后我目前计划使用NASM和GCC生成机器代码

鉴于HotSpot JVM可以将Java字节码编译成机器码,我假设有某种机制可以将A类型的源代码编译成机器码

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

为了澄清,我目前正在做以下工作:

  • 将x86程序集写入
    bf.asm
    文件
  • 使用
    nasm-f win32 bf.asm
    将程序集转换为目标代码
  • 使用
    gcc-o bf.obj
    将目标代码与Windows操作系统和cstdlib库链接
  • 我正在寻找在第2步和第3步中替代使用
    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编程来实现编译器或汇编器,其中包括一个组件,该组件以适合您需要的格式生成并发出本机代码

    请投票人解释一下为什么这个问题没有显示出任何研究成果,使其变得不清楚或没有用处?好吧@skiwi,一些基础研究会告诉你编译器或汇编程序是做什么的。我不明白这一点:二进制可执行文件,不管是什么格式(PE、ELF、MACH、raw等),都只是结构或多或少复杂的文件。x86机器代码只是一个字节流。每个汇编指令都可以轻松映射到操作码字节(仔细阅读《英特尔手册2》)。您可以生成二进制文件,而不是生成文本文件。那么,这个问题不是可以归结为如何用Java编写二进制文件吗?@skiwi我不太确定您是否这样做。您正在询问如何使用Java字节码JITer来组装x86 asm。这完全没有意义,Java9将介绍这一点,这表明长期目标是用Java实现编译器,通过这个接口插入JVM。一旦完成了这项工作(Java10或11?),如果您能够以预期的形式安排输入并关心代码的持久形式,那么从理论上讲,还可以从其他Java代码调用其代码。不要期望太高。关于
    cstdlib
    部分。。。他还需要这个库本身,也许那个人把OP弄糊涂了,以为他需要整个编译器?由于C编译器通常与所有基本库捆绑在一起分发,所以程序员获取它们的方式很常见。另外,如果您还使用编译器包装器链接最终二进制文件,则很容易忽略链接器作为工具链中独立工具的存在。谢谢您的回答。我刚刚更新了帖子,加入了我现在正在做的事情的列表,我意识到我忘了添加这个,因此这个问题可能看起来不完整,对此表示抱歉。谢谢你的回答。我刚刚更新了帖子,把我现在正在做的事情列了一个清单,我意识到我忘了添加这个和qu