day1:编译器、操作系统的一些问题

文章目录

  • 定义
  • 机器码和可执行程序

定义

编译器:是一个软件、主要功能将高级语言编写的源代码转成对应硬件平台的机器码。
注意:在使用的时候我们一般用一个完整的编译工具链:编译器、汇编器、链接器。但是由于编译器的功能较为强大,我们会更关注与学习这个。
高级语言到机器码的大致步骤:

  1. 高级语言–>汇编语言:编译器
    1. 编译器首项将高级语言代码转换成汇编语言。在这个过程中会包含语法分析、语义分析、中间代码生成以及优化等步骤。
    2. 编译器生成的汇编代码是基于对应硬件平台的。
  2. 汇编语言–>机器码:汇编器
    编译器会调用汇编器(或编译器内置的汇编器功能)将汇编语言代码转化成机器码。这里就相当于一对一的翻译过程了。
  3. 链接:链接器
    这些机器码通常还需要被链接器处理。链接器将各个编译单元(不同的源文件产生的目标文件)和库文件合并,生成最后的可执行文件。

操作系统:也是一个软件,主要是管理计算机的各种硬件资源,包括CPU、内存、输入输出等,为运行在计算机上的程序提供基础服务。

在编译工具链操作完成之后得到的可执行文件。当运行这个可执行文件时,操作系统介入并执行其中几个关键步骤。

  1. 机器码的加载
    操作系统会加载这个文件到内存中。这里涉及到读取文件内容并将其放置在内存合适的位置上
  2. 资源管理和隔离
    当程序需要执行时,操作系统分配给他必要的资源,并确保不会干扰到其他正在运行的程序。这里涉及到分配内存空间、设置CPU时间片等。
  3. 系统调用和硬件访问
    如果在程序中需要进行文件操作、网络通信或者其他设计硬件的操作,它通过系统调用请求操作系统提供服务。操作系统之后会代表程序来执行这些底层操作。这种机制确保了系统的安全和稳定性,因为程序没有直接访问硬件的权限。
  4. 程序的执行
    一旦程序加载到内存、并且得到了执行的必要资源,CPU开始执行内存中的机器码。

所以下面的表格可以帮助理解抽象理解他们的层级关系:

层级 描述
高级语言 提供与机器无关的编程方式,易于人类理解和编写。
编译器 将高级语言代码转换为机器码,提供语法分析、优化等功能。 编译器提供了库函数,库函数中有封装了系统调用printf()
操作系统 管理硬件资源,为程序提供运行环境,提供系统调用接口。 操作系统提供系统调用open(),write()
硬件 执行计算和数据处理任务的物理基础,包括CPU、内存、存储设备等。

机器码和可执行程序

机器码∈可执行程序
机器码:是由高级语言编译的结果,存在内存中代码段或者文本段。
可执行程序:不仅包含编译生成的机器码,还包含了全局变量、静态变量、程序元信息(程序入口地址、必要的库引用信息)等。
因此一个C语言代码,其中并不是所有部分都转换为机器码,定义程序的逻辑(机器码),数据(转换为内存中的数据结构)记忆程序的结构(函数、变量等)。全局变量静态变量不是转换为机器码,而是分配在程序的数据段或者全局区域。

总结:C语言源代码在编译过程中被转换成了机器码和数据定义。这些机器码和数据定义,连同必要的元信息和其他资源,共同构成了最终的可执行文件。当可执行文件被加载到内存时,它变成了一个运行中的进程,机器码被CPU执行,而数据(如全局变量)则存储在内存的特定区域中。

你可能感兴趣的:(操作系统,系统架构,面试)