#从源码到可执行程序

author author     2022-08-22     763

关键词:

从源码到可执行程序

1.概述

   很多编译型语言的源码都需要被编译之后才可以正常的运行,如常用的c语言,它需通过编辑器的编译把它变成0101序列的机器语言才可以在指定机器上运行。而常见的java语言则属于解释型语言,它虽然也需要进行编译,不过它通过java编译器编出的是字节码(.class)文件,需要java虚拟机解释(解释器)解释执行,具体流程如图1所示。


技术分享
图1

    解释型语言与编译型语言相比,编译型语言的运行速度则会更快,因为在运行时java虚拟机解释(解释器)还需要把字节码文件翻译成目标机器对应机器指令再执行。当然,现在的java语言加入了即时编译(just in time)的优化机制来提高字节码(.class)文件的执行速度,其实质就是把运行频率较高的代码编译成机器码再执行(相对于编译型语言,人家在编译阶段就已经把这些过程完成了),但是把字节码编译成机器语言所占用的时间还是算在运行时期(所以感觉加入优化后的java代码运行速度还是比不上c吧,不过它用这个代价换取了java语言跨平台的特点还是非常不错的)。好吧,接下来看看编译型语言是怎么被编译程机器可以执行的程序的,它经历过哪些步骤?     以一个C程序语言编写的helloWord为例。

  1. #include<stdio.h>
  2. int a=1;int main()
  3. {
  4. printf("helloWorld ");
  5. return0;
  6. }

    通过编译命令gcc c_1.c可以得到可执行文件a.out,执行后就会得到想要的结果:helloWorld,具体如图2所示。


技术分享
图2

    但是实际上,从源码到可执行文件总共需要4个步骤①预编译②编译③汇编④链接,具体过程如图3所示。

技术分享
图3

2.预编译

    首先,源码文件按c_1.c和相关的头文件stdio.h会预编译器编译成一个.i文件,具体过程如图4所示。

技术分享
图4

   在预编译过程中主要是将预编译指令(如“#if”、“#ifdef”、“#elif”、“#else”、“#endif”、“#include”、“#define”)文件插入到源文件的对应位置。打开预编译后的文件hello.i可以看到如图5的内容。在最下面就是写好的helloWorld程序,而上面部分是stdio.h文件内容。

技术分享
技术分享
图5

3.编译

   编译过程就是把预编译完的文件进过一系列的词法分析、语法分析、语意分析及相关的优化后生成的汇编文件.s,具体生成过程可以参考《编译原理》===>??(这部分是程序程序构建的关键,反正感觉会比较难,以前本科学习编译原理的时候也只是考试背题然后通过考试最后基本忘了这门课程讲的什么东西。看来要深入学习计算机科学相关知识,编译部分也是非常重要的)??

技术分享
图6

   通过vim打开编译后的文件hello.s,如图8所示可以看到里面全是汇编代码。

技术分享
图7

4.汇编

   汇编过程就是把图7中的汇编语言按照汇编指令和机器指令一一对应的关系翻译成机器指令,具体如图8所示。

技术分享
图8

5.链接

   这阶段就是把汇编后的机器指令集变成可以直接运行的文件,而对目标文件进行链接主要是因为在目标文件中可能用到了在其他文件当中定义的字段(或者函数),通过链接来把多个不同目标文件关联到一起。比如有2个目标文件a和b,在 b中定义了一个函数"method",而在文件a中则使用到了b文件中的函数"method",通过链接文件a才能调用到函数"method",不然文件a根本就不知道到函数"method"底做了些什么操作。查看链接后的文件a.out如图9所示。


技术分享
图8























从程序到进程

...p://www.civilnet.cn/bbs/browse.php?topicno=78426 本文以《从代码到可执行文件》为基础,阅读本文前确保你熟悉了《从代码到可执行文件》中提到的概念,本文中的示例程序仍是《从代码到可执行文件》中的gemfield.c。代码如下:********... 查看详情

从源代码到可执行文件(代码片段)

请简述程序从源代码到可执行程序的过程,面试经常会被问到!这是一个屡见不鲜的问题,总而言之就如下四个过程:预处理比如有test.c源文件,内容如下:#include<stdio.h>/*主函数*/intmain(void) printf("h... 查看详情

从源代码到可执行文件(代码片段)

请简述程序从源代码到可执行程序的过程,面试经常会被问到!这是一个屡见不鲜的问题,总而言之就如下四个过程:预处理比如有test.c源文件,内容如下:#include<stdio.h>/*主函数*/intmain(void) printf("h... 查看详情

c/c++-从代码到可执行程序的过程

(1)预编译主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下:删除所有的#define,展开所有的宏定义。处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。处... 查看详情

一个c++源文件从文本到可执行文件经历的过程(代码片段)

一个C++源文件从文本到可执行文件经历的过程以HelloWorld为例进行说明首先我们编写一个cpp源程序test.cpp#include<iostream>usingnamespacestd;intmain()cout<<"helloworld"<<endl;return0;使用g++编译命令时g++-otesttest.cppGcc编 查看详情

使用 CMake 将资源(例如,着色器代码;图像)嵌入到可执行文件/库中

】使用CMake将资源(例如,着色器代码;图像)嵌入到可执行文件/库中【英文标题】:Embedresources(eg,shadercode;images)intoexecutable/librarywithCMake【发布时间】:2012-08-0212:54:50【问题描述】:我正在用C++编写一个应用程序,它依赖于我... 查看详情

c从源码到运行发生了哪些事

一个C/C++程序从源代码到可执行程序主要经历了四个阶段:  ①预处理。包括展开宏、处理#include,#if,#ifdef等指令、删除注释、还有一些其他操作。相关命令:gcc-E或cpp  ②编译。对预处理文件进行分析并生产汇编代码,主... 查看详情

如何将使用 PyQt 制作的 python 应用程序打包到可安装文件中? [复制]

】如何将使用PyQt制作的python应用程序打包到可安装文件中?[复制]【英文标题】:HowcanipackagemypythonapplicationmadeusingPyQtintoinstallablefile?[duplicate]【发布时间】:2020-04-1912:07:02【问题描述】:从python应用程序创建可执行文件的方法有... 查看详情

从源代码到可执行文件(代码片段)

请简述程序从源代码到可执行程序的过程,面试经常会被问到!这是一个屡见不鲜的问题,总而言之就如下四个过程:预处理比如有test.c源文件,内容如下:#include<stdio.h>/*主函数*/intmain(void) printf("h... 查看详情

源代码到可执行程序的过程详解:预编译编译汇编链接(代码片段)

1、gcc编译过程分解(1)首先是将.c源文件和.h头文件经过预编译(cpp是预编译器),得到.i文件,主要是进行的一些替换工作;(2)将.i文件经过编译器(gcc)处理,得到.s汇编文件,现在文件内容已经从C语言编程了汇编... 查看详情

Qt 通过管道到可执行 Linux 的双向通信

】Qt通过管道到可执行Linux的双向通信【英文标题】:QttwowaycommunicationoverpipetoexecutableLinux【发布时间】:2012-03-1409:00:11【问题描述】:我正在尝试编写一个QtGUI应用程序,它可以与我制作的可执行文件进行通信,该文件处理来自Qt... 查看详情

源文件如何转换到可执行文件

从源文件到可执行文件 1)计算机只能运行本地代码(机器语言)由cpu进行解析源代码(构成源文件.c/.java)-------(翻译)---------本地代码   2)本地代码:例如Windows下的.exe文件的内容---------(Dump)-----------2位16... 查看详情

静态库中的符号有时会链接到可执行文件,有时不会

】静态库中的符号有时会链接到可执行文件,有时不会【英文标题】:symbolsinstaticlibrarysometimesgotlinkedintoexecutable,sometimesnot【发布时间】:2019-01-1010:27:59【问题描述】:我有一个静态库,它是使用g++从linux上的许多cpp文件生成的。... 查看详情

从自动续订切换到可续订订阅

】从自动续订切换到可续订订阅【英文标题】:switchingfromauto-renewabletorenewablesubscription【发布时间】:2012-04-1619:55:35【问题描述】:我的客户在AppStore中有一个使用自动续订订阅类型的应用。在重新提交应用程序后,它被拒绝了... 查看详情

将所有库依赖项包含到可执行文件中 Linux

】将所有库依赖项包含到可执行文件中Linux【英文标题】:IncludealllibrarydependenciesintoanexecutablefileLinux【发布时间】:2015-06-2208:42:50【问题描述】:提前致谢。我需要在具有Opencv库的所有依赖项的不同机器上使用linuxC++应用程序。... 查看详情

将图像从隔离存储加载到可观察集合不起作用

】将图像从隔离存储加载到可观察集合不起作用【英文标题】:loadingimagefromisolatedstoragetoobservablecollectionnotworking【发布时间】:2012-02-0814:24:34【问题描述】:我正在从我的应用程序中的独立存储设置加载图像路径。[DataMember]public... 查看详情

如何将 oracle XE 数据库嵌入到可执行 jar 中?

】如何将oracleXE数据库嵌入到可执行jar中?【英文标题】:howtoembedoracleXEdatabaseinexecutablejar?【发布时间】:2014-07-1710:44:23【问题描述】:我在“myecplise”中使用javaswings和oracleXE数据库开发了java应用程序。我还创建了可执行jar文件... 查看详情

6c_宏定义与预处理函数与函数库(代码片段)

C语言预处理理论由源码到可执行程序的过程源码.c->(编译)->elf可执行程序源码.c->(编译)->目标文件.o->(链接)->elf可执行程序源码.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序源码.c->(... 查看详情