• 小伙伴惊呆了!这个编译器可以直接将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编译器就无能为力。

  • 相关阅读:
    LeetCode 227. Basic Calculator II
    LeetCode 224. Basic Calculator
    LeetCode 103. Binary Tree Zigzag Level Order Traversal
    LeetCode 102. Binary Tree Level Order Traversal
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode 169. Majority Element
    LeetCode 145. Binary Tree Postorder Traversal
    LeetCode 94. Binary Tree Inorder Traversal
    LeetCode 144. Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/HouXinLin/p/14366365.html
Copyright © 2020-2023  润新知