java语言是一种面向对象的编程语言,与c非常相似,但大大减少了相对难以理解的内容,如操作符重载、多继承和自动强制类型转换。 java语言使用引用方法而不是指针来自动管理内存,使java语言的学习相对容易。
java语言与其他语言不同,每个平台有两种完全不同的目标代码格式。 一种是可以在java虚拟机上运行的java字节码(bytecode )格式的目标文件。 另一种选择是,可以使用java字节码作为输入来生成本地可执行的目标代码。
今天需要知道的是GCC的java编译器gcj。 为什么会发明这样的编译器呢? 可以总结以下几点。
传统的JVM(Java虚拟机)太晚了,因为它解释了class文件中的bytecode。
为了优化性能,部署了JIT(just-time )。 JIT分析代码,找到调用了一定次数的方法和函数,并将该方法直接处理到程序集machine代码中。 以后可以直接运行机器代码。
传统的java还有另一个问题,部署文件很麻烦,需要多个jar文件而不是可执行文件。 而且,java需要很大的执行环境。 还有,在java和C/C之间调用的时候太晚了。
与java程序相关的文件类型:
. a :包含静态链接的目标文件的库文件
. class :目标文件。 包含可以在Java虚拟机上执行的字节码
. java:Java源文件
. o :二进制目标文件,格式与链接器匹配
. s :汇编语言的源代码
. so :包含动态链接的目标文件的共享库
1 )编译java程序
编写一个简单的Java程序。 代码如下所示。
/*test.java*/
公共班级助手
{
publicstaticvoidmain (字符串arg [ ] ) {
system.out.println(「Helloworld”);
}
}
要编译java程序,请使用以下命令:
gjmain=test-walltest.Java-o test
使用--main选项是告诉程序必须使用hello类的main ()方法作为程序的起点。 -o选项用于指定生成的文件的名称。 如果未指定,编译器将缺省生成文件名a.out。 由于文件是二进制可执行文件,因此可以任意指定文件的名称。
在java语言中,所有类都可以包含自己的主方法main (),而main ) )方法的java类可以运行。 但是在处理可执行程序时,必须明确指出独立的起点。
2 )从单个源文件到类文件
GJ编译器可以编译java源文件以生成. class文件,即类文件。 我们知道类文件可以在java虚拟机上运行。 使用上面的test.java文件生成类文件test.class,编译命令如下所示:
gcj -c -Wall test.java
注意:编译时请勿连用-o选项和-c选项。 这确保了输出的. class文件和输入的. java文件的文件名相同。 编写的类必须包含公共静态语音主(public static void main ) )方法,以便虚拟机可以使用以下命令运行此程序:
用于在java虚拟机上运行程序的命令包括:
gij测试
请注意,在虚拟机上运行时,可以不使用. class扩展名,而是使用gij和类文件的文件名。
3 )从源文件到二进制可执行文件的编译过程
当gcj编译源文件时,可以使用-c选项禁止链接操作并生成二进制目标文件。 这种二进制目标文件可以通过链接可执行文件和静态库文件来生成。 按以下方式使用:
gcj -c test.java
上述命令可以生成二进制目标文件test.o。 也可以使用-o选项指定要生成的可执行文件的名称,如下所示:
gcj -c test.java -o test
4 )编译java多文件
如果要编译多个java源文件以生成二进制可执行文件,请分别编译每个源文件,然后指定包含main ()方法的源文件,最后将它们链接在一起以生成可执行文件。 实例:
/*Hello.java*/
公共班级助手{
publicstaticvoidmain (字符串arg [ ] ) {
SayHello hello=new SayHello (;
Hello.add(「Ni”);
Hello.add(「Hao”);
Hello.add(「ma”);
Say say=new Say (;
say.speak (;
}
}
/*SayHello.java*/
公共类say hello {
私有字符串str=“”;
publicstaticvoidadd (字符串新世界)。
if(str.length0) )。
str=”;
str=新世界;
}
公共字符串字符串
返回(str;
}
}
/*Say.java*/
公共类say {
私有字符串;
say(stringstr ) {
string=str
}
公共void speak () }
system.out.println (字符串;
}
}
通常,将所有源文件编译为目标文件,然后链接生成可执行文件。 具体命令如下。
gcj -c Hello.java
gcj -c SayHello.java
gcj -c Say.java
gjmain=hello hello.osayhello.osay.o-osayhello
通过运行上述命令,可以获得最终的目标文件sayhello。 当然,这些命令也可以组合在一个命令中实现,如下所示:
gjmain=hello hello.javasayhellosay.Java-osayhello
注:请记住,无论使用哪种方法,都要为包含main ()方法的程序指定类名。