代码编译过程

从上大学开始学习编程至今,十年有余,这次头一回尝试总结一下平时最常见的工作的在计算机中的本质。

从源代码到可执行文件,正常需要经过“预处理器(Preprocessor)”->“编译器(Compiler)”->“链接器(Linker)”这三个过程。如果是嵌入式系统,还需要经过“加载器(Loader)”加载到目标机器的存储器中才能运行。

现在逐个解释每个过程的含义:

  • 预编译器(Preprocessor)

    不同的预处理器会包含不同的功能,以词法预处理器有例,它主要做宏替换、包含头文件(#include)以及条码编译等功能。也就是说,它的输入是源代码(.asm、.c、.cpp……),仅是在源代码的基础上进行宏替换、将#include的内容导入以及根据条件选择有效的编译内容,生成中间文件,输出给“编译器”。

  • 编译器(Compiler)

    编译器将预处理器的输出经过词法分析、语法分析、语义分析,最后生成等效的汇编代码(Assembly File),这一步及之前的代码都是可以阅读的文本。

  • 汇编器(Assembler)

    汇编器将汇编代码翻译成目标代码(Object File),这时已经是二进器的机器码。

  • 链接器(Linker)

    每一个源文件都会生成经过编译器都会生成相应的目标代码,链接器将所有的目标代码组装(链接)起来,生成可执行文件。

时间: 2024-10-11 23:17:51

代码编译过程的相关文章

.NET 代码编译过程

作为一种代码指令平台,Microsoft .NET比微软公司先前推出的其他技术平台要来得更为复杂.由于.NET提供了对多种编程语言以及(在理论上说)多重平台的支持,这就需要在传统的两个代 码层添加一个中间代码层.在这里,传统的两层分别是源代码层和编译后的本机代码层.新加的代码层给.NET平台带来了额外的灵活性,不过,反过来却又增加 了系统的复杂性.此外,由于这一新代码层的出现,一连串的新型应用程序部署选项也首次展现在了程序员的面前. .NET之与众不同:MSIL 在Microsoft .NET框

PHP代码编译为OPCODE

简介 OPCODE是PHP编译后的二进制代码,生成的Opcode作为一种中间语言,可以帮助实现PHP源程序代码的不开源,当然,这种代码也很容易被反编译,不过对于一些简单的场景也是很足够了.编译的基本思路是首先在php.ini中配置加载opcache扩展,并配置相关参数,然后执行一个PHP脚本遍历源代码目录,并进行编译,核心的函数是opcache_compile_file(),该函数会根据php.ini中的参数,编译并输出二进制代码. 准备工作 首先,配置PHP.INI文件中的opcache相关参

C/C++学习 - gcc编译过程查看汇编代码

GCC GCC参数 举例 GCC gcc大家都很熟悉,是个编译器,功能强大,全称是:GUN GCC. 平时大家都简单的称为:GCC, 功能强大,能够编译很多的语言.包括:c, c++, java, ada等- GCC参数 gcc平时有很多参数,在平时我编译小程序的时候,都直接gcc -o object source.c就可以了. 但是有一次我想查看我同样目的但是不同写法的两个代码是执行效率上是否有差别.所以我就查了下gcc编译过程中的汇编代码的参数. 参数 说明 -c 只编译不链接,生成*.o文

2.4、uboot配置和编译过程详解

2.4.1.uboot主Makefile分析1 2.4.1.1.uboot version分析 (1)uboot版本号分为3个级别: VERSION:主版本号 PATCHLEVEL:次版本号 SUBLEVEL:再次版本号 EXTRAVERSION:另外附加的版本信息 这四个用.隔开共同构成了最终的版本号. (2)Makefile中版本号最终生成了一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号 (3)include/version_autogenerated.h

如何把iOS代码编译为Android应用

新闻 <iPhone 6/6 Plus中国销量曝光:单月销量650万>:据iSuppli Corp.中国研究总监王阳爆料,iPhone 6和iPhone 6 Plus在国内受欢迎的情况大大超过预期,苹果在中国的单月销量在11月超过了650万台,全年在中国的销量将超过4000万台. 教程 < Date parsing performance on iOS>:文章介绍了一个关于格式化时间的”黑科技“,作者使用 sqlite 替换 NSDateFormatter,提高了16倍的转换效率.

GCC与编译过程

GCC与编译过程   GCC(GNU Compiler Colletion),GUN编译器套装,是一套由GNU开发的编程语言编译器.Linux系统下的GCC编译器实际上是调用其他不同的工具来完成预处理.编译.汇编和链接工作. 一.编译过程 在计算机的眼里,只有1和0.不幸的是,我们用C语言写出来的代码,计算机无法直接看明白.所以一个程序如果需要被计算机执行,那么就必须翻译成能被计算机读懂并执行的1和0.实现这一结果的过程,我们称之为编译. 编译包括以下步骤:预处理.编译.汇编和链接.具体过程如下

Hive SQL的编译过程

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用.美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析.Hive的稳定性和性能对我们的数据分析非常关键. 在几次升级Hive的过程中,我们遇到了一些大大小小的问题.通过向社区的咨询和自己的努力,在解决这些问题的同时我们对Hive将SQL编译为MapReduce的过程有了比较深入的理解.对这一过程的理解不仅帮助我们解决了一些Hive的bug,也有利于我们优化Hive SQL

C程序编译过程浅析【转】

转自:http://blog.csdn.net/koudaidai/article/details/8092647 前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld为例,简单总结如下. hello.c源代码如下: ?[Copy to clipboard] C 1 2 3 4 5 6 [c] view plaincopy <span style=&qu

【转】 Apk文件及其编译过程

Apk文件概述 Android系统中的应用程序安装包都是以apk为后缀名,其实apk是Android Package的缩写,即android安装包. 注:apk包文件其实就是标准的zip文件,可以直接用解压缩软件解开.Apk包中的内容 解压缩一个apk文件后,目录结构一般如下: *.apk ├-res │ ├+layout │ └+drawable ├-META-INF │ ├-MANIFEST.MF │ ├-CERT.SF │ └-CERT.RSA ├-resources.arsc ├-cla