程序的编译与执行环境

简介:

@[TOC]

前言

  • 本文简要概述程序的编译环境与执行环境的流程,其中编译环境中的预处理过程,重点放在了另外一边博客:预处理
  • 博主的问题收集与自我解答:New Young
  • 转载请标明出处:New Young

程序的环境

在ANSI C 的任何一种实现中:都有2种环境:

编译环境: 编译器将源代码(后缀.c文件中的代码)转换为包含机器语言(二进制代码)的目标代码文件,同时通过链接器 将 目标文件与 库文件,启动代码文件进行链接 生成 可执行的代码文件。这一过程又可细分为 预处理,编译,汇编,链接。

执行环境:执行可执行代码文件 。

image-20220124202843486

编译环境

预处理

预处理进行的是文本操作,不进行任何相关计算。

  • 库文件的包含
  • (.h)文件中是一些声明或者是自定义类型的声明等。一旦程序调用某些未声明函数,程序会creash。
  • 宏的文本替换和预处理指令的操作等
  • 去除程序注释内容
  • 。。。

编译

分为2步:

  • 分别将每个文件中的全局变量名和函数名进行汇总。
  • 这也是,为什么在使用函数或者变量时,要进行 提前声明,或者定义式声明,或者引用式声明(extern)
  • image-20220125143111145
  • 通过 词法分析,语法分析,语义分析,分析代码的意思,将源代码转换为汇编语言。

image-20220125111436348

汇编

  • 将编译完成的汇编代码 转换为 机器可以识别的二进制代码,生成目标代码文件.
  • 对每个符号和其地址 汇总到一个表中---符号表。
  • 这样在程序遇到符号名,就可以通过地址,访问符号。

image-20220125143514900

链接

  • 对所有符号表进行合并和重定位。

    因为不同的文件中的符号可能有重名的,这样就需要确定唯一的有效符号。

image-20220125143707259

  • 合并断表。
  • 将启动代码,库代码(更多的是将程序用到库函数代码进行链接),目标代码文件,链接,生成可执行文件 (,exe)。
  • 这也是为什么,在使用库函数 printf等,我们只需要在文件中 include <stdio.h>等库文件。

执行环境

  • 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  • 程序的执行便开始。接着便调用main函数。
  • 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
  • 终止程序。正常终止main函数;也有可能是意外终止 .
相关文章
|
存储 SQL Linux
MinIO客户端安装教程(Window版)
MinIO客户端安装教程(Window版)
1859 0
|
存储 算法 数据管理
分布式存储的多副本纠删码简介
分布式存储的多副本纠删码简介
|
关系型数据库 Unix Linux
fdisk、parted无损调整普通分区大小
我们讲的调整分区大小,都是要保证不损坏分区中数据为前提。 这里我们讲一下用fdisk、parted调整普通分区的方法。 切记:一般都只用于扩容分区,如果要缩减分区,特别是根目录,可能会出问题 而扩容分区时,要保证跟扩容分区相邻的分区是未分配的(或者可以先暂时删除的)
14335 2
|
弹性计算 安全 Ubuntu
阿里云服务器如何安装宝塔面板教程汇总(图文教程)
阿里云服务器如何安装宝塔面板教程汇总(图文教程)
|
机器学习/深度学习 自然语言处理 算法
RAPTOR:多模型融合+层次结构 = 检索性能提升20%,结果还更稳健
本文探讨了通过多模型集成技术提升信息检索系统性能的方法,重点介绍了RAPTOR框架。RAPTOR通过构建层次化的信息组织结构和递归摘要技术,显著提高了检索系统的性能和适应性。研究建立在RAG Fusion技术基础上,旨在提供更全面的信息检索解决方案。
900 2
RAPTOR:多模型融合+层次结构 = 检索性能提升20%,结果还更稳健
|
9月前
|
人工智能 JavaScript Java
从零开始教你打造一个MCP客户端
Anthropic开源了一套MCP协议,它为连接AI系统与数据源提供了一个通用的、开放的标准,用单一协议取代了碎片化的集成方式。本文教你从零打造一个MCP客户端。
6450 5
|
弹性计算 运维 Ubuntu
|
10月前
|
人工智能 运维 监控
Zabbix告警分析新纪元:本地DeepSeek大模型实现智能化告警分析
本文由Zabbix中国峰会演讲嘉宾张世宏撰写,介绍如何通过集成Zabbix监控系统与深度求索(DeepSeek)AI助手,构建智能化告警处理方案。该方案利用Webhook机制传递告警信息,借助DeepSeek的智能分析能力,帮助运维团队快速识别问题根源并提供解决方案。文章详细描述了技术架构、环境搭建、Webhook配置及实际案例,展示了AI在运维领域的应用前景和优势。
1433 0
|
12月前
|
运维 Prometheus 监控
🎉 WatchAlert - 开源多数据源告警引擎【运维研发必备能力】
WatchAlert 是一个开源的多数据源告警引擎,支持从 Prometheus、Elasticsearch、Kubernetes 等多种数据源获取监控数据,并根据预定义的告警规则触发告警。它具备多数据源支持、灵活的告警规则、多渠道告警通知、可扩展架构和高性能等核心特性,帮助团队更高效地监控和响应问题。项目地址:https://github.com/opsre/WatchAlert
1507 18
🎉 WatchAlert - 开源多数据源告警引擎【运维研发必备能力】
|
12月前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
2613 16
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器