C语言——二周目——程序的翻译与执行环境

2023-10-22 01:04

本文主要是介绍C语言——二周目——程序的翻译与执行环境,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、程序环境

        对于一个C语言程序的实现,整个过程一般存在两个不同的环境,分别是翻译环境与执行环境。在翻译环境中,我们所写的源代码经过一系列处理被转换成为可执行的机器指令;在执行环境中,会实际执行代码。

        整个程序在这两个环境中处理,由我们所写的.c文件最后变为.exe文件。

        该图便是程序在翻译与运行过程中的流程,每一个源文件通过编译转换为单独的一份目标代码,这些生成的目标文件最后由链接器捆绑在一起,链接器同时引入标准库与个人库内容,从而形成一个单一而完整的可执行程序。

        以下的内容,我们会一一介绍这些流程具体做了哪些事情。 

二、程序的翻译环境

1.编译

1.1预编译(预处理)

        在该过程中,源文件会从 .c文件 变为 .i文件 ,所进行的操作均为文本操作。具体的操作包括:

        ①注释的替换(删除)。在预编译阶段,代码中所写的注释信息会被用一个空格进行替换。

        ②头文件的包含。代码中通过#include所包含的头文件都会被引入,并且在此展开。

        ③#define 符号的替换。该阶段会将定义的常量、宏等进行替换。

1.2编译

        在该过程中,源文件会从 .i文件 变为 .s文件,将c语言代码翻译成为了汇编代码。具体的操作包括:

        ①词法分析;

        ②语法分析;

        ③语义分析;

        ④符号汇总。符号汇总的符号都是是针对全局的。

        在此处会生成语法树来构建整个语句,因其操作偏底层,所以挖个坑,等我们详细了解了编译原理之后再来把这个坑给填平。

1.3汇编

        在该过程中,源文件会从 .s文件 变为 .o文件,将汇编代码翻译成为了二进制的指令,即目标文件。

        在此时会生成符号表,所谓符号表即为编译时所汇总的符号的总和,其记录了符号名与指向的地址。以函数为例,对于在该源文件内声明并且定义的函数,会记录函数名与其地址;而对于只声明未定义的函数,会记录其函数名,地址则为一个随机指向的地址。

2.链接

        在链接的过程中,链接器会链接该项目下所有通过编译所生成的.o目标文件,同时链接链接库生成可执行程序。

        在该过程中会:①合并段表;②符号表的合并与重定义。具体则是将每一个目标文件中的符号表进行合并,相同的符号名会给予一个正确的地址,所以此时如果对于一个函数没有定义只有声明,便会报告链接错误。

三、程序的运行环境

        程序运行必须载入内存中,程序开始执行后调用main函数,然后执行代码直至终止程序。终止程序可能是main函数正常终止,也有可能是意外终止。

这篇关于C语言——二周目——程序的翻译与执行环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/258097

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

高并发环境中保持幂等性

在高并发环境中保持幂等性是一项重要的挑战。幂等性指的是无论操作执行多少次,其效果都是相同的。确保操作的幂等性可以避免重复执行带来的副作用。以下是一些保持幂等性的常用方法: 唯一标识符: 请求唯一标识:在每次请求中引入唯一标识符(如 UUID 或者生成的唯一 ID),在处理请求时,系统可以检查这个标识符是否已经处理过,如果是,则忽略重复请求。幂等键(Idempotency Key):客户端在每次

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip