java语言最初目标应该是用来在一些小型设备上运行的,java是用来实现控制逻辑,而实际的执行交由底层的程序去实现。
java与其他语言最大的区别就是需要虚拟机才能运行,关于什么是虚拟机,很多程序员不太了解。
我们在windows或dos操作系统中,用一个编辑器编写一个程序后,用编译器等工具把程序变成了一个可执行文件,如test.exe。然后我们只要双击这个文件或在dos命令行输入这个文件名,就可以运行程序了。那这个程序是怎么运行起来的呢?操作系统与程序之间是什么关系?
例如如下一个c语言程序
main()
{
printf("Hello world!");
}
当运行之后就在屏幕上输出一个字符串,这个程序只能在dos命令行下输入可执行文件的文件名运行才能看到效果。
这个程序脱离了操作系统是否能运行呢?当然不能,printf函数最终会调用操作系统的屏幕输出函数,而操作系统也最终会调用显示器的驱动程序才能把这个字符串输出到屏幕。是否存在对操作系统没有依赖性的程序呢,当然有,如果程序只是用到CPU的寄存器,那么这样的程序是与操作系统无关的,但是那样的程序又有什么意义呢,只要显示或保存数据,就必须依赖操作系统,所以程序对于操作系统的依赖是必然的。
既然在操作系统中运行的程序对于操作系统存在很多依赖,那么我们编译后的程序就只能在某种或某个特定的操作系统中运行。
java的设计目标就是希望能实现程序的运行不依赖于具体操作系统,怎么解决呢,就是在操作系统和程序之间增加一层,就是java虚拟机,三者之间的关系就如下
操作系统 <-----> java虚拟机(与操作系统相关部分) <--------->虚拟机(解释执行标准的java字节码)<-------> java程序
java虚拟机是与操作系统相关的,这样开发适应于不同操作系统平台的java虚拟机,在要运行java程序的操作系统上首先安装java虚拟机。
1)首先java程序会被编译成class文件,这个就类似于windows中的exe文件,但是这个文件是不能直接在某个操作系统中运行的。
2)在操作系统中启动java虚拟机,然后再由虚拟机解释class文件,把这个文件加载入内存。
3)java虚拟机从class文件中找到main函数,并从这里开始解释java字节码。
如在windows中执行一个java程序的方法是:
在cmd命令行输入 C:\myjavatest\firsttest> java test.class
执行命令“java”就是启动虚拟机,后面接的test.class文件名为编译后的java可执行文件。
可以这样理解:java源程序文件经过javac命令编译之后,变成了class文件,但是这个文件不是机器码,只是按照java规范的一个中间代码,类似于汇编语言程序。汇编语言程序也是要经过编译才能执行的,但是java被编译成类似汇编的字节码后,就不再进一步编译成依赖于具体机器的机器码。
java虚拟机是就是一个java字节码解释器,按照字节的含义调用相应操作系统的功能去实现程序的效果。
编写第一个java程序:
package firsttest;
public class test
{
public static void main(string arg[])
{
printf("Hello, world!");
}
}
这个程序必须保存为test.java,这又让很多程序员不习惯,因为在其他语言中不会有这个要求。在java中,一个类一般为一个文件,而且类名必须与文件名同名。这样的好处是只要我们看到一个文件名就可以知道这个文件保存了哪个类。
在C++编程中,可以把很多的代码写在一起,这让我们管理程序文件和拷贝程序变得简单,而在java中,由于一个类必须一个文件,这样就产生了很多文件。因此java的目录结构显得非常重要。
java文件编译后,也不会把需要的所有代码包含到一个可执行文件中,而仅仅就把当前这个文件的内容变成字节码。因此当要把一个java程序拷贝到另一个地方运行的时候,就必须拷贝所有相关的类代码文件。这点也让很多刚学java的程序员很不习惯的。
待续。。。。