背景:

第一次听到跨平台是在学习java的时候,"Java是一种跨平台,适合于分散式计算环境的面向对象编程语言。"经常看到诸如此类的描述。当时以为,因为有虚拟机,所以java实现了跨平台,所以没有虚拟机的语言就不能跨平台。

后来,接触了go语言,在网上看到了这样的文章"Golang跨平台交叉编译"

再后来,接触了nodejs,又看到了这样的描述"Node.js 平台的最大优势就是跨平台开发、跨平台部署、跨平台运行。"

最后,在后来恶补C语言的时候,又看到了可移植这样的说法。

总之搞的一头雾水,所以查阅了一些资料,自己总结了一个不成熟的结论,如下:

正文:

1.应用程序的执行本质是cpu指令的执行,而cpu指令分为特权指令非特权指令

2.语言用来编写源代码,其中「非系统调用」的部分,被编译器或者解释器转化为非特权指令,而「系统调用的部分」通过链接器定位到对应的特权指令,从而最终实现对硬体的管理。

3.所以平台指的是不同的cpu(对应不同的cpu指令集)和不同的操作系统(对应不同的系统调用),跨平台就是保证在不同的平台上,一种源代码最终能被翻译成正确的cpu指令,并且得到相同的执行结果。

4.一种语言要想跨平台,首先要在多个平台都有编译器或解释器,但是不同平台的编译器对某些相同的源代码会转化成不同的cpu指令,所以需要在编写代码的时候避免这种情况。

5.其次,各种标准(比如POSIX)用来保证不同操作系统有相同的系统调用,一个标准内容越少,实现的操作系统就越多。但是可以使用条件编译的方式针对不同的操作系统执行不同的系统调用来避开这个问题。

结论:

估计以后回头看到这个总结会有想扇自己的冲动,但是至少能暂时解决自己的一些疑惑

1.java虚拟机可以理解为各个平台的解释器,和自己封装的系统调用。

2.go语言通过交叉编译转换成平台相关指令,通过某种方式(没有深入研究)提供统一的系统调用介面。

3.javascript 是解释型语言,本身就是平台无关的。

4.C语言在各个平台都有编译器,通过标准库函数保证可移植性。

本小菜一枚,查阅资料的时候,看见网上众说纷纭,运气不好,没看到讲的特别清晰的文章,一直觉得知乎大神云集,希望大神看见,指点迷津。

===============以下内容更新于2018-11-21

之前查阅资料的时候,遇到了下面这几个词,关系不是很清楚,最近重读csapp有了一点思路整理在这:

这三个词语是:系统调用、c语言标准库函、 posix标准

举个例子:

<unistd.h> 这个头文件里 有write 方法 |posix标准 |系统调用

<fcntl.h> 这个头文件中有 open 方法 |posix标准|系统调用

<stdio.h>这个头文件中有fopen 方法 |c标准|库函数

整理以后 其实这里边有两个维度的分类,一个是[系统调用库函数],一个是[c标准posix标准]

1.[系统调用库函数] 这两个的区别在于,在unix中,编译器遇到系统调用会编译成syscall指令,而遇到库函数会编译成jmp指令,总结就是区别在于编译器对方法的处理不同

2.[c标准posix标准] 这个区别是介面规范,就没有什么必要说的了。

最后,让我们保持独立思考,不卑不亢。长成自己想要的样子!

(引用自 我非常喜欢的B站up主 」独立菌儿「的口头禅哔哩哔哩 ( ゜- ゜)つロ 干杯~ Bilibili)


推荐阅读:
查看原文 >>
相关文章