首页 > 编程语言 >程序的编译过程

程序的编译过程

时间:2023-05-07 20:57:09浏览次数:46  
标签:文件 副本 程序 可执行程序 编译 内存 过程 链接

程序运行的4个阶段

 

预处理:处理一些#号定义的命令或语句(如#define、#include、#ifdef等),生成.i文件

编译:进行词法分析、语法分析和语义分析等,生成.s的汇编文件

汇编:将对应的汇编指令翻译成机器指令,生成二进制.o目标文件

链接:链接分为两种:静态链接和动态链接


 

(1).静态链接

在链接期,将静态链接库中的内容直接装填到可执行程序中。

在程序执行时,这些代码都会被装入该进程的虚拟地址空间中。

优点:运行速度快并且不依赖外部环境,因为在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。

缺点:1)浪费空间:因为每个可执行程序中对所有需要的目标文件都要有一份副本,如果运行多个程序并且这些程序都对同一个目标文件有依赖,那么目标文 件在内存中就会存在多个副本;

           2)更新困难:因为每当一个依赖文件的代码修改了,这个时候就需要全部重新编译链接形成新的可执行程序。


(2).动态链接

在链接期,只在可执行程序中记录与动态链接库中共享对象的映射信息。(.lib文件中只包含该动态库.dll导出的函数和变量的符号名)

在程序执行时,动态链接库的全部内容被映射到该进程的虚拟地址空间。其本质就是将链接的过程推迟到运行时处理

优点:1)节约内存:即使需要每个程序都依赖同一个库,但是该库不会像静态链接那样在内存中存在多分副本,而是这多个程序在执行时共享同一份副本;

            2)更新方便:更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。当程序下一次运行时,新版本的目标文件会被自动加载到内存并且链接起来,程序就完成了升级的目标。

缺点:性能略差:因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失。

 

标签:文件,副本,程序,可执行程序,编译,内存,过程,链接
From: https://www.cnblogs.com/rocky-chen/p/17379936.html

相关文章

  • Xshell7提示:要继续使用此程序,您必须应用最新的更新或使用新版本
    今天打开xshell的时候,报出问题,需要更新到新版本:Xftp7也是无法直接打开。解决方案:1.新建xshell新版本补丁.bat##################################begin####################@echooff%1mshtavbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c%~s......
  • COMP30023 远程程序调用
    ​ COMP30023Project2RemoteProcedureCallOutdate:28April2023Duedate:Nolaterthan5pmMonday22May,2023AESTWeight:15%ofthefinalmark1ProjectOverviewRemoteProcedureCall(RPC)isacrucialtechnologyindistributedcomputingthate......
  • 一个28岁程序员入行自述和感受
    我是一个容易焦虑的人,工作时候想着跳槽,辞职休息时候想着工作,休息久了又觉得自己每天在虚度光阴毫无意义,似乎陷入了一个自我怀疑自我焦虑的死循环了。我想我该做的点什么去跳出这个循环。。。自我叙述我相信,每个人都有一个自命不凡的梦,总觉得自己应该和别人不一样,我不可能如此普......
  • 5个超实用的AI图形制过程技巧
    设计的审美和趋势一直在变化AI和PS一样,虽然是常用的设计工具01不可能图形——莫比乌斯环1、自定义面板与背景图层,新建图层后用自定义描边色绘制一个椭圆,点击对象-路径-偏移路径,得到一个同心椭圆。2、将两个椭圆编组,再复制一个并移动到图下所示位置,一定要改变另一个椭圆的......
  • 一个28岁程序员入行自述和感受
    我是一个容易焦虑的人,工作时候想着跳槽,辞职休息时候想着工作,休息久了又觉得自己每天在虚度光阴毫无意义,似乎陷入了一个自我怀疑自我焦虑的死循环了。我想我该做的点什么去跳出这个循环。。。自我叙述我相信,每个人都有一个自命不凡的梦,总觉得自己应该和别人不一样,我不可能如此普......
  • C#中应用程序集的装载过程详解
    原文:https://blog.csdn.net/chinaherolts2008/article/details/114325104这篇文章主要介绍了C#中应用程序集的装载过程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧了解程序集如何在C#.NET中加......
  • MSBulid编译器过程出现“lc.exe已退出,代码为-1“的解决方案
    这几天在查看winform旧项目的时候,发现编译过程中会出现“lc.exe已退出,代码为-1”的错误提示,导致程序无法正确编译,在网上查了一下,最后找到解决方法。因为项目使用了Developer第三方库功能,其在组件的使用类定义了LicenseProvider(typeof(LicFileLicenseProvider))这个Attribute。......
  • 微信小程序在wxml里不支持includes,indexOf,findIndex等方法
    小程序的wxml文件内不支持数组的includes,indexOf,findIndex等方法。不是垃圾是什么?玩什么标新立异?不会搞就别TM搞。 开发者:我想上二楼。WX:这里有一坨屎,吃子它,就让你上二楼。开发者:@#$%&@^$*^&*&^$%$^ 咋做?在任意目录创建一个.wxs文件,里面写上如下代码:文件-/utils/wuti......
  • JVM系列---【使用jmx_agent监控java程序】
    使用jmx_agent监控java程序1.下载jmx_prometheus_javaagent.jar从https://github.com/prometheus/jmx_exporter/releases下载最新版本的jmx_prometheus_javaagent.jar2.创建一个名为jmx_exporter_config.yml的文件用于配置jmx_prometheus_javaagent.jar的监控参数。该文件应......
  • 解决微信小程序请"注意游客模式下,调用 wx.login 是受限的, API 的返回是工具的模拟返
    新建一个微信小程序的项目,导入了代码后,出现微信小程序请"注意游客模式下,调用wx.login是受限的,API的返回是工具的模拟返回"这是因为,微信开发者工具没有配置小程序的appid下面添加上就可以了 ......