write once ,run anyWhere:一处编写,到处运行。
由于计算器只认识机器语言,所有的编程语言都需要经过这一步:“翻译”,将编程语言翻译成机器语言,机器语言只与硬件有关,与平台无关(平台一般指操作系统,如Linux、Windows)。
如果想要在不同的平台运行同一份源代码,应该如何兼容不同的平台?
1.通过编译器实现兼容。
复制代码
1
2第一种方式可以通过**在不同的系统安装特定的编译器**,编译器能够将同样一段的程序翻译成机器指令,从而实现编程语言的兼容性。例如,C语言是一门移植性强的高级语言,但并不是跨平台,因为对于一些跟系统相关的API,不同的系统平台是无法兼容,对于C语言的一些标准库等,只要不涉及到系统调度,就可以不修改程序而直接放在其他平台运行,这也是C语言移植性强的原因。
实例:
在linux平台上使用C语言创建线程
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include <stdio.h> #include <pthread.h> //子线程函数 void threadCallBack (void) { int i; printf ("This is a pthread.n"); } int main (void) { pthread_t id; int i, ret; //创建线程,注意对比不同平台相同功能的API ret=pthread_create(&id, NULL, (void *) threadCallBack, NULL) ; if (ret !=0) { printf ("Create pthread error!n"); exit (1); printf ("This is the main process.n"); pthread join (id, NULL); return (0); } }
在windows平台上使用C语言创建线程
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <stdio.h> #include <windows.h> //子线程函数 DWORD WINAPI ThreadFun (LPVOID pM) { printf ("This is a pthreadn"); return 0; } int main (){ printf ("This is the main process.n"); //创建线程 HANDLE handle = createThread (NULL, 0, ThreadFun, NULL, 0, NULL); WaitForSingleObject (handle, INFINITE); return 0; }
可以看到,在Linux平台上,开发者需要知道Linux平台所提供的创建线程的接口是pthread create();而在Windows平台上,开发者需要知道Windows平台所提供的创建线程的接口是CreateThread)。另外,在Linux和Windows平台上, C程序需要引用不同的头文件,并且所调用的创建线程的两种API的入参和返回值也不相同。所以当你想把一份在Windows环境下运行成功的C程序移植到Linux平台运行,就需要去修改一些与平台相关API的引用。
2.通过中间语言实现兼容
复制代码
1
2
3
4通过编译器的方式由于跟系统相关的API与平台有关,如果能定义一套规范去限定调用的方式,统一规范,我们就可以实现编程语言的跨平台性。但是类似C语言这种语法性强,是更加贴近人的思维,与机器思维偏差太远,做不到这一点。 设想一下,如果能在软件层级上去模拟机器指令的执行逻辑以及机器内存的寻址方式,是不是就可以实现编程语言的跨平台?JVM就是这么做,JVM定义了一套字节码规范,对所有平台开放。JVM只认识字节码文件,而字节码指令已经不是原本的编程语言了,而是由编程语言编译而来的中间语言,只要遵循这一套标准,就可以顺利将程序在不同的平台跑起来。 如图,当我们在IDEA编写Studen.java并达成jar包,就可以将jar包放在linux上跑。在跑起来之前我们会安装jdk环境,而jdk是分平台的,其中jdk就包含了jvm。也就是说除了安装jdk,我们并不需要去修改源码,就可以实现跨平台。
参考书籍:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
最后
以上就是自信大山最近收集整理的关于java跨平台的实现的全部内容,更多相关java跨平台内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复