帕切貝爾已經討論過你無法完美地完成這一事實。好的,我是一名工程師,我願意接受我的答案中的一些污點。
回答你問題的經典方法是做數據流從程序輸出回溯到程序輸入。 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'並不比函數結果重要。 –
@內部服務器錯誤:在考慮某個程序時,從功能的角度來看,您通常只將某些輸入和輸出視爲有趣的。該計劃可能會計算/做其他事情,但你不在乎。日誌文件適合這個類別。 –