4

当我们说一个程序是独立于操作系统的时,我们究竟是什么意思?我们的意思是只要处理器相同,它就可以在任何操作系统上运行吗?

例如,OpenGL 是一个独立于操作系统的库。它包含的函数必须假设一个特定的处理器。但是代码/程序/应用程序不是特定于操作系统的吗?

我学到的是:

  1. 操作系统是特定于处理器的。

  2. 应用程序(程序/代码/例程/函数/库)是特定于操作系统的。

  3. 源代码是纯文本。


  4. 编译器(程序)是特定于操作系统的,但它可以为假设相同操作系统的不同处理器编译源代码。

  5. OpenGL 是一个库。

因此,OpenGL 必须是特定于操作系统/处理器的。它如何独立于操作系统?

可以独立于操作系统的是源代码。这个对吗?

知道源代码是否独立于操作系统有什么帮助?

4

4 回答 4

6

当我们说一个程序是独立于操作系统的时,我们究竟是什么意思?我们的意思是只要处理器相同,它就可以在任何操作系统上运行吗?

当程序仅使用已定义的行为(没有未定义、未指定或实现定义的行为)时,程序由语言标准(在您的情况下为 C 语言标准)保证编译(使用符合标准的编译器)并在所有操作上统一运行系统。

基本上,您必须了解,像 C 这样的语言标准或像 OpenGL 这样的库标准提供了一组程序员可以制作和构建的最小可假设保证。只要编译器符合标准(在库的情况下,实现是符合标准的)并且程序没有涉足未定义的行为领域,这些就不会改变。

openGL 必须是特定于操作系统/处理器的。它如何独立于操作系统?

不。OpenGL 是平台无关的。OpenGL实现(实现调用的驱动程序)绝对是特定于平台和 GPU 的。假设C标准由GCC,MSVC++等实现,它们都是可以编译C代码的不同编译器实现。

可以独立于操作系统的是源代码。这个对吗?

源代码(如果编写时考虑到可移植性)只是众多此类独立于平台的实体之一。库(OpenGL 等)、框架(.NET 等)等也可以独立于平台。就此而言,甚至硬件也可以由某人指定并由其他人实施:ARM 处理器是由 ARM 制定并由 Qualcomm、TI 等 OEM 实施的标准/规范。

我们的意思是只要处理器相同,它就可以在任何操作系统上运行吗?

只要您仅使用跨平台组件来构建程序,处理器和平台 (OS) 都无关紧要。假设您使用 C,一种可移植语言;SDL,用于创建窗口、处理事件、帧缓冲区等的跨平台库;OpenGL,一个跨平台的图形库。现在您的程序将在多个平台上运行,即使那样它也取决于最薄弱的环节。如果 SDL 不能在某些仅支持 J2ME 的手机上运行,​​那么它将没有针对该平台的库分发,因此您的应用程序将无法在该平台上运行平台; 所以从某种意义上说,没有什么是完全独立的。因此,明智的做法是使用可用于不同架构、平台、编译器等的各种库,然后根据您的目标平台选择所需的库。

于 2013-10-11T06:01:02.533 回答
3

当我们说一个程序是独立于操作系统的时,我们究竟是什么意思?

这意味着它已经以某种方式编写,可以编译(如果使用的语言需要编译)或在几个操作系统和/或处理器架构上无需修改或只需少量修改即可运行。

例如,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 是一个库。

错误的!

OpenGL 是一个 API 规范。

  • 因此,openGL 必须是特定于操作系统/处理器的。

错误的!

即使 OpenGL 是一个库:库也可以编写成可移植的。

  • 它如何独立于操作系统?

因为 OpenGL 本身只是描述 API 的冗长文本文档。然后每个支持OpenGL的操作系统都将实现符合规范的API,以便编写或编译以在所述操作系统上运行的程序可以按照规定使用OpenGL。

  • 可以独立于操作系统的是源代码。

错误的!

完全有可能以仅针对特定操作系统和/或特定处理器架构编译和运行的方式编写程序源代码。操作系统/架构依赖的巅峰:用汇编程序编写东西并直接使用操作系统特定的低级 API。

  • 知道源代码是否独立于操作系统/窗口有什么帮助?

它为您提供了将程序定位到不同操作系统的难度的大致数字。

一个非常重要的事情要理解:

操作系统独立性并不意味着程序将在所有操作系统或架构上运行。这意味着它不受特定操作系统/CPU 组合的限制,移植到不同的操作系统/CPU 只需很少的努力。

于 2013-10-11T10:48:34.663 回答
2

这里有几个概念。程序可以独立于操作系统,即它可以在一系列操作系统上运行/编译而无需更改。其次,可以在一系列操作系统上制作库,这些库可以由独立于平台的程序使用。

严格来说,OpenGL 不必独立于操作系统。OpenGL 实际上可能在不同的操作系统上有不同的源代码,它们以特定于平台的方式与驱动程序交互。重要的是 OpenGL 的接口是独立于操作系统的。因为接口是独立于操作系统的,它可以被实际上独立于操作系统的代码使用,并且可以在不修改的情况下运行/编译。

库抽象出特定于操作系统的东西是一种很好的方式,可以让您的代码与通常需要特定于操作系统代码的操作系统交互。

于 2013-10-11T06:10:47.350 回答
0

其中之一:

  1. 它可以在程序框架支持的任何操作系统上编译,而无需更改源代码。(像 C++ 这样直接编译成机器代码的语言)
  2. 该程序是用解释语言或编译成独立于平台的字节码的语言编写的,并且可以在其解释器支持的任何平台上实际运行而无需修改。(像 java 或 python 这样的语言)。
  3. 应用程序依赖于某种抽象操作系统特定调用的跨平台框架。它将在框架支持的任何操作系统上运行而无需修改。

因为您没有添加任何语言标签,所以它是 #1、#2 或 #3,具体取决于您的语言。

- 编辑 -

操作系统是特定于处理器的。

不,请参阅 Linux。相同的代码库,可以针对不同的架构进行编译。通常,(嗯,这是合理的预期)操作系统内核是用可移植语言(如 C)编写的,可以为不同的 CPU 重新构建。在像 gentoo 这样的发行版上,你也可以从源代码重建整个操作系统。

应用程序(程序/代码/例程/函数/库)是特定于操作系统的。

不,像 java *.jar 文件这样的应用程序可以或多或少地独立于操作系统——只要有解释器,它们就可以在任何地方运行。会有一些特定于操作系统的部分(如 java 的运行时环境),但您的程序将在该部分存在的任何地方运行。

源代码是纯文本。

不一定,尽管在大多数情况下确实如此。

编译器(程序)是特定于操作系统的,但它可以为假设相同操作系统的不同处理器编译源代码。

不完全的。使用(有些)可移植代码编写是合理的,因此可以为不同的操作系统重建编译器。在 OS A 上运行时,可以(在某些情况下)为 os B 编译代码。在 Linux 上,您可以为 windows 平台编译代码。

OpenGL 是一个库。

它不是。它是一个规范 (API),描述了一组用于处理 3d 图形的编程函数。有实现此规范的库。规范本身不是库。

因此,OpenGL 必须是特定于操作系统/处理器的。

错误的结论。

它如何独立于操作系统?

只要底层平台具有符合标准的 OpenGL 实现,您的程序的渲染部分将与在任何其他具有符合标准的 OpenGL 实现的平台上以相同的方式工作。这就是便携性。当然,这是一个理想的情况,实际上你可能会遇到驱动程序错误或其他东西。

于 2013-10-11T05:17:20.753 回答