关于java:小伙伴惊呆了这个编译器可以直接将Java源码编译为本地机器指令

前言

Write Once,Run Anywhere,一次编写,到处运行,咱们再相熟不过了,只管都晓得Java源码要先通过javac编译为字节码文件,而后由JVM去运行,然而有些选手就想把他编译成为exe,当然这也是能够的,尽管我还没有正真的尝试过,然而做到这样也很简略,原理就是把jre和jar一起打包,寄存在exe文件中,而后运行exe的时候,开释jre和jar文件,接着就能够调用java -jar去执行这个jar包,然而这样做的话,最终的exe体积就会变的十分大,并且没有脱离JVM环境。

那还有没有其余方法,当然有了,就是通过GCJ,全称叫GNU Compiler for the Java Programming Language,这个编译器能够间接将java文件编译为本地机器指令,这样的话Java程序就脱离了JVM环境独立运行,还能够将java文件编译为字节码文件,GCJ的实现尽管不残缺,然而,他反对大多数的Java性能,包含汇合,网络,反射,序列化,JNI和RMI。

GCJ

装置

上面以Linux为例,装置命令如下:

sudo apt-get install  gcj-jdk

生成可执行文件

在编写一个Java Hello World文件:

public class Test {
    public static void main(String... a‮) {
        System.out.println("HelloWorld");
    }
}

上面分为两步,编译和链接,命令如下:

gcj -c Test.java  #编译为Hello.o

gcj --main=Test -o Test Test.o ##将Hello.o链接到Hello

GCJ编译器首先会更具java源码编译出一个后缀为.o的对象文件,这个文件的内容就是能够间接被CPU辨认执行的本地机器指令,而后GCJ在更具这个对象文件进行链接,生成一个可执行文件。

其实也能够通过一条命令来实现编译和链接,命令如下:

gcj --main=Test -o Test Test.java

–main=Test是通知链接用哪一个类的main()办法做为可执行文件的入口。

而后运行:

./Test 
HelloWorld

是不是惊呆了呢?然而最终大小还是有点大,16.1KB。

生成java字节码文件

-C 参数用来通知GCJ编译成Java字节码文件,即生成一个class文件,运行的话就能够通过java命令来运行。


gcj -C Test.java 

java Test 

HelloWorld

编译Jar

要把jar编译为可执行文件,首先就要通过IDE把我的项目打包成一个jar包,或者通过jar命令也能够,而后在进行编译和链接即可。

jar cvf Test.jar *.class

gcj -c Test.jar

gcj --main=Test -o Test Test.o

./Test 

尽管GCJ能把java源码编译为本地机器指令,然而貌似也没有多少人会这样做,首先体积也会变大,再者就是GCJ编译器默认只会对Java的根底类库提供反对,其余第三方GCJ编译器就无能为力。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理