问题标签 [code-elimination]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
466 浏览

java - javac代码消除能力

我很难找到有关javac的代码消除功能的信息:

我读到,如果您有类似以下内容,则if- 语句将被消除:

但是这个怎么样,例如:

或这个:

由于分析程序以找到所有死代码(可能类似于停止问题)非常困难/不可能,我想只有少数定义明确的构造(如上面的第一个示例),它们javac将识别并删除可靠。是否有这些构造的完整列表?

0 投票
2 回答
494 浏览

haskell - 死代码和/或如何从 Haskell 源代码生成交叉引用

我的代码库中有一些未使用的功能,但很难识别。随着我探索其问题空间和可能的解决方案,代码在去年发生了变化。我需要做的是找到未使用的代码,这样我就可以摆脱它。如果它以可导出的名称为基础处理问题,我很高兴。GHC 有处理未导出的未使用代码的警告。任何特定于该任务的工具都会引起人们的兴趣。

但是,我对一个全面的交叉引用工具很好奇。我可以使用这样的工具找到未使用的代码。几年前,当我在使用 C 和汇编程序时,我发现一个好的外部参照是一个非常方便的工具,可用于许多不同的目的。

我用谷歌搜索无处可去。显然,在 Haskell 中,交叉引用的主要含义是在文学编程中。虽然可能会有一些有用的东西。

0 投票
2 回答
486 浏览

java - Java 常量表达式和代码消除

正如这里所讨论的,javac 和其他 Java 编译器可以为if条件是“常量表达式”的语句提供代码消除功能。

如果我的代码使用依赖于不同包中定义的其他常量表达式的常量表达式,这会受到怎样的影响?

例如,假设我在各自指定的包中有以下类:

显然,如果foo-package 在运行时从外部 jar 文件加载,编译器在技术上不能仅仅假设这Foo.CONDITION将是错误的并且不应该消除-statementtrueif-branch。

然而,如果FooBar实际上在同一个包中,则true-branch 肯定应该被消除(如果编译器完全支持代码消除)。

不太确定如何最好地表达这个问题,但是:对于常量表达式 inFoo需要多“接近”才能被认为是常量 in ?他们需要在同一个文件中吗?同一个包?同一个jar文件?还是根本不重要(即编译器是否总是将其视为常量并在编译时使用在构建路径中找到的值)?BarFooBarFoo.CONDITION

0 投票
5 回答
1520 浏览

c# - 是否有可能总是消除goto?

虽然使用goto 做任何事情都很容易(如 f.ex. IL 所证明的那样),但我想知道是否也可以使用 Java 支持的所有内容来消除具有更高级别表达式和语句的所有goto 语句 - 比如说。

或者,如果您喜欢:我正在寻找的是始终有效的“重写规则”,无论 goto 的创建方式如何。

它主要是作为一个理论问题,纯粹是作为兴趣;不是好/坏的做法。

我想到的显而易见的解决方案是使用这样的东西:

虽然这可能会起作用并且确实符合我的“正式”问题,但我一点也不喜欢我的解决方案。一方面,它非常丑陋,另一方面,它基本上将 goto 包装到一个与 goto 完全相同的开关中。

那么,有没有更好的解决方案?


更新 1

由于很多人似乎认为这个问题“太宽泛”,所以我将详细说明……我提到 Java 的原因是因为 Java 没有“goto”语句。作为我的爱好项目之一,我试图将 C# 代码转换为 Java,这被证明是非常具有挑战性的(部分原因是 Java 中的这种限制)。

这让我思考。如果你有 f.ex. 开放寻址中'remove'方法的实现(参见:http ://en.wikipedia.org/wiki/Open_addressing - 注1),在特殊情况下使用'goto'非常方便,尽管在这个特殊的情况下如果您可以通过引入“状态”变量来重写它。请注意,这只是一个示例,我已经为延续实现了代码生成器,当您尝试对它们进行反编译时,它们会产生大量的 goto。

我也不确定在这件事上重写是否总是会消除“goto”语句,以及是否在每种情况下都允许。虽然我不是在寻找正式的“证据”,但有一些证据表明在这件事上可以消除是很好的。

所以关于“广泛性”,我挑战所有认为有“太多答案”或“重写 goto 的多种方法”的人,以提供一种算法或一种方法来重写一般情况,因为我找到的唯一答案到目前为止是我发布的一个。

0 投票
1 回答
934 浏览

assembly - 高斯消除法组装 MIPS

该程序应考虑以下功能: 将要求解的系统的二维数组作为现有变量存储器传递给程序。- 数据是双浮点类型。- 程序应将结果保存在另一个变量中。-程序应该在被解决之前显示线性方程组,最后应该显示解决方案。

我做了这个显示矩阵的代码:

我不知道如何应用高斯方法。你们能帮帮我吗?

0 投票
1 回答
55 浏览

google-closure-compiler - 谷歌编译器没有将空数组分配给变量?

所以我对使用谷歌编译器很陌生,并且遇到了一些问题。第一个是在我的预处理代码中,我将一个空数组设置为稍后将填充的变量,但是在编译它时会完全删除该变量,以便以后尝试使用它时它变得未定义。

这是我稍微修改的代码。第 19 行最终被删除,因此 rowDivs 在第 44 行显示为未定义:

对于编译器设置,我使用以下标志。请注意,我什至没有使用高级优化复杂级别:

我可能遗漏了一些明显的东西,但只是想走上正轨。谢谢。

0 投票
1 回答
76 浏览

unit-testing - 是否需要告诉 Perl 编译器不要优化带有忽略返回值的函数调用?

我正在编写新的 Perl 5 模块Class::Tiny::ConstrainedAccessor以在您触摸对象属性时通过设置或获取默认值来检查类型约束。我正在编写单元测试并希望为后一种情况运行访问器。但是,我担心 Perl 可能会优化我的访问器函数调用,因为返回值被丢弃了。会吗?如果是这样,我可以告诉它不要吗?是否记录了相应的行为?如果答案像“别担心”一样简单,那已经足够了,但是对文档的引用将不胜感激:)。

当我在 Perl 5.26.2 x64 Cygwin 上运行以下 MCVE 时,它会成功。但是,我不知道这是否得到保证,或者它是否恰好现在起作用并且可能有一天会改变。

这个问题涉及变量,但不涉及函数。 perlperf说 Perl 会优化掉各种东西,但是除了()原型函数之外,我不清楚是什么。

在 JavaScript 中,我会说void obj.accessor();,然后我肯定会知道它会运行,但结果会被丢弃。但是,我不能undef $obj->accessor;用于类似的效果;编译合法地失败了Can't modify non-lvalue subroutine call of &Klass::accessor.

0 投票
1 回答
157 浏览

javascript - v8 是否能够根据 `const` 的值消除死代码?

v8 开发人员/专家的问题。

假设 v8 将完全消除死代码是否正确,结构如下:

模块1.js

模块2.js

请不要发表评论,例如“'if'检查的开销非常小,您应该 XXX 而不是问这个问题”,我只想知道 v8 是否能够做到这一点(是/否,当然最好有一些细节)。

谢谢!

0 投票
1 回答
54 浏览

c++ - 使用 gcc 编译时禁用所有明显的消除(不更改我的源代码!)

我想在使用 gcc 编译时保留所有死代码(或者任何明显可以优化的代码),但即使使用-O0,一些死代码仍然被优化。如何在不更改源代码的情况下保留所有代码?示例代码如下,使用 编译时g++ -S -O0 main.ccif-statement会在汇编代码中进行优化(没有cmpljmp代码)。

一个相关的问题在这里:禁用 gcc 中的“if(0)”消除。但是那里的答案需要您更改我不想做的源代码(删除 const/constexpr 限定符)。

难道是我不更改我的源代码而只使用一些编译器标志来实现这一点?