编译和链接

要闯入计算机的世界就逃不过编程这个词,编译和链接是编程过程中的两个重要步骤。在编写源代码后,需要通过编译和链接才能生成可执行文件。

引言——什么是编程

编程是编写程序的中文简称,就是让计算机代为解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程

为了使计算机能够理解人的意图,人就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。

之前我在《C语言——数据在内存中的存储_学习笔记》一文中提到,数据在内存中是以二进制的形式存储的,也就是0和1,也可以说:计算机只认识二进制类型的数据。那难道编程就只用在键盘上敲0和1吗?
Alt
欸~,别说你还真别说,计算机问世那会儿的程序员确实敲代码只敲0和1,是不是很离谱。不过现在都21世纪了,编程语言也都经过了多年的沉淀,迅速发展,现在不会还有人在敲0和1了吧。

可能有人会问,为什么要发展,敲代码只要敲0和1多是一件美事啊。
在这里插入图片描述
错,大错特错,只用敲0和1就很简单了吗,其实恰恰相反。

举个例子,以下是一条简单的机器语言指令示例:
00100010 00000000 00000110 00011001
这条指令的含义是在寄存器 A 中存储数值4,只有0和1,乍一看根本没有逻辑可言,事实确实如此

机器语言有如下缺点:

  1. 难学、难懂、难理解:机器语言程序是由一连串指令码构成的,这些指令码又由16进制数组成,它和要实现的功能之间没有任何的联系。
  2. 无通用性:机器语言是最直接、最原始的语言,它完全依赖与某种特定的计算机系统。需要认为分配内存:机器语言程序和它在运行过程中所要用到的所有参数象高级语言一样,需要存放在主机的内存中。但具体存放在内存的什么位置,如何合理布局,需要程序设计者根据计算机系统和程序的具体情况来人为确定。
  3. 可移植性差:机器语言程序一种由特定计算机系统所形成的机器指令,不同计算机系统的机器指令在原则上是不同的。

为了使得程序员能够更加便捷地完成复杂的编程任务,汇编语言和高级语言相继问世。高级语言相对于低级语言(汇编语言和机器语言)来说,更加简洁易懂,易于理解,易于维护,通用性强等等。
在这里插入图片描述

编译和链接

语言是高级起来了,但是,计算机的底层逻辑没变,还是只认识0和1,所以,我们用高级语言写的东西,要经过编译器转换成计算机认识的二进制数据,这个转换的过程包括编译和链接。

也就是说高级语言会通过编译器的编译和链接操作生成一个可执行文件,或者说可执行程序。它包含了程序代码的二进制表示形式,并可以被加载到内存中,由CPU逐条指令地解释和执行。

可执行程序中的指令可以被CPU直接理解和执行,这些指令通常是用机器语言编写的。因此,可执行程序可以被视为机器语言代码的集合,它们被加载到内存中并由CPU逐条执行,以实现程序的运行。

PS:可执行程序包含机器语言代码,但并不是所有的可执行程序都是由机器语言编写的。许多可执行程序包含汇编语言代码或其他高级语言的代码,这些代码在运行时会被转换为机器语言。

翻译环境和运行环境

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

  • 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
  • 第2种是执行环境,它用于实际执行代码。
    在这里插入图片描述

翻译环境

翻译环境是由编译和链接两个大的过程组成的,而编译又可以分解成:预处理(有些书也叫预编译)、编译、汇编三个过程。
在这里插入图片描述
一个C语言的项目中可能有多个.c文件一起构建,那多个.c文件如何生成可执行程序呢?

  • 多个.c文件单独经过编译出编译处理生产对应的目标文件。
  • 注:在Windows环境下的目标文件的后缀是.obj,Linux环境下目标文件的后缀是.o
  • 多个目标文件和链接库一起经过链接器处理生成最终的可执行程序。
  • 链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库。

如果再把编译器展开成3个过程,那就变成了下面的过程:
在这里插入图片描述
1.预处理
在预处理阶段,源文件和头文件会被处理成为.i为后缀的文件。

预处理阶段主要处理那些源文件中#开始的预编译指令。比如: #include,#define,处理的规则如下:·将所有的#define删除,并展开所有的宏定义。

  • 处理所有的条件编译指令,如:#if#ifdef#elif#else#endif
  • 处理#include预编译指令,将包含的头文件的内容插入到该预编译指令的位置。这个过程是递归迸行的,也就是说被包含的头文件也可能包含其他文件。
  • 删除所有的注释
  • 添加行号和文件名标识,方便后续编译器生成调试信息等。
  • 或保留所有的#pragma的编译器指令,编译器后续会使用。

经过预处理后的.i文件中不再包含宏定义,因为宏已经被展开。并且包含的头文件都被插入到.i文件中。所以当我们无法知道宏定义或者头文件是否包含正确的时候,可以查看预处理后的.i文件来确认。

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

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

4.链接
链接是一个复杂的过程,链接的时候需要把一堆文件链接在一起才生成可执行程序。

链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。

链接解决的是一个项目中多文件、多模块之间互相调用的问题。

运行环境

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/143921.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 自定义控件库之Lable组合控件

1、创建类库 2、在类库中添加用户控件(Window窗体) 3、控件视图 4、后台代码 namespace UILib {public partial class DeviceInfoV : UserControl{public DeviceInfoV(){InitializeComponent();ParameterInitialize();}#region 初始化private void Par…

pytorch的pixel_shuffle转tflite文件

torch.pixel_shuffle()是pytorch里面上采样比较常用的方法,但是和tensoflow的depth_to_space不是完全一样的,虽然看起来功能很像,但是细微是有差异的 def tf_pixelshuffle(input, upscale_factor):temp []depth upscale_factor *upscale_f…

关于表单快速开发低代码技术平台的内容介绍

运用什么样的表单快速开发软件平台可以实现高效率创收?随着科技的进步和飞速发展,专业的低代码技术平台已经走入了很多企业的办公职场中,它们灵活、轻量级、优质、高效、易维护等优势特点,可以高效助力广大企业提质增效&#xff0…

html、css学习记录【uniapp前奏】

Html 声明:该学习笔记源于菜鸟自学网站,特此记录笔记。很多示例源于此官网,若有侵权请联系删除。 文章目录 Html声明: CSS 全称 Cascading Style Sheets,层叠样式表。是一种用来为结构化文档(如 HTML 文档…

ipaguard界面概览

ipaguard界面概览 ipaguard界面分左右2块:左边菜单导航栏,右边的功能区 左侧菜单:按模块分成启动界面,代码模块,文件模块,重签名与测试模块 右侧主功能区会随着功能变化,但是整体分3块&#xf…

vue下载在前端存放的pdf文件

vue下载在前端存放的pdf文件 注意,这里要在public文件夹中新建文件夹存放静态资源,不能在src文件夹中新建文件夹存放静态资源,因为public文件夹中的文件资源不会被npm run build打包编译。大家打包一下,就会发现 模板.pdf文件 是存…

简化任务调度与管理:详解XXL-Job及Docker Compose安装

在现代应用程序开发中,任务调度和管理是至关重要的一部分。XXL-Job是一个强大的分布式任务调度平台,它使得任务的调度和管理变得更加轻松和高效。本文将介绍XXL-Job的基本概念,并详细演示如何使用Docker Compose进行快速安装和配置。 什么是X…

05-前端基础CSS第三天

01-CSS三大特性之层叠性 1.CSS的三大特性 CSS有三个非常重要的三个特性:层叠性、继承性、优先级。 1.1 层叠性 相同选择器给设置相同的样式,此时一个样式就会**覆盖(层叠)**另一个冲突的样式。层叠性主要解决样式冲突的问题。…

C++——list(2)

作者:几冬雪来 时间:2023年9月28日 内容:C——list内容讲解 目录 前言: list的const迭代器: const的iterator: const迭代器: operator->: 拷贝构造: 迭代器接口补充&…

船用白炽照明灯具

声明 本文是学习GB-T 3027-2012 船用白炽照明灯具. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了船用白炽照明灯具(以下简称灯具)的要求、试验方法、检验规则、标识、包装和储 存等。 本标准适用于电源电压在250V 以下的交流…

排序:简单选择排序算法分析

选择排序包括简单选择排序以及堆排序。 1.算法分析 每一趟在待排序元素中选取关键字最小的元素加入有序子序列。 n个元素的简单选择排序需要n-1趟处理。 2.代码实现 //交换 void swap(int &a, int &b) {int temp a;a b;b temp; }//简单选择排序 void SelectSort…

计算机毕业设计 基于SSM的垃圾分类管理系统(以医疗垃圾为例)的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

activemq部署

目录 1.下载 2.java环境 3.解压启动 4.访问测试 5.问题记录 5.1.无法启动成功问题 5.2.其他服务器无法访问 1.下载 ActiveMQ 2.java环境 需要注意要求的jdk版本,否则启动不会成功 3.解压启动 tar -zxvf apache-activemq-5.18.2-bin.tar.gz 进入到目录下执行…

VS编译器常见的错误

以上问题在编译器中出现可以在编译器中最上面加入: #define_CRT_SECURE_NO_WARNINGS 或者将scanf修改为scanf_s 一定要在最上端!!!最上端!!!最上端加入!!! 虽…

VMware下安装、配置ubuntu虚拟系统

本次测试以 ubuntu18.04 为例,进行操作说明。 1、下载镜像文件 进入网址:Ubuntu Releases ,获取需下载的18.04系统镜像,如下图所示,直接下载iso文件即可。 2、VM中设置虚拟机参数 在VM主界面上,点击“创…

抖音开放平台第三方代小程序开发,一整套流程

大家好,我是小悟 抖音小程序第三方平台开发着力于解决抖音生态体系内的小程序管理问题,一套模板,随处部署。能尽可能地减少服务商的开发成本,服务商只用开发一套小程序代码作为模板就可以快速批量的孵化出大量的商家小程序。 第…

MeterSphere v2.10.X-lts 双节点HA部署方案

一、MeterSphere高可用部署架构及服务器配置 1.1 服务器信息 序号应用名称操作系统要求配置要求描述1负载均衡器CentOS 7.X /RedHat 7.X2C,4G,200GB部署Nginx,实现负载路由。 部署NFS服务器。2MeterSphere应用节点1CentOS 7.X /RedHat 7.X8C,16GB,200G…

指南:通过 NFTScan API 获取钱包地址的 NFT Statistics 全量数据

获取钱包地址的全量 NFT 及统计分析数据对于开发者和投资者来说都是十分重要的。具体来说:对开发者而言,获取每个钱包的完整资产数据,并进行统计分析,是构建钱包管理工具、资产分析应用的基础,这些应用都需要全面且精确…

【面试经典150 | 数组】H 指数

文章目录 写在前面Tag题目来源题目解读解题思路方法一:排序方法二:二分方法三:计数排序 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主&am…

社区活跃开发者 Aaron 加入 sCrypt

Aaron(周全)是资深的 BSV 开发者,前 nChain BSV 基础架构团队成员,也是比特币协会在中国任命的首位技术推广专家。作为 BSV 社区的活跃成员,他多次作为演讲者参与区块链技术会议,开发了 Webot 应用、Witnes…