码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 编译链接(Compile Link)


    文章目录

    • 前言
    • 一、翻译环境
      • 1、概念
      • 2、翻译环境的组成
      • 3、什么是编译链接?
    • 二、编译
      • 1、编译的阶段
      • 2、预编译
      • 3、编译
        • 1、什么是语法分析?
        • 2、什么是词法分析?
        • 3、什么是语义分析?
        • 4、什么是符号汇总?
      • 4、汇编
        • 1、符号表展示
    • 三、链接
        • 1、什么是段表?
        • 2、段表的合并
        • 3、符号表的合并和重定位
    • 总结


    前言

    在ANSI C的任何一种实现中,存在两个不同的环境。
    第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
    第2种是执行环境,它用于实际执行代码。
    接下来我们就来讲解 翻译环境


    一、翻译环境

    1、概念

    计算机可以识别二进制指令,而我们写的代码时文本信息,计算机无法识别,需要翻译环境进行翻译后,计算机才能识别运行。

    2、翻译环境的组成

    翻译环境由编译和链接两部分组成

    3、什么是编译链接?

    如下图所示:

    在这里插入图片描述

    二、编译

    1、编译的阶段

    编译分为:
    1、预编译(预处理)
    2、编译
    3、汇编

    一共三阶段

    2、预编译

    VS身为集成开发环境,集成了编译器(cl.exe),链接器(link.exe)和调试器
    所以VS不好演示这一过程,这里我们可以使用Linux上的gcc编译器演示

    预编译处理的:
    1、头文件的展开
    2、注释删除
    3、宏替换
    这些都是文本操作,所有的预处理指令都是在预处理阶段完成的。


    3、编译

    编译处理的:
    1、把c语言代码翻译成了汇编语言
    2、语法分析
    3、词法分析
    4、语义分析
    5、符号汇总

    1、什么是语法分析?

    语法分析(syntax analysis)是编译程序的核心部分,其任务是检查词法分析器输出的单词序列是否是源语言中的句子,亦即是否符合源语言的语法规则。


    2、什么是词法分析?

    词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。


    3、什么是语义分析?

    语义分析是编译过程的一个逻辑阶段, 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。如有的编译程序要对实数用作数组下标的情况报告错误。又比如某些程序规定运算对象可被强制,那么当二目运算施于一整型和一实型对象时,编译程序应将整型转换为实型而不能认为是源程序的错误。


    4、什么是符号汇总?

    符号汇总:汇总全局变量
    在这里插入图片描述
    在这里插入图片描述


    4、汇编

    汇编所处理的:
    1、把汇编代码形成二进制指令
    2、形成符号表

    1、符号表展示

    在这里插入图片描述
    在这里插入图片描述


    三、链接

    链接处理的:
    1、合并段表
    2、符号表的合并和重定位

    1、什么是段表?

    在分段式存储管理系统中,每个进程或程序都有一个或多个逻辑段,为使程序或称进程能正常运行,亦即,能从物理内存中找出每个逻辑段所对应的位置,在系统中为每个进程建立一张段映射表,简称段表,段表记录了进程中每一个段在内存中的起始地址(又称为 “基址” )、段号和段的长度。


    2、段表的合并

    在这里插入图片描述


    3、符号表的合并和重定位

    重定位:将无效的地址去掉
    在这里插入图片描述
    extern中的Add只是声明,没有明确的空间,为无效值。

    总结

    在这里插入图片描述

  • 相关阅读:
    CentOS7.5虚拟机扩展xfs文件系统
    【滤波器设计】根据设计指标使用matlab定制滤波器
    【精讲】vue v-if的demo案例、v-show案例、v-for循环遍历案例
    基于PSO的UAV三维路径规划(Matlab代码实现)
    C语言——冒泡排序法与简单选择排序法及其区别
    Less基础速学 —— 混入、运算、继承
    数字化转型:2023零售业的新机遇,亿发零售云系统释放无限可能
    Springboot+vue的船舶监造系统(有报告)。Javaee项目,springboot vue前后端分离项目。
    初识Java 5-1 实现隐藏
    docker容器无法访问解决方法
  • 原文地址:https://blog.csdn.net/2301_78995005/article/details/133870085
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号