Java为什么要实现跨平台,如何跨平台兼容?write once,run anywhere!

参考资料:《揭秘Java虚拟机 JVM设计原理与实现》 封亚飞著

为什么要实现跨平台

  解释这个问题还得从最开始的机器语言说起,从最初的机器语言,那个时候的程序员可真是太难了,计算机能够读懂的就是0和1,像这样,什么意思很难看懂啊

1010101
10010001000100111100101
11000111010001011111110000000001000000000000000000000000
11000111010001011111100000000010000000000000000000000000
100010110100010111111000
10100010111111100
1011101
11000011

辛辛苦苦的写了几百行机器码,过程中把一个0写成1,想一下是不是头大,你必须得一个个的检查,因可读性太差了,大佬们开始发挥自己的智慧,开发出了Fortran,B,C,C++,VB,PHP等高级语言,之所以叫高级语言,是因为它们极大的提高了我们的写代码的效率,解放了程序员的生产力。
  在这种高级语言百家齐放的景象下,大家使用的技术各不相同,因此使用的芯片也不一样,需要针对不同的硬件开发,自然而然的问题就出现了啊,我在这个硬件这个平台开发的程序如何拿到另一个平台去用呢???这时天降猛男,不用我多说了吧哈哈哈哈,Java之父——James Gosling,人称詹爷。开发一款能够横跨各种异构平台的编程语言挺难的,但是呢,这可难不倒詹爷嗷,来看看詹爷做了哪些方法,如何实现跨平台的。

实现跨平台的两种方式

一款编程语言兼容底层系统的方式大概有两种

  1. 通过编译器实现兼容

  C,C++等编程语言既能运行在Linux操作系统,又能运行于Windows操作系统;既能运行于x86平台,也能运行于AMD平台,就是通过编译器兼容的,针对不同的平台,系统开发不同的编译器,通过编译器将C,C++等代码,编译成与目标平台匹配的机器指令,从而达到编程语言的兼容性,这中间有个问题,就是如果涉及系统调用的情况下,往往都需要修改程序来调用系统特定的API,否则放到新平台上的程序是无法运行的。

  1. 通过中间语言来实现兼容

  Java,C#等语言属于这种兼容方式。

  Java,C#程序被编译之后,生成中间语言(ML),中间语言指令负责由虚拟机负责解释和运行,虚拟机在运行期间将中间语言实时翻译成与特定平台底层匹配的机器指令并运行,无论最终程序在哪种平台下运行源代码被编译生成的中间语言是相同的,中间语言的兼容性由虚拟机完成。

  虚拟机将中间语言翻译成本地机器指令,其实Java的中间语言就是Java字节码指令集(该指令集对硬件CPU指令集的抽象与再加工,能够满足java开发的一切需要),对没错就是你看到以.class后缀结尾的文件中写的就是java字节码指令,不过显示的 .class文件是被反编译过的,基本与原java文件一样,我们需要反编译才能看到字节码指令。运行期直接直接由Java虚拟机根据Java字节码调用对应的机器指令来执行的,这种调用机制主要是通过依靠CPU所提供的call和jmp指令来完成的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
想要实现跨平台的 C++ FIFO,可以使用 POSIX 标准中提供的 mkfifo 函数。具体步骤如下: 1. 使用 mkfifo 函数创建 FIFO 文件,示例代码如下: ```c++ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { const char* fifo_name = "my_fifo"; int res = mkfifo(fifo_name, 0644); if (res != 0) { // 创建 FIFO 失败 return -1; } // 成功创建 FIFO return 0; } ``` 2. 打开 FIFO 文件,示例代码如下: ```c++ #include <fcntl.h> int main() { const char* fifo_name = "my_fifo"; int fd = open(fifo_name, O_RDONLY); if (fd == -1) { // 打开 FIFO 失败 return -1; } // 成功打开 FIFO return 0; } ``` 3. 使用 FIFO 进行读写操作,示例代码如下: ```c++ #include <fcntl.h> #include <unistd.h> int main() { const char* fifo_name = "my_fifo"; int fd = open(fifo_name, O_WRONLY); if (fd == -1) { // 打开 FIFO 失败 return -1; } const char* msg = "Hello, FIFO!"; int len = write(fd, msg, strlen(msg)); if (len == -1) { // 写入 FIFO 失败 return -1; } // 成功写入 FIFO return 0; } ``` ```c++ #include <fcntl.h> #include <unistd.h> int main() { const char* fifo_name = "my_fifo"; int fd = open(fifo_name, O_RDONLY); if (fd == -1) { // 打开 FIFO 失败 return -1; } char buf[1024]; int len = read(fd, buf, sizeof(buf)); if (len == -1) { // 读取 FIFO 失败 return -1; } buf[len] = '\0'; printf("Received message: %s\n", buf); // 成功读取 FIFO return 0; } ``` 以上是实现跨平台的 C++ FIFO 的基本步骤,需要注意的是,不同平台对 FIFO 的实现可能略有不同,具体实现细节需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值