• 程序的环境


    前言

    我们平时在编译器上编写代码,然后运行代码,最后得到程序的运行结果。这让我们不经好奇:程序在电脑中到底经过了什么样的变化,使得它最终生成了我们想要得到的结果,因此今天就来了解一下程序的环境

    一、程序环境分类

    ANSI C(标准C)的任何一种实现中,存在两个不同的环境

    第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令,机器可以读懂的指令)。
    第2种是执行环境,它用于实际执行代码。

    二、翻译环境

    1.总体流程

    在这里插入图片描述
    每一个源文件(.c文件)独立的通过编译器的编译,都会生成一个与之对应的目标文件(.obj文件)。将程序中所有的目标文件一起同时加上链接库里的数据(平时用的头文件等都是在系统的链接库里的),再通过链接器的链接,就会产生一个可执行程序(.exe文件)
    具体的流程如下:
    在这里插入图片描述

    2.编译

    由上图可以看到,编译过程主要包含了预处理、编译和汇编这三个步骤。
    接下来进行具体讲解:

    2.1预编译

    预编译,又称为预处理
    如果要在Linux环境下对源文件(test.c)实现这一步,需要的命令是:
    gcc test.c -E -o test.i
    (然后就生成了 .i文件)
    主要工作(文本操作)
    1、头文件的包含;
    2、宏的定义的替换;(将宏定义的符号用具体的值替换,即,删除宏定义的符号)
    3、注释的删除;(注释是方便程序员阅读代码,编译器不需要)
    ……等。

    2.2编译

    在Linux环境下,对文件(test.i)进行编译操作,需要的命令
    gcc test.i -S
    (生成 .s文件)
    主要工作
    1.把C语言代码转化成汇编代码
    2.主要进行:
    ①语法分析;②词法分析;③语义分析;④符号汇总等。

    2.3汇编

    在Linux环境下,对文件(test.s)进行汇编的命令
    gcc test.s -c
    (生成 .obj文件)(linux下是.o文件)
    主要工作
    1.把汇编代码转化为二进制代码;
    2.形成符号表
    主要有包括全局变量(不包括局部变量)、函数……等(基于编译部分的符号汇总)。

    3.链接

    主要工作:
    1.合成段表
    Linux环境下的可执行程序都是elf格式,因此可以将经过编译步骤生成的可执行程序进行合并成一个段表。
    2.符号表的合并和重定义
    这样就可以跨源文件查找函数或者全局变量
    下面举个关于符号表的例子:
    在这里插入图片描述

    三、运行环境

    程序执行的过程:

    1. 程序必须载入内存中。
      在有操作系统的环境中:这个步骤一般由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
    2. 程序的执行便开始。
      开始调用main函数
    #include 
    int main()
    {
    	int i = 0;
    	for (i = 0; i<10; i++)
    	{
    		printf("%d ", i);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 开始执行程序代码。
      这个时候程序将使用一个运行时堆栈(stack)【可以参考函数栈帧】,存储函数的局部变量和返回地址。也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
    2. 终止程序。
      正常终止main函数;也有可能是意外终止。

    总结

    以上就是今天要讲的内容,本文介绍了程序的环境,主要对程序的翻译环境进行了了解。
    本文作者目前也是正在学习编程方面的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出也欢迎大家在评论区提问、交流。
    最后,如果本篇文章对你有所启发的话,也希望可以多多支持作者,谢谢大家!

  • 相关阅读:
    5G/4G/北斗遥测终端机全国各省水利平台无缝对接
    centos7 + mysql 8 安装confluence7.19.3
    pytest简明教程
    Leetcode周赛371补题(3 / 3)
    中英文说明书丨艾美捷T7 RNA聚合酶介绍
    基于SpringBoot的导师双选系统设计与实现
    数据结构的无头单向链表
    《lwip学习7》-- IP协议
    异常(Exception)
    电子学会2023年6月青少年软件编程(图形化)等级考试试卷(二级)真题,含答案解析
  • 原文地址:https://blog.csdn.net/xjjxjy_2021/article/details/128005214