• 【C语言】程序环境深度剖析


    前言:

    作者简介:爱吃大白菜1132

    人生格言:纸上得来终觉浅,绝知此事要躬行

     

    如果文章知识点有错误的地方不吝赐教,和大家一起学习,一起进步!

     

    如果觉得博主文章还不错的话,希望三连支持!

    目录

    程序的翻译环境和执行环境

    翻译环境 

    预处理

     编译

    汇编

    链接

    执行环境


    程序的翻译环境和执行环境

     第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。

     第2种是执行环境,它用于实际执行代码。

     编译环境和执行环境的宏观表达:

    翻译环境 

     翻译环境形象化解析图:

    条件:建立两个程序,test和add

    注:以下操作均在Linus中 

    预处理

             通过gcc编译器运用指令:gcc -E test.c -o test.i。可以让程序进行到预处理停止。

            预处理中会将程序中的注释去除,#define的宏定义会改变成定义的值,将头文件展开。


    预处理前:                                                                                 预处理后:

     编译

            这个过程会今天语通过gcc编译器运用指令:gcc -E test.c -o test.i。可以让程序进行到编译停止。法分析、词法分析、语义分析、符号汇总,最终C语言转换为转换成汇编语言。


    编译前:                                                                            编译后:                     

     符号汇总:

    注:符号汇总的是函数,对局部变量不汇总。

    汇编

            通过gcc编译器运用指令:gcc -s test.c 。可以让程序进行到汇编停止。

             汇编这个步骤会把上一步转换成的汇编指令在转换成二进制指令,二进制指令才是计算机最终能读懂的指令。

            汇编还会将编译中符号汇总进一步优化,优化成汇总符号表。

    链接

             通过gcc编译器运用指令:gcc test.o -o test 。可以让程序进行到链接停止。

            合并段表。

            符号表的定义和重定位。

    执行环境

            1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。

            2. 程序的执行便开始。接着便调用main函数。

            3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。

            4. 终止程序。正常终止main函数;也有可能是意外终止。

  • 相关阅读:
    Spring cloud gateway+apollo=bug?
    ES6 入门教程 19 Generator 函数的语法 19.2 next 方法的参数
    递推递归与排列组合
    ASEMI快恢复二极管ES5JB参数,ES5JB特性,ES5JB机械数据
    SpringBoot 将 jar 包和 lib 依赖分离,dockerfile 构建镜像
    TCP/IP网络模型
    TCP协议
    【spring】第一篇 IOC和DI入门案例
    华为云计算之物理节点CNA安装教程
    聚观早报 | 苹果已开始录制秋季发布会;谷歌将推出高端折叠手机
  • 原文地址:https://blog.csdn.net/qq_65228171/article/details/127360088