问题 是否有可能直接用Java字节码指令编写程序?


在.NET平台中,可以直接使用Common Intermediate Language编写程序,并使用IL Assembler(ILASM)编译源代码。

例如下面的代码是“Hello World”程序。

.assembly Hello {}
.assembly extern mscorlib {}
.method static void Main()
{
    .entrypoint
    .maxstack 1
    ldstr "Hello, world!"
    call void [mscorlib]System.Console::WriteLine(string)
    ret
}

是否有可能直接用.NET编写带有Java字节码指令的程序?


6139
2017-12-30 16:11


起源

有asm(asm.ow2.org) 为了那个原因。 - fge
不是你的问题的答案(这是肯定的,但不简单;))这是一个很好的博客文章与参考 arhipov.blogspot.se/2011/01/java-bytecode-fundamentals.html?m=1 - Peter Liljenberg
为什么有人想要或需要这样做?由于它是基于堆栈的机器,我怀疑你可以做的任何技巧,编译器还不知道。 - James


答案:


你可以看看Jasmin。来自维基百科,

一些项目为Java汇编程序提供了手动编写Java字节码的功能。汇编代码也可以由机器生成,例如通过针对Java虚拟机的编译器生成。值得注意的Java汇编程序包括:

茉莉,获取Java类的文本描述,使用Java虚拟机指令集以简单的类似汇编的语法编写,并生成Java类文件。

牙买加,Java虚拟机的宏汇编语言。 Java语法用于类或接口定义。使用字节码指令指定方法体。

注意:我没有亲自使用过这些工具。


7
2017-12-30 16:15



这些工具可以用于在普通的Java源代码中嵌入内联的JVM指令吗? - Philipp
@Philipp - 我从来没有听说过允许内联“汇编语言”的javac版本。 (自从循环注释大屠杀以来,我也不确定Jasmin的工作有多好/轻松。) - Hot Licks


你可以使用Jasmin

 .class public HelloWorld
 .super java/lang/Object

 .method public static main([Ljava/lang/String;)V
 .limit stack 3
 .limit locals 1

  getstatic      java/lang/System/out Ljava/io/PrintStream;
  ldc            "Hello World."
  invokevirtual  java/io/PrintStream/println(Ljava/lang/String;)V

 return

.end method

你用它编译它:

java -jar jasmin.jar hello.j

你可以参考 这个 也


6
2017-12-30 16:24