GCC编译java
java 语言和其他语言是有区别的,它对每个平台都有两种完全不同的目标代码格式,一种是 java 字节码(bytecode)格式的目标文件,可以在 java 的虚拟机中运行;另一种是可以将 java 字节码作为输入,生成本地的可执行的目标代码。
我们今天需要了解的是 GCC 中的 java 编译器 gcj,为什么要发明出来这样一种编译器呢?可以总结出以下几点:
为了优化性能,引入JIT(Just-Time),JIT会分析代码,找出那些反复被调用到一定次数的方法和函数,然后直接把这个方法处理成汇编machine code,以后就可以直接运行机器码。 传统的 java 还有一个问题,文件部署很麻烦,需要有很多个 jar 文件,而不是一个可执行文件。并且 java 需要一个很大的运行环境,还有就是java 和 C/C++ 之间调用的时候很慢。
与 java 程序相关的文件类型:
gcj main=test -Wall test.java -o test
使用 main 选项是告诉程序必须使用 hello 类中的 main() 方法作为程序的起点。-o选项是为了指定生成文件的名字。如果不指定,编译器默认生成文件名为a.out。因为文件是二进制的可执行文件,所以文件的名称可以任意指定。
java 语言允许所有的类都包含自己的主方法 main(),包含 main() 方法的 Java 类都可以运行。但在处理可执行程序时,必须明确指出独立的起点。
2) 单一的源文件到类文件gcj 编译器可以编译 java 源文件生成 .class 文件,也就是类文件,我们都知道类文件可以在 java 虚拟机上运行。使用上面的 test.java 文件生成类文件test.class,编译命令如下:
gcj -c -Wall test.java
注意:编译时-o和-c选项不要连用,这样可以保证输出的 .class 和输入的 .java 文件的文件名是相同的。写的类中必须包含public static void main() 方法,这样虚拟机可以使用下面的命令运行这个程序。
在 java 虚拟机中运行程序使用命令如下:
gij test
在虚拟机中运行的时候要注意,文件不用添加 .class 后缀名,直接使用 gij 加上类文件的文件名就可以。
3) 从源文件到二进制可执行文件的编译过程gcj 编译源文件的时候可以使用-c选项禁止链接操作,并且产生二进制目标文件,这样的二进制目标文件既可以链接生成可执行文件,又可以制作静态库文件。使用方式如下:
gcj -c test.java
上面的命令可以生成二进制目标文件 test.o,同时也可以使用-o选项指定生成的可执行文件的名字,使用如下:
gcj -c test.java -o test
4) java多文件编译将多个java源文件编译生成二进制可执行文件时,要分别编译每一个源文件,然后通过指出包含 main() 方法的源文件,最终将它们链接生成一个可执行文件。实例:
/*Hello.java*/ public class Hello{ public static void main(String arg[]){ SayHello hello = new SayHello(); hello.add( ni ); hello.add( hao ); hello.add( ma ); Say say = new Say(); say.speak(); /*SayHello.java*/ public class SayHello{ private String str = public static void add(String newworld){ if(str.length 0) str+= str += newworld; public String toString(){ return (str); /*Say.java*/ public class Say{ private String string; Say(String str){ string = str public void speak(){ System.out.println(string); }
我们通常使用的方法是将所有的源文件编译成目标文件,然后链接生成可执行文件,具体的命令使用如下:
gcj -c Hello.java
gcj -c SayHello.java
gcj -c Say.java
gcj main=Hello Hello.o SayHello.o Say.o -o sayhello
通过执行上述的命令可以得到最终目标文件 sayhello,当然这些命令也可以组合成一条命令来实现,使用如下:
gcj main=Hello Hello.java SayHello Say.java -o sayhello
注意:无论使用这两种方法中的哪一种,都不要忘指定包含 main() 方法的程序的类名。
23664.html
cGCCjava汇编语言相关文章
- Java 异常错误 (Ljava/lang/String;)L java/lang/String;「建议收藏」
- java double转decimal_Java中Double与BigDecimal的相互转换
- java-jdk8下载及安装
- java软件工程师是做什么的_JAVA软件工程师是做什么的?
- java循环语句_Java中的循环语句
- 【说站】java读写锁的特性
- 【测开技能】Java语言系列(十七)数组操作--遍历与排序
- java定时器实例_Java定时器小实例
- java深拷贝的实现方式_接口可以创建对象吗
- java 异或加密_Java异或技操作给任意的文件加密原理及使用详解
- Java 中的队列 Queue
- Java学习-如何编译适配java版本的jar包
- 【错误记录】Android Studio 4.2.1 编译报错 ( 设置支持的 Java 和 Kotlin 版本 | java.lang.BootstrapMethodError )
- 【错误记录】Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | 仅做参考 | 没有解决实际问题 )
- java监听器详解编程语言
- Java学习笔记之二java标识符命名规范详解编程语言
- Linux下使用GCC编译程序的指南(Linux编译gcc)
- Linux 卸载Java:简单步骤完成(linux卸载java)
- 编译Linux下用GCC编译程序的实用指南(linux怎么用gcc)
- GCC编译Oracle,提升系统效率(Gcc编译oracle)
- 编程Oracle数据库中实现Java编程的突破之道(oracle使用java)
- 编译Redis必须用GCC编译一次成功的尝试(redis需要gcc)