2015-07-02 137 views
1

我正在製作一個程序,用於將代碼從一種語言編譯到另一種語言。例如codefile.lang1 => codefile.lang2僅在需要時才編譯代碼

我想編譯發生的每一個程序啓動時,但只有當它是需要的,換句話說,只有變化是自上次編譯製作。

我的猜測是我需要在編譯代碼(codefile.lang2)中包含某種類型的元數據,用於存儲預編譯代碼(codefile.lang1)內容的「彙總」。 可以說,執行預編譯代碼的「彙總」功能是F. 我的想法是,每次程序啓動時,它都會評估F(預編譯的代碼)並將其與元數據進行比較編譯代碼,

if F == metadata:不需要編譯,否則編譯。

由於顯而易見的原因,F必須是內射的(一對一函數)。 此外,我試圖避免微不足道的執行,即F(某些代碼)=某些代碼

這是一個好方法嗎?如果是這樣,我應該用什麼F? 我想過哈希,但哈希不是完全內射的,特別是對於大文本。

您有什麼建議? 謝謝:)

+0

它取決於最有可能的語言,源代碼的哈希將是一種開始的方式 – OMGtechy

+0

你的意思是依賴於語言嗎? 它依賴於語法嗎?或長度? 另外,也許哈希是一個很好的開始,但它不是最終產品中實現的東西,因爲它不是完美的。 我想完全避免碰撞。 – areller

+0

如果我添加評論。你不需要重新編譯。註釋的符號在語言之間變化 – OMGtechy

回答

1

這樣做的最簡單的方法是緩存最後編譯的源代碼,並比較新的源代碼。如果發生了變化,您應該重新編譯。

一個更有效的方法是存儲原始源代碼的散列,並將其與新源代碼的散列進行比較,該代碼將實現與上述相同,但是對於大型源文件。

惠斯特你理論上可以得到一個哈希碰撞,實際上它不是你需要考慮的東西(假設你使用的是足夠熵的體面哈希)。機會只是低! Do the maths, and you'll see。如果你真的偏執狂,你可以檢查文件匹配的大小或長度。未來,您還可以添加特定於語言的增強功能,以檢查唯一更改是否對生成的可執行代碼(即註釋和格式)沒有任何影響,但這可能會比重新編譯更慢文件。


正如@leppie提到的那樣,您還可以考慮文件的時間戳。

+0

第一種方法,F(某些代碼)=某些代碼,是我儘量避免出於某種原因(對大型源文件更高效)的原因。 但是我想最終實現的是碰撞證明,這是在需要的情況下不會跳過編譯的東西。 而我聽說過的大多數哈希函數是它們不是完全內射的,對於大文本而言,碰撞的可能性很大。 你確定散列法至少可以工作99.99999%嗎? – areller

+0

@Arik好吧,把它這樣,git使用散列來存儲提交,並使用這些散列檢查整個Linux內核,所以雖然理論上可能,你可以忽略它;)只要確保你使用一個體面的散列 – OMGtechy

+0

@ Arik我已經更新了我的答案給你一些更多的信息 – OMGtechy