编译器与操作系统本质的区别是:编译程序是一支将抽象度较高的编程语言程序(也称源程序)转化成抽象度较低的编程语言程序;操作系统是一类比较独立的系统程序,操作系统有支持各种图灵机的体系类型.
一、编译器与操作系统本质的区别
译程序是一支将抽象度较高的编程语言程序(也称源程序)转化成抽象度较低的编程语言程序(也称目标程序)的程序。抽象度的两端分别是机器语义和人理解语义。处理器体系和编程语言是一支编译程序的根本属性。
以上对编译程序的定义描述在现代意义下对全面认识编译程序是不够的,因为它没有涉及操作系统,没有涉及现代的复杂的程序构建过程。有一定开发经验的程序员都知道,程序的“编译过程”包括编译、链接(静态链接与动态链接)、调试,还可能包括组态配置和安装两步。“编译”一词已经不能很好描述这个过程。整个过程可称为程序构建,而编译只是名列前茅步,在这一点上,编译程序在传统意义上与现代意义上产生了不同。
操作系统是一类比较独立的系统程序,操作系统有支持各种图灵机的体系类型,比如16位DOS,32位Windows,X86的BSD,ARM的 Linux等。而系统程序一般是指一支为应用程序直接提供半成品(为应用程序提供执行的虚拟环境)和协调多个应用程序并行运行的程序。所谓半成品是指,系统程序的一部分(指令序列)也是应用程序的一部分(指令序列),但这部分程序不专属任何应用程序,它是共享的。例如各种新硬件的驱动程序、C标准库函数、POSIX库函数等。而作一个协调程序,操作系统表现出与一般应用程序的程序性,如独立调度的线程,只是它们运行在权力更高的状态下。协调程序如线程调度程序。
延伸阅读:
二、非操作系统程序与操作系统的关系
操作系统泛指像Linux这样的现代32位操作系统,而非操作系统程序运行在操作系统之上,对操作系统存在可能的依赖的程序。
其实只要是运行在某操作系统之上的程序都会烙上该操作系统的印,对操作系统有依赖,包括编译程序。不过这些程序对操作系统的依赖程度和依赖的内容确实有很多区别。例如一支最简单的Hello world程都会对操作系统的C库产生依赖,如果去掉Hello world程序的输入输出功能,只作加减或逻辑运算,Hello world程序依然会对操作系统有少量依赖,因为Hello world程序由运行在该操作系统上的编译程序编译的,有特定的目标文件格式,并由该操作系统的载入程序载入内存运行。这种只在形式上对OS存在依赖的“无用”程序可谓是最独立于OS的程序。在此基础之上,其它程序都对OS有不同程度的依赖,依赖表现在对OS内的各种程序库的依赖,比如C标准库,POSIX系统库,线程库、网络库和其它基于这些基础库的第三方应用代码库。