• 正在加载中...
  • DCE”是个多义词,全部含义如下:

    纠错 | 编辑多义词

    DCE[死码消除]

    DCE,即死码消除,编译器原理中,死码消除(Dead code elimination)是一种编译最优化技术,它的用途是移除对程序运行结果没有任何影响的代码。移除这类的代码有两种优点,不但可以减少程序的大小,还可以避免程序在运行中进行不相关的运算行为,减少它运行的时间。不会被运行到的代码(unreachable code)以及只会影响到无关程序运行结果的变量(Dead Variables),都是死码(Dead code)的范畴。

    编辑摘要

    目录

    示例/DCE[死码消除] 编辑

    下列的示例,以C语言写成:

    分析上述程序对于数值的使用,将会发现b的数值在第一次被赋值之后,就不再使用,而且b是在foo函数内宣告,无法在函数外面使用,所以变量b是 无用的,最优化的过程可以回收他所使用的空间,并删除他的初始化。

    当第一个return被运行,则代表函数已经结束,之后变量b的赋值行为则不会被运行,所以赋值行为是可以被删除的。如果程序有更复杂的控制流程,例如在第一个return之后加上一个标签,使得程序中任和一个地方都可以用goto来运行到这个程序段,那么变量b的赋值行为将有可能被运行。

    尽管一些计算行为被包装成函数,他们的数值也无法被函数外所访问,但仍然还是有些函数仅会回传一个固定的数值,这或许可以将该数值取代所有函数的调用。(这个简化的过程被称之为常量折叠)

    更高级的编译器则会有些选项可以启动死码删除的功能,而有些则是可以选择不同档次的死码删除,比较低级档次的死码删除仅会移除不会被运行到的指令,而较高级的可能不会保留无用变量的空间,其他高级档次的做法可能会判断哪些指令及函数没有任何用途,并且删除他们。

    死码删除最普遍的做法,是通过预处理器来判断代码是否需要被编译,如下列这个示例:

    由于0将永远被视为False,所以if判断式内的程序将永远不会被运行,死码删除将会把它移除,这个技术在调试上相当常见,我们可以通过一个数值来决定程序段是否该被编译,使用死码删除的最优化过程,将会使用预处理器来进行相同的工作。

    实现中,有些在最优化过程中找到的死码,是被其他最优化技术产生,举例来说,典型强度折减的技术,将会在代码内插入新的运算以取代昂贵的运算行为,而被取代的代码就成了死码,随后,死码删除会移除那些计算,以完成这个效果(没有复杂的强度折减算法)。

    从历史上来看,死码删除使用来自数据流分析的信息,Cytron et al在原始文章中发布了一个基于静态单赋值形式的算法,Shillingsburg改进了这个算法,并开发了一个算法来移除无用的控制流(Control-flow)。[1]

    动态死码删除/DCE[死码消除] 编辑

    死码通常被视为 无条件的(unconditionally),所以我们可以在编译时期通过死码删除来移除这些无用的代码。

    然而,在实现上,只有在特定的情形才会标注一个代码区块是无用的,或是不会运行到的,这可能无法在编译时期所得知。例如在不同的运行环境有不同的结果(举例来说,目标环境可能会有不同的操作系统版本,或是不同的驱动程序及可用服务的组合),可能会在代码内要求不同特例的集合,同时在这些案例下就变成有条件的死码。然而,软件(例如驱动程序、或是常驻服务)可能会根据用户的设置,而配置或排除特定的功能,使得在一些特定的情境,会变成部分无用的死码。模块化软件实现方式,是在需要时才读取动态库,在多数的案例中,不可能仅从特定的库读取相关的程序,它仍然会包含一些程序片段,在特定的环境下是可被视为死码,但是这在编译时期是无法被排除的。

    动态死码删除(dynamic dead code elimination)被使用在运行时动态侦测,可辨识及解析相依性,用以移除有条件的死码,在运行时期重新组合保留的代码。

    多数的电脑语言、编译器、操作系统不提供,或是仅比动态读取库及后链接(late linking)提供多一点点的功能,能使用动态死码删除的软件是相当稀少的。[2]

    添加视频 | 添加图册相关影像

    参考资料
    [1]^引用日期:2019-07-25
    [2]^引用日期:2019-07-25
    开放分类 我来补充

    互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于www.baike.com。

    登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。

    互动百科用户登录注册
    此词条还可添加  信息模块
    编辑摘要

    WIKI热度

    1. 编辑次数:2次 历史版本
    2. 参与编辑人数:2
    3. 最近更新时间:2006-05-17 21:13:25

    贡献光荣榜

    更多

    相关词条