2015-07-02 3 views
1

Я делаю программу, которая компилирует код с одного языка на другой. например codefile.lang1 => codefile.lang2Компиляция кода только тогда, когда это необходимо

Я хочу, чтобы компиляция выполнялась каждый раз, когда запускается программа, но только если это необходимо, другими словами, только если изменения были сделаны после последнего компиляции.

Я предполагаю, что мне нужно включить в скомпилированный код (codefile.lang2) какие-то метаданные, в которых содержится «сводка» содержимого предварительно скомпилированного кода (codefile.lang1). Допустим, что функция, которая выполняет «обобщение» предварительно скомпилированного кода, равна F. Моя идея заключается в том, что каждый раз, когда программа запускается, она будет оценивать F (предварительно скомпилированный код) и сравнивать ее с метаданными в скомпилированный код,

if F == метаданные: нет необходимости компилировать, иначе компилировать.

Из этого следует, что для очевидных причин 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

@ Арик. Я обновил свой ответ, чтобы дать вам дополнительную информацию. – OMGtechy

Смежные вопросы