Neden “marka” daki artımlı yapılar karma algoritmalar kullanmıyor?


10

Ben yeni başlayan makebiriyim ve ne zaman kullanacağımı merak ediyorum make clean.

Bir meslektaşım bana artımlı yapıların makedosya zaman damgalarına dayandığını söyledi . Bu nedenle, VCS'nizdeki bir dosyanın eski sürümünü kullanıma alırsanız, bunun "eski" bir zaman damgası olur ve "bu dosyayı yeniden derlemeye gerek yoktur" olarak işaretlenir. Daha sonra, bu dosya bir sonraki derlemeye dahil edilmez.
Aynı meslektaşına göre, kullanmak için bir sebep olurdu make clean.

Neyse, kabaca make cleandiğer StackExchange sorulardan "ne zaman kullanılacağı " sorusunun cevabını aldım ama diğer sorum o zaman:

Neden artımlı derlemeler make, örneğin SHA-1'e değil, dosya zaman damgalarına dayanıyor? Örneğin Git, bir dosyanın SHA-1 kullanılarak değiştirilip değiştirilmediğini başarıyla belirleyebildiğimizi gösterir.
Hız sorunları için mi?


5
make70'lerde kuruldu. SHA-1 90'lı yıllarda yaratıldı. Git 00'larda yaratıldı. İstediğiniz son şey, 30 yıldır çalışan bazı belirsiz yapılar için aniden başarısız olmaktır, çünkü biri denenmiş ve test edilmiş bir sistemle tüm modernliğe gitmeye karar vermiştir.
Sıradan

1
Dosyaları sürekli karıştırmak yavaştır. Git ayrıca değiştirilmiş dosyalar için kontrollerini optimize etmek için dosya sistemi meta verilerini kullanıyor.
CodesInChaos

4
Dosya tarihlerine dayanan orijinal çözüm çok basittir, karma kodlarını saklamak için ek dosyalara ihtiyaç duymaz ve birkaç on yıl boyunca oldukça iyi çalıştı. Neden birisi iyi çalışan bir çözümü daha karmaşık bir çözümle değiştirmelidir? Ayrıca, AFAIK çoğu VCS sistemi kullanıma alınmış dosyaları "çıkış tarihi" atar, bu nedenle değiştirilen dosyalar doğru şekilde "temizlemeden" yeniden derlemeye neden olur.
Doc Brown

@Ordous: Eğlenceli, ama burada alakalı mı? Yazılım paslanmıyor; birileri çevredeki bir şeyi değiştirdiği için verir. Sürmedikleri sürece, bu durumda hala çalışmalıdır.
Robert Harvey

1
@RobertHarvey Elbette öyle! Elbette, makeyazılımınızı güncellemezseniz, yazılımınız kırılmaz, ancak makeyeni sürümlerde geriye dönük uyumluluğa sahip olmak için çaba gösterir. Temel davranışı iyi bir sebep olmadan değiştirmek, bunun tam tersidir. Tarihler neden SHA-1'i kullanmanın orijinal olarak yapılmadığını ya da kullanılabilir olduğunda (o zamana kadar makeonlarca yıl önce) güçlendirmenin neden kolay olmadığını gösteriyor .
Sıradan

Yanıtlar:


7

Bariz (ve tartışmasız yüzeysel) bir sorun, derleme sisteminin son derleme için kullanılan dosyaların karmaları kaydını tutmak zorunda kalacağıdır. Bu sorun kesinlikle çözülebilse de, zaman damgası bilgileri dosya sisteminde zaten mevcut olduğunda yan depolama gerektirir.

Daha da ciddisi, karma aynı anlambilimi aktarmaz. T dosyasının H 1 hashiyle bağımlılık D' den oluşturulduğunu biliyorsanız ve D'nin şimdi H 2'ye hash olduğunu öğrenin , T'yi yeniden mi oluşturmalısınız ? Muhtemelen evet, ama aynı zamanda H 2 aslında dosyanın eski bir versiyonuna atıfta bulunabilir . Zaman damgaları bir sıralamayı tanımlarken, karmalar yalnızca eşitlikle karşılaştırılabilir.

Zaman damgalarının desteklediği bir özellik, bir bağımlılığın değiştiğini veya - daha ilginç bir şekilde - bir hedefin daha yeni olduğunu düşünmek için zaman damgasını (örneğin, POSIX komut satırı yardımcı programını kullanarak touch) güncelleyebilmenizdir. makeolduğundan daha fazla. Bununla oynamak kendinizi ayağa vurmak için harika bir fırsat olsa da, zaman zaman yararlıdır. Karma tabanlı bir sistemde, gerçekte hiçbir şey inşa etmeden son derleme için kullanılan karma iç veritabanını güncellemek için derleme sisteminin kendisinden destek almanız gerekir.

Kesinlikle zaman damgaları üzerinde karma kullanmak için bir argüman yapılabilirken, benim amacım aynı hedefe ulaşmak için daha iyi bir çözüm değil, farklı bir hedefe ulaşmak için farklı bir çözüm olması. Bu hedeflerden hangisinin daha arzu edilir olduğu tartışmaya açık olabilir.


1
Anlambilimler karma ve zaman damgaları arasında farklılık gösterse de, bu durumda, yaşları ne olursa olsun, geçerli dosyalara dayalı bir yapı istemeniz normalde bu durumla alakasızdır.
aks

Söylediklerinin çoğu doğrudur. Bununla birlikte, Google blaze / bazel (yangının dahili sürümü, açık kaynak olanı bazel) gibi karma kullanan iyi oluşturulmuş bir yapı sistemi, pantolon gibi zaman damgalı bir sistemden pantolonları yener. Bununla birlikte, tekrarlanabilir yapılara çok fazla çaba harcamanız gerekiyor, böylece yeniden inşa etmek yerine eski yapı eserlerini kullanmak her zaman güvenlidir.
btilly

Buradaki haritalama bire bir değil, bire bir. DŞimdi hash varsa H2ve bazı çıktılar T2inşa edilmemişse, D@H2üretmeniz ve saklamanız gerekir. Daha sonra, hangi sıra Dile H1ve H2durum arasında geçiş yaparsa yapsın, önbelleğe alınmış çıktıyı kullanabilirsiniz.
Asad Saeeduddin

1

Bir projenin tamamının karmaşası çok yavaştır. Her dosyanın her baytını okumak zorundasınız. Git her dosyayı çalıştırdığınızda her dosyada karma olmaz git status. VCS ödünç verme işlemleri normalde bir dosyanın değişiklik süresini orijinal yazılan süreye ayarlamaz. Bunu yapmaya dikkat ederseniz, bir yedekleme geri yüklemesi olur. Dosya sistemlerinin zaman damgalarına sahip olmasının tüm nedeni, bu gibi kullanım durumları içindir.

Bir geliştirici genellikle make cleanMakefile tarafından doğrudan izlenmeyen bir bağımlılık değiştiğinde çalışır. İronik olarak, bu genellikle Makefile'in kendisini içerir. Genellikle derleyici sürümlerini de içerir. Makefile'nizin ne kadar iyi yazılmış olduğuna bağlı olarak, harici kütüphane sürümleri içerebilir.

Bunlar, bir sürüm kontrolü güncellemesi yaptığınızda güncellenme eğiliminde olan şeylerdir, bu nedenle çoğu geliştirici make cleanaynı anda bir çalıştırma alışkanlığına girer , böylece temiz bir sayfadan başladığınızı bilirsiniz. Çok zaman yapmadan uzaklaşabilirsiniz, ancak yapamayacağınız zamanları tahmin etmek gerçekten zordur.


Oluşturma sırasında bir kerede ödeme yapmak yerine, karma maliyetinin dosyaların değiştirildiği zaman içinde amorti edildiği ZFS gibi dosya sistemlerini kullanabilirsiniz.
Asad Saeeduddin

1

Oluşturma sistemlerinde karma ve zaman damgaları hakkında birkaç nokta:

  1. Bir dosyayı teslim aldığınızda, zaman damgasının geçerli saate güncellenmesi gerekir; bu da yeniden oluşturmayı tetikler. İş arkadaşınızın tanımladığı şey genellikle zaman damgası sistemlerinin başarısızlık modu değildir.
  2. Zaman damgaları, karma değerlerden biraz daha hızlıdır. Zaman damgası sisteminin yalnızca zaman damgasını kontrol etmesi gerekirken, bir karma sisteminin zaman damgasını ve ardından hash değerini kontrol etmesi gerekir.
  3. Make, hafif ve bağımsız olacak şekilde tasarlanmıştır. Üstesinden gelmek için (2), hashe tabanlı sistemler genellikle hashleri ​​kontrol etmek için bir arka plan işlemi yürütecektir (örneğin Facebook'un Bekçisi ). Bu, Make'in tasarım hedeflerine (ve tarihine) aykırıdır.
  4. Karmalar, zaman damgası değiştiğinde ancak içeriği değiştirilmediğinde gereksiz yeniden oluşturmaları önler. Genellikle, bu, karma hesaplamanın maliyetini dengeler.
  5. Karmalar, önbellek önbelleklerinin projeler arasında ve bir ağ üzerinden paylaşılmasını sağlar. Yine, bu, hesaplama karmalarının maliyetini dengeler.
  6. Modern karma tabanlı yapı sistemleri Bazel (Google) ve Buck (Facebook) 'u içerir.
  7. Çoğu geliştirici, Make'ın tasarlandığı sistemlerle aynı gereksinimlere sahip olmadığından karma tabanlı bir sistem kullanmayı düşünmelidir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.