帕切贝尔已经讨论过你无法完美地完成这一事实。好的,我是一名工程师,我愿意接受我的答案中的一些污点。
回答你问题的经典方法是做数据流从程序输出回溯到程序输入。 A 数据流是将程序分配(或副作用)与变量值连接到应用程序中消耗该值的位置。
如果您关心的程序输出(在您的示例中为打印文本流)中存在(传递式)数据流,那么该输入会影响输出。从您的观点来看,不会从输入流向所需输出的变量是无用的。
如果您只关注数据流中涉及的计算并显示它们,则会得到通常称为“程序片”的内容。有(很少)商业工具可以显示给你。Grammatech在C和C++方面享有盛誉。
有构建这样的数据流图的标准编译器算法;看任何有能力的编译器书。
由于Pachelbel指出Turing的不可行性证明,它们都受到一些限制。当你实现这样的数据流算法时,会有一些地方不知道正确的答案;只需选择一个。
如果您的算法选择在某些不确定的地方回答“没有数据流”,那么它可能会错过有效的数据流,并且可能会报告变量不会错误地影响答案。 (这被称为“假否定”)。如果该算法具有其他一些很好的属性,例如它在数百万的代码上运行速度非常快,这种偶然的错误可能会令人满意。 (琐细算法简单地说,在所有的地方“没有数据流”,这是真的快速 :)
如果你的算法选择回答“是的,有一个数据流”,那么它可能会要求一些变量影响当它没有时回答。 (这被称为“误报”)。
你可以决定哪个更重要;许多人在寻找问题时更喜欢误报,因为那样你就必须至少查看工具检测到的可能性。假否定意味着它没有报告你可能关心的事情。因人而异。
这是一个起始参考:http://en.wikipedia.org/wiki/Data-flow_analysis 该页面上的任何书籍都会非常好。我有Muchnick的书,喜欢它很多。另见本页面:(http://en.wikipedia.org/wiki/Program_slicing)
你会发现,对于任何真正的语言来说,实现这个功能都是很大的努力。你可能更适合找到一个工具框架,它已经为你做了大部分或全部工作。
假设编译器可以区分这两类变量,它可以对这些信息做些什么?我认为你一般不会认为调用'save-log-to-disk'并不比函数结果重要。 –
@内部服务器错误:在考虑某个程序时,从功能的角度来看,您通常只将某些输入和输出视为有趣的。该计划可能会计算/做其他事情,但你不在乎。日志文件适合这个类别。 –