首页 > 编程语言 >C语言程序环境

C语言程序环境

时间:2023-04-09 15:00:48浏览次数:46  
标签:gcc 程序 代码 环境 C语言 源文件 编译 test

前言

早期的程序员,使用的是二进制语言编写代码,之后发展出汇编语言,B语言,C语言等等,其中,二进制语言是机器可以识别的语言,但对于程序员来说理解可能较为困难,发展到C语言时,我们所写的代码已经经过不断优化,使得程序员能清晰的明白代码的含义,但最终,我们要想机器识别出我们所写的代码,还需要把所写代码转换为机器指令

一、程序环境

什么是程序环境?

在ANSI C的任何一种实现中,都存在两个不同的环境

第一个是翻译环境,用于将我们所写的源代码转换为机器所能识别的机器指令,也就是二进制指令

第二个是执行环境,用于实际执行代码

其中翻译环境又包括预编译(预处理),编译,汇编,链接几个步骤,

源代码从编译到执行一共经历哪些步骤呢?

C语言程序环境_编译

如图,源文件会经过预编译、编译、汇编、链接后,生成可执行程序(后缀为.exe),最后执行

二、编译环境

为了更好的观察编译的不同阶段所发生的情况,我们在VSCode上搭建了gcc环境,在gcc环境下来逐步剖析编译阶段对源代码做的处理

2.1预编译(预处理)阶段

C语言程序环境_源文件_02

如图,我们创建了一个test.c源文件,内容有头文件的包含,#define定义的标识符MAX,一行注释,创建并输出一个拥有MAX个元素的整型数组

当我们在文本行输入指令gcc test.c -E -o test.i

代表的意思是在gcc环境下,对test.c文件进行预处理(-E),并将结果输出(-o)到test.i中,当我们敲下回车后,左边生成了test.i文件,

让我们来看看源文件经过预处理后会发现哪些变化

C语言程序环境_源文件_03

1.在main函数前,多了800多行未知代码

2.在源文件所写的注释不见了

3.#defien定义的标识符MAX全部被10所替代

结合我们所写的全部内容,不难推断出开头的800多行代码就是包含的头文件的内容,同时我们也可以通过与stdio.h头文件的对比判断出,确实是包含的头文件的内容(并且做了简化处理)

C语言程序环境_程序环境_04

C语言程序环境_编译_05

2.2编译阶段

C语言程序环境_程序环境_06

在文本行(终端)输入指令gcc test.i -S 

表示在gcc环境下对test.i进行编译,按下回车后,左边生成一个.s文件,其内容是将C语言翻译成的汇编代码,我们可以在vs2019环境下查看相同代码的汇编代码

C语言程序环境_目标文件_07

除此之外,在编译阶段还有一些复杂的处理,如语法、词法、语义、分析,符号汇总 ,有兴趣者可以深入了解

2.3汇编阶段

作用:

1.将汇编代码转换为二进制指令,生成目标文件(也是二进制文件),在gcc环境下后缀为.o,在vs中后缀为.obj

2.形成符号表,有兴趣者可深入了解

输入指令:gcc test.s -c

C语言程序环境_编译_08

2.4链接阶段

我们了解到到源文件在经过编译三步走之后,会生成一个后缀为.o(gcc环境下)的目标文件,事实上,每一个源文件都会由编译器单独的处理,生成与源文件相对于的目标文件,这些目标文件汇聚在一起,同链接库一起经链接器处理后,生成可执行程序(后缀为.exe),如图

C语言程序环境_程序环境_09

C语言程序环境_源文件_10

输入指令gcc test.o -o test.exe

将目标文件和链接库经链接器处理,生成可执行程序,左边出现text.exe文件

三、执行环境

程序执行的过程:

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

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

3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(

stack),存储函数的局部变量和返回

地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程

一直保留他们的值。

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




标签:gcc,程序,代码,环境,C语言,源文件,编译,test
From: https://blog.51cto.com/u_15466618/6178881

相关文章

  • ffmpeg 英特尔核显加速 (ubuntu环境)
    seokw:ffmpeg核显ffmpeg加速ffmpeg慢ffmpeg优化英特尔核显ubuntuffmpegubuntu视频正文安装i965-va-driversudoapt-getinstalli965-va-driver然后在ffmpeg命令中加入-hwaccelvaapi同时如果不介意码率低点可以加入-presetultrafast然后示范一下1.mkv转到2......
  • 9_1 程序设计语言与语言处理程序基础
    9.1法律法规知识(知识产权)前言9.2法律法规知识(保护期限)9.3法律法规知识(知识产权人确定)委托创作,合作开发9.4法律法规知识(侵权判定)9.5法律法规知识(标准的分类与标准的编号)......
  • Python-venv-创建和管理虚拟环境
    Python-venv-创建和管理虚拟环境https://docs.python.org/3/tutorial/venv.html概述Python应用程序通常会使用不在标准库内的软件包和模块。应用程序有时需要特定版本的库,因为应用程序可能需要修复特定的错误,或者可以使用库的过时版本的接口编写应用程序。这意味着一个Pytho......
  • ava: 程序包com.alibaba.nacos.api.common不存在_RuoYi-Cloud-Plus-master_jar包不存
    来看看原因吧,jar包是存在的,但是就是在idea中引用不到,来看看怎么回事: 原来就是这个包找不到,但是从下面看是有的: 但是注意,这里的com.alibaba.nacos.api...原来可不是这样的,这个是我后来修改过的,原来是只有com.alibaba.nacos.common,而引用的是com.alibaba.nacos.api.commo......
  • 搭建SSH环境 [Arch Linux] [Xshell] [VirtualBox]
    搭建SSH环境[ArchLinux][Xshell][VirtualBox]1.主机ping通虚拟机网卡1:虚拟机能ping通主机+虚拟机能连接外网网卡2:主机能ping通虚拟机2.获取虚拟机IP(注意是网卡2的IP,即与主机在同一网关的IP)ifconfig此处我的虚拟机IP为192.168.56.101与主机VirtualBox网卡在同一......
  • 关于开发环境中的charset问题
    中文的最大麻烦就是不同charset在实际的字节存储是不同的。而Windows的缺省为GBK,Linux的缺省为UTF-8。一个汉字的GBK中的存贮在2个字节,在UTF-8中存贮在3个字节,如果字符集不统一,就会出现显示乱码的现象,如果设计到数据库的存储,问题就更大。一般而言,不同的程序相互交互,一般会使用更为......
  • C语言的回调函数原来这么简单
    手机端阅读:C语言的回调函数原来这么简单 了解开发语言的朋友应该都会对回调函数有所了解,在很多的程序开发语言中都能看到回调的身影。很多场景下,当某个条件成立以后我们希望代码执行某些指定的部分,这个时候可以考虑使用回调函数的方式,这样做思路更加的清晰,也能使代码结构的逻辑更加......
  • 算法学习之冒泡排序【C语言】
    冒泡排序排序规则冒泡排序的规则是相邻的两个数字依次比较,如果前面的数字比后面的数字大,则交换它们的位置,否则保持不变,直到遍历完所有的数字。这个过程会不断地进行,直到所有的数字都按照从小到大的顺序排列好。双层循环在冒泡排序的算法中,需要使用两层循环来实现排序功能。for(int......
  • C语言本地变量的规则
    以以下一段代码为例:1#include<stdio.h>2//以下代码是否能交换两个变量的值?3voidswap(inta,intb);45intmain()6{7inta=5;8intb=6;910swap(a,b);1112printf("%d,%d",a,b);1314return0;15}16......
  • Chaosd 模拟两地三中心集群的网络环境
    作者:pepezzzz环境准备集群名称和版本tidb集群:tidb-h版本:v6.6.0集群拓扑:单中心模拟部署两中心部署拓扑,延时要求如下:模拟场景源目标延时同城172.16.x.71,72172.16.x.73,741.5ms异地172.16.x.66~68,71~74,77172.16.x.67200ms软件版本:chaosdx86平台:curl-fsSL-ochaosd-v1.2......