2

听说最近我一直在听 Jeff Atwood 和 Joel Spolsky 的广播节目,他们一直在谈论 dogfooding(重用您自己的代码的过程,请参阅 Jeff Atwood 的博客文章)。所以我的问题是程序员是否应该使用反编译器来查看程序员的代码是如何实现和工作的,以确保它不会破坏你的代码。或者你应该相信程序员的代码并适应它,因为使用反编译器违背了我们作为程序员所了解的关于隐藏数据的一切(至少是 OO 程序员)?

注意:我不确定这会属于哪些标签,所以请随时重新标记它。

编辑:只是为了澄清我在最后的手段上询问反编译器,说由于某种原因你无法获得源代码。对不起,我应该在原始问题中提供这个。

4

7 回答 7

5

是的,使用反编译器的输出可能很有用,但不适用于您的建议。编译器的输出看起来永远不像人类写的那样(除非它确实写了)。它不能告诉你为什么代码会这样做,或者特定变量应该意味着什么。除非您已经拥有源代码,否则这样做不太可能值得。

如果您确实有源代码,那么在您的开发过程中使用反编译器有很多充分的理由。

大多数情况下,使用反编译器输出的原因是为了更好地优化代码。有时,使用高优化设置,编译器会出错。在某些情况下,如果不比较不同优化级别的编译器输出,这几乎是不可能解决的。

其他时候,当试图从非常热的代码路径中榨取最大性能时,开发人员可以尝试以几种不同的方式排列他们的代码并比较编译结果。作为最后的手段,这可能是用汇编语言实现代码块时最简单的方法,即复制编译器的输出。

于 2009-02-18T02:51:57.397 回答
4

Dogfooding 是使用您编写的代码的过程,不一定是重复使用代码。

但是,代码重用通常意味着您拥有源代码,因此“代码重用”否则它只是使用其他人提供的库。

反编译很难正确,输出通常很难理解。

于 2009-02-18T02:35:12.973 回答
1

如果它是完成工作所需的工具,则应该使用反编译器。但是,我不认为正确使用反编译器来了解被反编译的代码的编写情况。根据您使用的语言,反编译的代码可能与实际编写的代码有很大不同。如果您想查看一些真实代码,请查看开源代码。如果您想查看某个特定产品的代码,最好尝试通过某种合法方式访问实际代码。

于 2009-02-18T02:36:44.547 回答
1

我不确定您到底在问什么,您期望“反编译器”向您展示什么,或者这与 Atwood 和 Spolsky 有什么关系,或者问题到底是什么。如果您正在对公共接口进行编程,那么您为什么需要查看第三方代码的原始来源以查看它是否会“破坏”您的代码?您可以更有效地构建测试以确定这一点。同样,“反编译器”会告诉你什么很大程度上取决于编写软件的语言/平台,无论是 Java、.NET、C 等等。即使在 .NET 程序集的情况下,它也与读取原始源代码不同。反正,如果您担心第三方代码不适合您,那么您真的应该对代码进行典型的单元测试,而不是尝试“反编译”它。至于你是否“应该”,如果你的意思是你是否“应该”以其他方式而不是最好地利用你的时间,那么我不确定你的意思。

于 2009-02-18T02:37:45.417 回答
1

程序员应该使用反编译器吗?

为正确的工作使用正确的工具。反编译器通常不会产生易于理解的结果,但有时它们是需要的。

程序员是否应该使用反编译器来查看程序员的代码是如何实现和工作的,以确保它不会破坏您的代码。

不,除非您发现问题并需要支持。一般来说,如果你不信任它,你就不会使用它,如果你必须使用它,即使你不信任它,你也要开发测试来证明功能并验证以后的升级是否仍然按预期工作。

不要使用你没有测试的功能,除非你有很好的支持或信任关系。

-亚当

于 2009-02-18T02:42:06.967 回答
1

或者你应该相信程序员的代码并适应它,因为使用反编译器违背了我们作为程序员所了解的关于隐藏数据的一切(至少是 OO 程序员)?

这根本不是真的。您将使用反编译器不是因为您想绕过任何类型的抽象、封装或破坏 OO 原则,而是因为您想了解为什么代码表现得更好。

有时您需要使用反编译器(或者在 Java 世界中,字节码查看器),当您使用 3rd 方库解决一个恼人的错误时,其中抛出异常而没有有用的错误消息、没有日志记录等。

使用反编译器与 OO 原则无关。

于 2009-02-18T02:57:59.673 回答
1

对此的简短回答......对公共和文档化规范进行编程,而不是实现。依赖实现细节和副作用会烧死你。

反编译不是帮助您正确编程的工具,尽管它可能会在紧要关头帮助您理解您没有源代码的其他人代码的问题。

另外,要注意反编译可能存在的法律风险;许多软件公司都有禁止反编译的条款,这可能会使您和您的雇主面临法律后果。

于 2009-02-18T03:30:15.493 回答