仅在需要时编译代码

Compiling code only when it's needed

我正在制作一个将代码从一种语言编译为另一种语言的程序。例如codefile.lang1 => codefile.lang2

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

我的猜测是我需要在编译代码 (codefile.lang2) 中包含某种元数据,用于存储预编译代码 (codefile.lang1) 内容的 "summarization"。 假设执行预编译代码 "summarization" 的函数是 F。 我的想法是每次程序启动时,它都会评估F(预编译代码)并将其与编译代码中的元数据进行比较,

if F == metadata: 不需要编译,否则编译。

由此可见,F 必须是单射的(一对一函数),原因很明显。 另外,我试图避免琐碎的实现,即 F(some code) = some code

这是个好方法吗?如果是这样,我应该为 F 使用什么? 我考虑过散列,但是散列不是完全单射的,尤其是对于大文本。

你有什么建议? 谢谢:)

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

一种更有效的方法是存储原始源代码的哈希值,并将其与新源代码的哈希值进行比较,这将实现与上述相同的效果,但对于大型源代码而言效率更高文件。

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

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


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