当我们说一个程序是独立于操作系统的时,我们究竟是什么意思?
这意味着它已经以某种方式编写,可以编译(如果使用的语言需要编译)或在几个操作系统和/或处理器架构上无需修改或只需少量修改即可运行。
例如,openGL 是一个独立于操作系统的库。
OpenGL不是一个库。OpenGL 是一种 API 规范,即描述一组标记(= 命名数值)和入口点(= 可调用函数)及其对系统级别的影响的冗长文本。
我学到的是:
错误的!
就像一个程序可以以一种可以针对多个操作系统(和处理器架构)的方式编写一样,操作系统也可以以某种方式编写,它们可以针对多个处理器架构进行编译和运行。
例如,Linux 支持如此多的体系结构,有人开玩笑说,它运行在能够处理 0 和 1 并具有内存管理单元的所有东西上。
- 应用程序(程序/代码/例程/函数/库)是特定于操作系统的。
错误的!
程序逻辑独立于操作系统。像这样的计算x_square = x * x
根本不依赖于操作系统。程序只有很小的一部分,即那些使用操作系统服务的部分实际上依赖于操作系统。此类服务是诸如打开、读取和写入文件、创建窗口之类的东西。但是您通常不会直接使用那些特定于操作系统的 API。
大多数操作系统低级 API 都有某些细节,这些细节很容易被绊倒和难以解决。所以你不使用它们,而是一些标准的、独立于操作系统的库,它隐藏了操作系统特定的东西。
例如,C 语言(已经相当低级)定义了一组用于文件访问的标准函数,这些stdio
函数。fopen, fread, fwrite, fclose, ... C++ 与它iostream
的 s 类似,但它们只是包装了操作系统特定的 API。
通常是,但不一定。还有图形数据流编程环境,如LabVIEW,也可以创建本地代码。这些使用的源代码不是纯文本,而是以自定义二进制格式存储的图表。
- 编译器(程序)是特定于操作系统的,但它可以为假设相同操作系统的不同处理器编译源代码。
错误的!和错误!
编译器是特定于语言和目标的。但是完全有可能在您的系统上安装一个编译器,该编译器生成针对与您使用它的系统不同的处理器架构和操作系统的可执行文件(交叉编译)。毕竟编译器“只是”一个从源代码到目标二进制文件的(数学)函数映射。
事实上,编译器本身根本不针对操作系统,它只针对处理器架构。整个操作系统细节由操作系统的 ABI(应用程序二进制接口)引入,它们是链接运行时环境和目标链接器的地址(是的,链接器必须能够寻址特定的操作系统)。
错误的!
OpenGL 是一个 API 规范。
- 因此,openGL 必须是特定于操作系统/处理器的。
错误的!
即使 OpenGL 是一个库:库也可以编写成可移植的。
因为 OpenGL 本身只是描述 API 的冗长文本文档。然后每个支持OpenGL的操作系统都将实现符合规范的API,以便编写或编译以在所述操作系统上运行的程序可以按照规定使用OpenGL。
错误的!
完全有可能以仅针对特定操作系统和/或特定处理器架构编译和运行的方式编写程序源代码。操作系统/架构依赖的巅峰:用汇编程序编写东西并直接使用操作系统特定的低级 API。
它为您提供了将程序定位到不同操作系统的难度的大致数字。
一个非常重要的事情要理解:
操作系统独立性并不意味着程序将在所有操作系统或架构上运行。这意味着它不受特定操作系统/CPU 组合的限制,移植到不同的操作系统/CPU 只需很少的努力。