用C语言构建一个可执行程序的流程
1、流程图
- 从用C语言写源代码,然后经过编译器、连接器到最终可执行程序的流程图大致如下图所示。

2、编译流程
- 首先,我们先用C语言把源代码写好,然后交给C语言编译器。C语言编译器内部分为前端和后端。
2.1 编译器前端
- 前端负责将C语言代码进行词法和语法上的解析,然后可以生成中间代码。
- 中间代码这部分不是必须的,但是它能够为程序的跨平台移植带来诸多好处。比如,同样的一份C语言源代码在一台计算机上编译完之后,生成一套中间代码。然后针对不同的目标平台(比如要将这一套代码分别编译成 ARM 处理器的二进制机器码、MIPS 处理器的二进制机器码以及 x86 处理器的二进制机器码),只需要编写相应目标平台的编译器后端即可。
- 所以,这么做就可以把编译器的前端与后端剥离开来(这在软件工程上又可称为解耦合),不同处理器厂商可以针对自家的处理器特性,对中间代码生成到目标二进制代码的过程再度进行优化。
2.2 编译器后端
- 接下来,由C语言编译器后端生成源文件相应的目标文件。
- 目标文件在 Windows 系统上往往是.obj文件,而在 Unix/Linux 系统上往往是.o文件,C语言的源文件在所有平台上都统一用.c文件表示。
2.3 链接器
- 最后,对于各个独立的目标文件,通过连接器将它们合并成一个最终可执行文件。
- 连接器与C语言编译器是完全独立的。所以,只要最终目标代码的 ABI(应用程序二进制接口)一致,我们可以把各个编译器生成的目标代码都放在一起,最后连接生成一个可执行文件。比如:
- 有些源代码可用 GCC 编译;
- 有些使用 Clang 编译;
- 还有些汇编语言源文件可直接通过汇编器生成目标代码。
用C语言构建一个可执行程序的流程的更多相关文章
- 如何用 Swift 语言构建一个自定控件
(via:破船之家,原文:How To Make a Custom Control in Swift) 用户界面控件是所有应用程序重要的组成部分之一.它们以图形组件的方式呈现给用户,用户可以通过它 ...
- c语言-构建一个静态二叉树
第一.树的构建 定义树结构 struct BTNode { char data; struct BTNode* pLChild; struct BTNode* pRChild; }; 静态方式创建一个 ...
- 用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰
服务器: 1.与客户端的交流手段多是I/O流的方式 2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接 3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输 ...
- 看了这一张GIF图你就明白什么回事了,必看的经典!--快速构建一个请假流程
下面介绍一下FSBPM构建一个请假单流程 1.数据模型的构建 输入业务中需要的数据项即可,比如[申请人,开始时间,结束时间,请假天数,请假理由,附件上传..........] 2.自定义流程 审批节点 ...
- cmake入门:01 构建一个简单的可执行程序
一.目录结构 CMakeLists.txt:cmake 工程入口文件,包含当前目录下的工程组织信息.cmake 指令根据此文件生成相应的 MakeFile 文件. Hello.c: 源代码文件 bui ...
- gRPC初探——概念介绍以及如何构建一个简单的gRPC服务
目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...
- 使用C语言实现一个虚拟机
使用C语言实现一个虚拟机 2015-6-22 21:32| 发布者: joejoe0332| 查看: 2891| 评论: 0|原作者: leoxu, Serval, 社会主义好, lostTemple ...
- 《python机器学习—预测分析核心算法》:构建预测模型的一般流程
参见原书1.5节 构建预测模型的一般流程 问题的日常语言表述->问题的数学语言重述重述问题.提取特征.训练算法.评估算法 熟悉不同算法的输入数据结构:1.提取或组合预测所需的特征2.设定训练目标 ...
- 基于Vue2.0+Vue-router构建一个简单的单页应用
爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6185492.html 一.介绍 vue.js 是 目前 最火的前端框架,vue.js ...
随机推荐
- python's twenty-sixth day for me 模块
configparser 模块: 该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键 = 值). 创建文件: # 创建文件 i ...
- 6.solr学习速成之multicore查询
查询关联多个core 再新建一个core 向每个core添加索引,修改 final static String SOLR_URL = "http://localhost:8080/solr/ ...
- 不用jquery实现tab页切换,刷新,后退,前进状态自动维护 很好用
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Java面向对象-Java类的继承及super关键字
Java面向对象-Java类的继承 1,继承定义以及基本使用 定义:子类能够继承父类的属性和方法: 注意点:Java中只支持单继承: 私有方法不能继承: 上代码: package com.java12 ...
- python的ftplib模块
Python中的ftplib模块 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件 FTP的工作流程及基本操作可参考协议RFC95 ...
- easyui之datagrid之formatter(后台传递常量自动转换值)
1,datagrid之formatter formatter格式化函数有三个参数: value:字段值(一般为后台传递给前台的值): row:当前行数据: index:当前行索引. return值是显 ...
- 深入剖析SolrCloud(一)
作者:洞庭散人 出处:http://phinecos.cnblogs.com/ 本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由 ...
- 717. 1-bit and 2-bit Characters最后一位数是否为0
[抄题]: We have two special characters. The first character can be represented by one bit 0. The secon ...
- 217. Contains Duplicate数组重复元素 123
[抄题]: Given an array of integers, find if the array contains any duplicates. Your function should re ...
- launchpad, jira, github
一.简介 http://segmentfault.com/q/1010000000165115