仅在需要时编译代码

时间:2015-07-02 12:08:07

标签: function math hash compilation metadata

我正在编写一个程序,将代码从一种语言编译成另一种语言。例如codefile.lang1 => codefile.lang2

我希望每次程序启动时都会进行编译,但只有在需要时才进行编译,换句话说,只有在自上次编译后才进行更改。

我的猜测是我需要在编译代码(codefile.lang2)中包含某种元数据,这些元数据存储预编译代码(codefile.lang1)内容的“摘要”。 可以说,对预编译代码进行“汇总”的函数是F. 我的想法是,每次程序启动时,它都会评估F(预编译代码)并将其与编译代码中的元数据进行比较,

如果F ==元数据:不需要编译,否则编译。

由于显而易见的原因,F必须是单射的(一对一的功能)。 此外,我试图避免琐碎的实现,即F(一些代码)=一些代码

这是一个好方法吗?如果是这样,我应该用什么F? 我想过哈希,但哈希并不是完全无意义的,特别是对于大文本。

你有什么建议? 谢谢:))

1 个答案:

答案 0 :(得分:1)

最简单的方法是缓存最后编译的源代码,并将新源代码与之比较。如果有变化,你应该重新编译。

更有效的方法是存储原始源代码的散列,并将其与新源代码的散列进行比较,这将实现与上述相同,但对于大型源文件实质上更有效。

理论上你可以得到一个哈希冲突,实际上它不是你需要考虑的事情(假设你使用的是具有足够熵的体面哈希)。机会只是 低! Do the maths, and you'll see。如果你真的很偏执,你也可以检查文件匹配的大小或长度。

将来,您还可以添加特定于语言的增强功能,以检查唯一的更改是否对生成的可执行代码(即注释和格式)没有影响,但这可能比仅重新编译更慢文件。

正如@leppie所提到的,您还可以考虑文件的时间戳。