程序如何独立于OS?

时间:2013-10-11 04:01:29

标签: c opengl

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

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

我学到的是:

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

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

  3. 源代码是纯文本。

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

  5. OpenGL是一个库。

  6. 因此,OpenGL必须是特定于OS /处理器的。它如何与操作系统无关?

    可以与OS无关的是源代码。这是对的吗?

    如何知道源代码是否与操作系统无关?

4 个答案:

答案 0 :(得分:6)

  

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

当程序仅使用已定义的行为(无undefined, unspecified or implementation defined behaviours)时,程序将通过语言标准(在您的C语言标准中)进行编译(使用符合标准的编译器)并统一运行操作系统。

基本上你可以理解像C这样的语言标准或者像OpenGL这样的图书馆标准提供了一套程序员可以制作和构建的最低限度的保证。只要编译器是标准的抱怨(在库的情况下,实现是标准兼容的)并且程序没有在未定义的行为域中进行尝试,这些都不会改变。

  

openGL必须是特定于OS /处理器的。它如何与操作系统无关?

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

  

可以与OS无关的是源代码。这是对的吗?

源代码(如果为可移植性而编写)只是众多此类平台独立实体中的一个。库(OpenGL等),框架(.NET等)等也可以与平台无关。就此而言,甚至硬件也可由某人指定并由其他人实施:ARM处理器是ARM​​制定的标准/规范,由高通,TI等OEM实施。

  

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

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

答案 1 :(得分:3)

  

当我们说程序与操作系统无关时,我们究竟是什么意思?

这意味着它已经以某种方式编写,可以编译(如果编译对于所使用的语言是必要的),或者在几个操作系统和/或处理器体系结构上没有或只是稍微修改就可以运行。

  

例如,openGL是一个独立于操作系统的库。

OpenGL 不是库。 OpenGL是一个API规范,即一个冗长的文本量,它描述了一组标记(=命名数值)和入口点(=可调用函数)以及它们在系统级别上的效果。

  

我学到的是:

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

<强>错误!

就像程序可以以可以针对多个操作系统(和处理器体系结构)的方式编写一样,操作系统可以用某种方式编写,它们可以编译为在多个处理器架构上运行。

例如,Linux支持如此多的架构,它开玩笑地说,它运行在能够处理零和一的所有内容上,并且有一个内存管理单元。

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

<强>错误!

程序逻辑独立于OS。像x_square = x * x这样的计算根本不依赖于操作系统。只有程序的一小部分,即那些利用操作系统服务的部分实际上取决于操作系统。这些服务包括打开,读取和写入文件,创建窗口等等。但是您通常不会直接使用这些特定于操作系统的API。

大多数操作系统低级别API具有某些特定功能,这些功能很容易绊倒并且难以解决。所以你不能使用它们,而是一些标准的,独立于操作系统的库,它隐藏了操作系统特定的东西。

例如,C语言(已经很低级别)定义了一组标准的文件访问函数,即stdio函数。 fopen,fread,fwrite,fclose,...类似于C ++及其iostream s但是那些只是包装OS特定的API。

  
      
  • 源代码是纯文本。
  •   

通常是,但不一定。还有图形化的数据流编程环境,如LabVIEW,它也可以创建本机代码。这些使用的源代码不是纯文本,而是一个以自定义二进制格式存储的图表。

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

错误!错误!

编译器是特定于语言和目标的。但完全有可能在您的系统上安装一个编译器,该编译器生成可执行文件,这些可执行文件的目标是与您使用它的系统(交叉编译)不同的处理器体系结构和操作系统。毕竟编译器是&#34;只是&#34;从源代码到目标二进制的(数学)函数映射。

事实上,编译器本身并不针对操作系统,它只针对处理器架构。整个操作系统细节由OS的ABI(应用程序二进制接口)引入,它们是链接的运行时环境和目标链接器的地址(是的,链接器必须能够解决特定的问题) OS)。

  
      
  • openGL是一个库。
  •   

<强>错误!

OpenGL是一个API规范。

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

<强>错误!

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

  
      
  • 如何与操作系统无关?
  •   

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

  
      
  • 可以与OS无关的是源代码。
  •   

<强>错误!

完全可以编写程序源代码,使其仅针对特定操作系统和/或特定处理器体系结构进行编译和运行。操作系统/体系结构依赖的巅峰之作:直接在汇编程序中编写内容并使用特定于操作系统的低级API。

  
      
  • 如何知道源代码是否独立于OS /窗口?
  •   

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

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

操作系统独立性并不意味着,程序将在所有操作系统或体系结构上运行。这意味着它不会受限于特定的OS / CPU组合,并且移植到不同的OS / CPU只需要很少的工作量。

答案 2 :(得分:2)

这里有几个概念。程序可以是独立于操作系统的,即它可以在不改变操作系统的情况下运行/编译。其次,库可以在一系列OS上制作,可以由独立于平台的程序使用。

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

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

答案 3 :(得分:0)

其中一个:

  1. 它编译程序框架支持的任何操作系统,无需更改源代码。 (像C ++这样直接编译成机器代码的语言)
  2. 程序是用解释语言或编译成与平台无关的字节码的语言编写的,并且实际上可以在其解释器支持的任何平台上运行而无需修改。 (java或python等语言)。
  3. 应用程序依赖于某种抽象的特定于操作系统的调用的跨平台框架。它将在框架支持的任何操作系统上运行而无需修改。
  4. 因为您没有添加任何语言标记,所以它是#1,#2或#3,具体取决于您的语言。

    - 编辑 -

      

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

    没有。见Linux。相同的代码库,可以针对不同的体系结构进行编译。通常,(嗯,可以合理地预期)OS内核是用可移植语言(如C)编写的,可以为不同的CPU重建。在像gentoo这样的分发中,您也可以从源代码重建整个操作系统。

      

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

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

      

    源代码是纯文本。

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

      

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

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

      

    OpenGL是一个库。

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

      

    因此,OpenGL必须是特定于OS /处理器的。

    不正确的结论。

      

    如何与操作系统无关?

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