c语言程序源代码_程序的编译、链接和执行

3ce725d39c7d8fb1b475a7d77e60ecdb.png

同学们总是抱怨每次见到一道面试题都很难把它转化为程序源代码。然而不幸的是,即使是程序源代码对于计算机来说也还是太高级了。要想让计算机执行一段程序,我们必须把它翻译成最底层的机器指令才行。这其中要经历很多步骤。幸运的是有很多现成的工具可以帮助我们完成这个过程。今天我们就以 C 语言为例给大家做个简单介绍。(Java 还要更复杂一些,涉及到字节码和虚拟机,今天就不讲了。)

预处理(Preprocessing)

翻译一段 C 语言程序的第一步是预处理。这一步主要处理所有以“#”号开头的行。比如当我们遇到 #include "header.h" 的时候,就直接把 header.h 文件里的所有内容插入到这儿。由此可见,一段 C 语言程序经过预处理之后还是一段 C 语言程序。

编译(Compilation)

第二步是编译,也就是将一段 C 语言程序翻译为一段汇编语言程序。汇编语言比 C 语言要底层多了,基本上就是机器指令的文字版,每一行汇编语言对应着一条机器指令。往往 C 语言程序里的一行要被翻译成好几行汇编语言程序才行。不同的高级语言(如 C、Fortran、Pascal 等等)有不同的预处理器和编译器,但它们在经过编译之后都变成了同一种汇编语言,于是后面的步骤和工具大家都是通用的了。

汇编(Assembly)

第三步是汇编,即把文字版的汇编语言程序真正翻译成由 0 和 1 组成的机器指令,并把它们打包输出成一个 relocatable object program(下文简称目标文件)。如果说汇编语言程序人类还勉强能看懂,经过这一步之后得到的目标文件就真的是一堆二进制乱码了。

链接(Linking)

第四步是链接,用来把多个目标文件合并成一个可执行文件。比如说我们写了一个 hello world 程序,其中调用了 C 语言标准库里的 printf() 函数来打印。我们的 hello world 的主函数和 printf() 函数存放在两个不同的目标文件里,经过这一步之后它们就被合并到一起了。(这里讲的是静态链接。如果是动态链接的话,printf() 在这一步暂时不合并进来,而是在下一步程序运行的时候才被加载。)

加载(Loading)

上一步所生成的可执行文件终于可以被操作系统加载运行了。操作系统会将这个可执行文件中的代码和数据从磁盘复制到内存中,并跳转到该程序的第一条指令处(也叫做入口点,entry point)开始执行。

最后用一张图给大家总结一下全过程:

4b0db7c8f1b6e85f6e4a2b7e0c631495.png

(本文在写作过程中参考了 Randal E. Bryant 和 David R. O'Hallaron 所著的 Computer Systems: A Programmer's Perspective 第三版。)

更多北美CS求职信息请至:http://www.laioffer.com

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

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

相关文章

Ubuntu下tftp服务器的搭建

参考博客:http://blog.chinaunix.net/uid-26495963-id-3206829.html1. 安装$ apt-get install tftp-hpa tftpd-hpa2. 建立目录$ mkdir /tftpboot # 这是建立tftp传输目录。$ sudo chmod 777 /tftpboot$ sudo touch test.txt # test.txt文件最好输入内容以便区分3. 配…

【程序员眼中的统计学(1)】信息图形化:第一印象

信息图形化:第一印象 作者 白宁超 2015年10月13日23:23:13 摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理。首先提到统计学,很多人认为是经济学或者数学的专利,与计算机并没有交集。诚然在传统学科中,其…

JBoss AS 7.0.2“ Arc”发布–使用绑定选项

有关JBoss AS7方面的更多好消息。 JBoss AS 7.0.2.Final“ Arc”已经发布! 自AS 7.0.1发布以来已经过去了一个月。 在这短时间内,已修复了许多错误,并实现了更多功能和改进。 所有这些错误修复和功能已包含在此7.0.2版本中。 此新版本主要包…

C语言开发笔记(五)字符串常量

#include <stdio.h> #include <string.h>int main(void) {char *str "sting";strcpy(str, "hello");printf("%s\n", str);return 0; } 代码为什么会运行错误&#xff0c;异常退出&#xff1f; 这段代码是新手常见错误之一。 定义…

不属于python标准库的是_python标准库和扩展库

Tkinter ———— Python 默认的图形界面接口。 Tkinter 是一个和 Tk 接口的模块&#xff0c; Tkinter 库提供 了对 Tk API 的接口&#xff0c;它属于 Tcl/Tk 的 GUI 工具组。 Tcl/Tk 是由 John Ousterhout 发展的书写和 图形设备。 Tcl( 工具命令语言 ) 是个宏语言&#xff0c…

Android N 新特性 + APP开发注意事项

1. 多窗口MultiWindow 多窗口MultiWindow&#xff0c;这是Android N里对开发者影响比较大的特性&#xff0c;也是大家疑问比较多的地方。站在开发者的角度其实不必太担心这个特性会导致我们需要修改很多代码来适配系统。Google的工程师们也不希望这个特性导致很多应用出现问题&…

C语言开发笔记(六)实参和形参

举例说明 #include <stdio.h>void swap(int x, int y) {int temp 0;temp x;x y;y temp; }int main(void) {int a 1, b 2;swap(a, b);printf("a%d, b%d\n", a, b);return 0; }结果为 在函数调用时&#xff0c;a的值传给x&#xff0c;b的值传给y。执行完…

Spring Singleton,请求,会话Bean和线程安全

由众多有用框架组成的Spring框架生态系统已成为许多Java EE应用程序的基础。 但是在所有Spring产品的核心中&#xff0c;我们仍然拥有Spring DI / IOC框架&#xff0c;该框架将Spring推向了新的高度。 随着越来越多的人将Spring MVC或JSF-Spring集成用于他们的应用程序&#xf…

some fragments

1.fullpage 2.one page.js 3.scrollReveal.js 4.wow.js 5.浏览器前缀&#xff1a; -webkit- &#xff1a; Safari&#xff0c;Chrome -o- &#xff1a; Opera -moz- &#xff1a; Firefox -ms- &#xff1a; IE   6.css3过渡动画&#xff1a;transitio…

面试之ajax原理(转载)

总结1 总结2 AJAX全称为“Asynchronous JavaScript and XML”&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是一种创建交互式网页应用的网页开发技术&#xff0c; 是几种原有技术的结合体。它由下列技术组合而成。 1.使用CSS和XHTML来表示。 2. 使用DOM模型来交互和…

优化方案电子版_关于小区分支道路整修设计方案的讨论稿(No.2020121)

各位业主&#xff0c;大家好&#xff01; 关于绿洲比华利花园主干道翻新和次干道整修前期勘查和设计方案&#xff0c;经业委会及小区专家小组、设计单位申都设计公司工程设计人员结合本小区的实际情况进行了深入讨论&#xff0c;优化设计&#xff0c;形成如下三个独立方案&…

OSGI和Spring动态模块–简单的Hello World

在此姿势中&#xff0c;我们将采用使用OSGi进行的第一个实现&#xff0c;并使用Spring Dynamic Modules改进应用程序。 Spring动态模块&#xff08;Spring Dm&#xff09;使基于OSGi的应用程序的开发更加容易。 这样&#xff0c;服务的部署就容易得多。 您可以像其他任何Spring…

C语言代码规范(五)函数参数个数

一个函数的参数的数目过多&#xff08;尤其是超过8个&#xff09;显然是一种不可取的编程风格。参数的数目直接影响调用函数的速度&#xff0c;参数越多&#xff0c;调用函数越慢。 参数的数目少&#xff0c;程序就显得精练、简洁&#xff0c;这有助于检查和发现程序中的错误。…

vijos P1740 聪明的质检员

题目链接:传送门 题目大意:给你n个物品&#xff0c;每件物品有重量 W 和价值 V&#xff0c;给m个区间&#xff0c;和一个标准值。(n,m最大200000) 要求找到一个值x&#xff0c;使得m个所有区间的权值和与标准值的差的绝对值最小。单个区间权值计算公式(数目num0&#xff0c;价值…

为什么有的开关电源需要加自举电容?

一、什么是自举电路&#xff1f; 1.1 自举的概念 首先&#xff0c;自举电路也叫升压电路&#xff0c;是利用自举升压二极管&#xff0c;自举升压电容等电子元件&#xff0c;使电容放电电压和电源电压叠加&#xff0c;从而使电压升高。有的电路升高的电压能达到数倍电源电压。…

VS2010报错 error:LINK1123:转换到COF期间失败,文件无限或损坏

右键工程-配置属性-清单工具-输入和输出&#xff0c;嵌入清单一项重新选择为否&#xff0c;如下图 修改后重新生成和运行&#xff0c;发现程序正常运行了。

springboot 整合mybatis_SpringBoot整合Mybatis、MybatisPuls

文末视频讲解SpringBoot的版本是2.2.0一、整合Mybatis1-1、引入pom文件<dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>8.0.19version> dependency> <dependency> &l…

iOS 开发中遇到的问题

1. 关于纠结很久的KVO崩溃问题&#xff0c;其真正原因是&#xff0c;在删除roomItem的KVO之前,将这个对象已经赋值为nil,所以实际上并没有删除他的observer&#xff0c;因此而崩溃&#xff1b;长时间纠结的原因是受.cxx_destruct影响了思路 2.拷贝block 因为block变量默认是声明…

为旧版代码创建存根–测试技术6

任何阅读此博客的人都可能已经意识到&#xff0c;目前我正在开发一个包含大量旧代码的项目&#xff0c;这些旧代码庞大&#xff0c;扩展且编写时从未进行过任何测试。 在使用此遗留代码时&#xff0c;有一个行为异常的类非常普遍&#xff0c;整个团队都一次又一次地犯错。 为了…

C学习杂记(一)常见误会

一、sizeof是关键字&#xff0c;不是函数。 二、strlen是函数。