首页 > 其他分享 >零基础非科班也能掌握的C语言知识21 编译链接(介于作者实力有限并且没有可以演示的过程软件仅仅浅谈)

零基础非科班也能掌握的C语言知识21 编译链接(介于作者实力有限并且没有可以演示的过程软件仅仅浅谈)

时间:2024-06-12 20:32:36浏览次数:14  
标签:文件 语法分析 浅谈 C语言 编译 test 2.1 链接 21

编译链接

1.翻译环境和运行环境

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

  • 编译环境
  • 运行环境
    在这里插入图片描述

2.翻译环境

  • 翻译环境由编译和链接两个大的过程组成的,而编译又可以分解成:预处理(也叫预编译)、编译、汇编三个过程
    在这里插入图片描述
    一个项目中有多个C语言文件,那多个.c文件如何生成可执行程序呢
    多个.c文件单独经过编译器,编译处理生成对应的目标文件,多个目标文件和链接库一起经过链接器处理生成最终的可执行程序
    那么接下来重点讲编译过程中的三个过程
    在这里插入图片描述

2.1 编译

译又可以分解成:预处理(也叫预编译)、编译、汇编三个过程

2.1.1 预处理(预编译)

在预编译阶段,源文件和头文件会被处理成为.i为后缀的文件
大家若有VSCode可以自己尝试(博主并没有的说)

gcc -E test.c -o test.i

在这里插入图片描述

2.1.2 编译

编译过程就是将预处理后的文件进行一系列的:词法分析、语法分析、语法分析及优化,生成相应的汇编代码文件。
编译过程的命令如下:

gcc -S test.i -o test.s

例子
array[index] = (index+4)*(2+6);
语法分析
词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程
词法分析
在这里插入图片描述
语法分析
语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC等工具自动生成。
在这里插入图片描述
语义分析
语义分析是编译过程的一个逻辑阶段, 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。
在这里插入图片描述

2.1.3 汇编

汇编器是将汇编代码转转变成机器可执⾏的指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表⼀⼀的进⾏翻译,也不做指令优化。

gcc -c test.s -o test.o

2.2 链接

链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。
链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。
例子
在这里插入图片描述
在test.c文件中我们会给函数main和Add一个地址,当然我们在test.c文件中找不到Add函数,此时我们会给一个虚假的地址,然后在add.c文件中我们也会给函数Add一个地址,在链接过程中test.c文件中Add函数的地址会被替换成add.c文件中的Add函数的地址,当然这里只是浅谈,感兴趣的话大家去了解

3.运行环境

  • 程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。
  • 程序的执⾏便开始。接着便调⽤main函数。
  • 开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。
  • 终⽌程序。正常终⽌main函数;也有可能是意外终⽌。

标签:文件,语法分析,浅谈,C语言,编译,test,2.1,链接,21
From: https://blog.csdn.net/Yusei_0523/article/details/139635249

相关文章

  • C语言指针介绍加练习
    #指针相关介绍定义    指针(Pointer),通常用于数据的间接访问,指针存储的是指向变量的首地址,16位平台就是2位,如果在32位平台,地址就是4个字节,如果实在64位平台,地址就是8个字节(1Byte=8bit),Int类型4Byte char类型1Byte这个是变量在内存中,分配的地址大小,在内存中一个By......
  • C语言王国——数组的旋转(轮转数组)三种解法
    一、题目给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]示例......
  • C语言字符串处理函数strstr的用法
    C语言字符串处理函数strstr的用法在C语言中,strstr函数是一个字符串处理函数,用于在一个字符串(称为“主字符串”)中查找另一个字符串(称为“子字符串”)的首次出现。如果找到子字符串,则该函数返回一个指向主字符串中子字符串首次出现位置的指针;如果没有找到,则返回NULL。函数的原型定......
  • Linux Mint 21.3简介
    LinuxMint21.3是一个更新版本,其中包含了许多新特性和改进。以下是一些主要更新内容:1.Cinnamon6.0桌面环境:LinuxMint21.3采用了最新的Cinnamon6.0桌面环境,带来了新的功能和改进,例如支持Wayland会话(尽管仍处于实验性阶段)、改进的声音和电源小部件、对AVIF图像格式的新支......
  • c语言开发 php扩展 sm4
    首先php可以直接调用openssl直接进行sm4sm3的加密如:openssl_encrypt($plaintext,'sm4-cbc',$key,OPENSSL_RAW_DATA,$iv);openssl_digest('123','sm3')php如果直接调用sm2需要统一使用openssl的evp接口openssl1.1的源码在sm2_crypt文件里面此处只是学习/*gmteste......
  • [SWPUCTF 2021 新生赛]简简单单的逻辑
    查看源代码,大概意思就是已知result反推flagflag='xxxxxxxxxxxxxxxxxx'list=[47,138,127,57,117,188,51,143,17,84,42,135,76,105,28,169,25]result=''foriinrange(len(list)):key=(list[i]>>4)+((list[i]&0xf)<<......
  • 2024.05.21
    今日学习时长:83分钟;代码行数:41行博客数量:1篇今天主要开始了数据库实验三的操作,今天的大部分时长都在研究SQLserver数据库中的用户的新建和权限修改。SQLsever中直接用windows验证登录后可以在安全性—>登录名下新建一个用户,但是在切换为用户名+密码登录后,我发现我无法打开查......
  • c语言实现密码学算法应用
    一实验目的   1、掌握对称密钥密码体制的基本概念;   2、掌握对称密钥密码体制DES加密/解密的工作原理;   3、掌握非对称密码算法RSA加密/解密的基本原;   4、通过用DES和RSA算法对实际的数据进行加密/解密运算深刻理解加密算法原理。二实验内容   根据给......
  • c语言目录操作
    在shell中我们可以直接输入命令pwd来显示当前的工作目录,在C程序中调用getcwd函数可以获取当前的工作目录。函数声明:char*getcwd(char*buf,size_tsize);需要头文件:#includegetcwd函数把当前工作目录存入buf中,如果目录名超出了参数size长度,函数返回NULL,如果成功,返回buf......
  • C语言详解(编译和链接)
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......