Bazel'in paralel değerlendirme ve artımlılık modeli.
Veri modeli
Veri modeli aşağıdaki öğelerden oluşur:
SkyValue
Düğüm olarak da adlandırılır.SkyValues
, sabit bir şekilde derleme sırasında oluşturulan tüm verileri ve projeyi seçeceğim. Örnekler: giriş dosyaları, çıkış dosyaları, hedefler ve yapılandırılmış belirler.SkyKey
BirSkyValue
öğesini referans göstermek için kısa ve sabit bir ad. Örneğin,FILECONTENTS:/tmp/foo
veyaPACKAGE://foo
.SkyFunction
Anahtarlarına ve bağımlı düğümlere göre düğümler oluşturur.- Düğüm grafiği. Bağımlılık ilişkisini içeren bir veri yapısı düğüm.
Skyframe
Artımlı değerlendirme çerçevesi Bazel'in kod adı: seçmeniz gerekir.
Değerlendirme
Derleme isteğini temsil eden düğüm değerlendirilerek bir derleme gerçekleştirilir.
Bazel ilk olarak üst düzey anahtara karşılık gelen SkyFunction
SkyKey
. Ardından fonksiyon, işleme alması gereken düğümlerin
üst düzey düğümü değerlendirin. Bu da başka SkyFunction
çağrılarıyla sonuçlanacaktır.
yaprak düğümlerine ulaşılana kadar bekleyin. Yaprak düğümleri genellikle
dosya sistemine girmelidir. Son olarak, Bazel
üst düzey SkyValue
, bazı yan etkiler (dosyadaki çıkış dosyaları gibi)
sistemi) ve düğümler arasındaki bağımlılıkların yönlendirilmiş bir döngüsel grafiği
dahil edilir.
SkyFunction
, bildiremezse birden fazla kartta SkyKeys
isteğinde bulunabilir
çalışmasını sağlamak için gereken tüm düğümleri destekler. Basit bir örnekle,
sembolik bir bağlantı olduğu ortaya çıkan bir giriş dosyası düğümü vardır:
dosyaya sembolik bir bağlantı olduğunu anlar ve böylece dosya sistemi düğümünü getirir
temsil eder. Ancak bu sembolik bir bağlantı da
Bu durumda, orijinal işlevin hedefini de getirmesi gerekir.
Fonksiyonlar, kodda SkyFunction
arayüzü ve
hizmetlerini SkyFunction.Environment
adı verilen bir arayüz tarafından sağlanan tüm hizmetlerde alır. Bu
işlevlerin yapabileceği işlemler şunlardır:
env.getValue
öğesini çağırarak başka bir düğümün değerlendirilmesini isteyin. Eğer düğüm kullanılabilir, değeri döndürülür, aksi takdirdenull
döndürülür ve işlevin kendisininnull
değerini döndürmesi beklenir. İkinci durumda bağımlı düğüm değerlendirilir ve ardından orijinal düğüm oluşturucu çağrılır, ancak bu kez aynıenv.getValue
çağrısı birnull
dışındaki bir değer.env.getValues()
öğesini çağırarak başka düğümlerin değerlendirilmesini isteyin. Bu da temelde aynı işlevi görür ancak bağımlı düğümlerin paralel olarak değerlendirilir.- Çağrı sırasında hesaplama yapma
- Dosya sistemine dosya yazma gibi yan etkileri vardır. Bakım ihtiyaçları iki farklı işlevin birbirinin işlevlerine basmadığını ayak parmakları. Genel olarak, yan etkileri yazın (verilerin Bazel'den dışa doğru aktığı) (verilerin herhangi bir güncelleme olmadan Bazel'e doğru kayıtlı olmayan bağımlılıklar olduğu için, bunlar ve bu nedenle yanlış artımlı derlemelere neden olabilir.
İyi çalışan SkyFunction
uygulamaları, verilere başka bir şekilde erişilmesini önler
bağımlılık talep etmekten (mesela dosya sistemini doğrudan okuyarak)
çünkü bu, Bazel'in dosyaya olan veri bağımlılığını kaydetmemesini sağlar.
bu da yanlış artımlı derlemelere
neden oluyor.
Bir işlev, işini yapmak için yeterli veriye sahip olduğunda null
olmayan bir veri döndürmelidir
tamamlandığını gösteren
değerdir.
Bu değerlendirme stratejisinin bazı avantajları vardır:
- Hermetiklik. İşlevler yalnızca bağlı olarak başka düğümler varsa Bazel, giriş durumunun aynı olması durumunda aynı veri döndürülür. Tüm gökyüzü fonksiyonları deterministikse, bu demek oluyor ki tüm yapının da deterministik olmasını sağlar.
- Artımlılık doğru ve mükemmel olmalıdır. Tüm fonksiyonların tüm giriş verileri kaydedildiğinde Bazel, yalnızca tek bir açılış sayfasına yönlendirmesi gereken düğüm grubunu giriş verileri değiştiğinde geçersiz hale gelir.
- Paralellik. Fonksiyonlar birbiriyle yalnızca ve birbirine bağımlı olmayan fonksiyonlar ve Bazel, sonucun öncekiyle aynı olmasını garanti edebilir ve bunlar sıralı olarak çalıştırıldı.
Artımlılık
İşlevler yalnızca diğer düğümlere bağlı olarak giriş verilerine erişebildiğinden Bazel giriş dosyalarından çıkışa kadar eksiksiz bir veri akışı grafiği oluşturabilir. ve bu bilgileri, yalnızca gerçekten ihtiyacınız olan düğümleri yeniden oluşturmak için Değiştirilen giriş dosyaları grubunun ters geçişli olarak kapatılması.
Özellikle, iki olası artımlılık stratejisi vardır: aşağıdan yukarıya. yukarıdan aşağıya doğru olanı. Bağımlılık grafiğinin nasıl oluşturulduğuna ve yardımcı oluyorum.
Aşağıdan yukarıya geçersiz kılma sırasında, bir grafik oluşturulduktan ve değiştirilen küme olduğu için tüm düğümler geçişli olarak bağımlı olan değiştirilmiş dosyalar. Aynı üst düzey düğüm oluşturulacaksa bu en uygun seçenektir tekrar. Aşağıdan yukarıya geçersiz kılma işlemi için tüm kontrollerde
stat()
komutunun çalıştırılması gerektiğini unutmayın. ve bunların değiştirilip değiştirilmediğini belirlemek için önceki derlemenin dosyalarını girin. Bu yardımcı olmak içininotify
veya benzer bir mekanizma kullanılarak daha iyi hale getirilebilir. değiştirilmiş dosyalar.Yukarıdan aşağıya geçersiz kılma sırasında üst düzey düğümün geçişli olarak kapatılması işaretlenir ve yalnızca geçişli kapanışı temiz olan düğümler tutulur. Düğüm grafiği büyükse bu daha iyidir, ancak sonraki derlemede yalnızca küçük alt kümesi: aşağıdan yukarıya geçersiz kılma, büyük grafiği geçersiz kılar yukarıdan aşağıya geçersiz kılmanın aksine, ilk derlemenin grafiği oluşturalım.
Bazel yalnızca aşağıdan yukarıya geçersiz kılma işlemi yapar.
Bazel, daha fazla artımlılık elde etmek için değişiklik budamayı kullanır: ancak yeniden oluşturma işleminde yeni değerinin aynı olduğu tespit edildi. bu düğümdeki bir değişiklik nedeniyle geçersiz kılınan düğümler eski değeri olarak değiştirilir. "yeniden dirildi".
Bu, örneğin bir C++ dosyasındaki yorum değiştirildiğinde yararlı olur:
Bu dosyadan oluşturulan .o
dosyası aynı olacağı için çağrı yapmak gerekmez
tekrar ekleyebilirsiniz.
Artımlı Bağlantı / Derleme
Bu modelin ana kısıtlaması, bir düğümün geçersiz kılınmasının ya hep ya hiç ilişkisi yoktur: Bir bağımlılık değiştiğinde bağımlı düğüm her zaman her zaman dönüşüme yol açacak daha iyi bir algoritma bulunsa bile, düğümün eski değerine ayarlanır. Bu durumun bazı örneklerle faydalı olacaktır:
- Artımlı bağlantı
- Bir JAR dosyasında tek bir sınıf dosyası değiştiğinde, JAR dosyasını yeniden sıfırdan oluşturmak yerine yerinde değiştirebilirsiniz.
Bazel'in bunları ilkeli bir şekilde desteklememesinin nedeni iki katıdır:
- Sınırlı performans kazancı elde edildi.
- Mutasyonun sonucunun bununla aynı olduğunu doğrulamanın zorluğu fayda sağlar. Google, bitmek bilmeyen derlemeler tekrarlanabilir olması gerekir.
Şimdiye kadar, bağımsız değişkenleri ayrıştırarak ve kısmi yeniden değerlendirme yapmak anlamına gelir. Örneğin, Android uygulamasında tüm sınıfları birden fazla gruba ayırabilir ve oluşturabilirsiniz. Bu şekilde, bir gruptaki sınıflar değişmezse dexing yinelenmesi gerekmez.
Bazel kavramlarıyla eşleme
Bu, SkyFunction
ve SkyValue
ile ilgili üst düzey bir özettir
Bazel'in derleme yapmak için kullandığı uygulamalar:
- FileStateValue değerine ayarlayın.
lstat()
sonucu. Mevcut dosyalar için işlevi, bu fonksiyondaki değişiklikleri tespit etmek için ek bilgiler de seçin. Bu, Skyframe grafiğindeki en düşük seviyeli düğümdür ve ve bildirmeyi konuştuk. - FileValue (Dosya Değeri). İçeriğin kendisini önemseyen veya
bir dosyanın çözümlenmiş yolunu gösterir. İlgili
FileStateValue
ve çözümlenmesi gereken sembolik bağlantılar (a/b
içinFileValue
gibi)a
öğesinin çözümlenmiş yolunu vea/b
çözümlenmiş yolunu gerektirir). İlgili içeriği oluşturmak için kullanılanFileValue
ileFileStateValue
arasındaki ayrım önemlidir, çünkü ikinci dosya, dosya içeriğinin uygun olmadığı durumlarda yardımcı olur. Örneğin, dosya sistemi glob'larının değerlendirilmesi (srcs=glob(["*/*.java"])
gibi). - DirectoryListingStateValue.
readdir()
sonucu. BeğenmeFileStateValue
, en düşük düzeyli düğümdür ve bağımlılığı yoktur. - DirectoryListingValue aracılığıyla güncelleyin. Girişleri önemseyen her şey tarafından kullanılır
dizin oluşturur. İlgili
DirectoryListingStateValue
öğesine bağlıdır. ve dizinle ilişkiliFileValue
. - PackageValue. BUILD dosyasının ayrıştırılmış sürümünü gösterir. Şuna bağlıdır:
ilişkili
BUILD
dosyasınınFileValue
ve ayrıca Paketteki glob'ları çözümlemek için kullanılanDirectoryListingValue
(BUILD
dosyasının içeriğini dahili olarak temsil eden veri yapısı). - ConfiguredTargetValue alt değeri. Yapılandırılmış bir hedefi (tuple) temsil eder
belirli bir hedefin analizi sırasında oluşturulan işlem kümesi
Bağımlı yapılandırılmış hedeflere sağlanan bilgiler Şuna bağlıdır:
PackageValue
ilgili hedefin bulunduğuConfiguredTargetValues
ve derlemeyi temsil eden özel bir düğüm yapılandırma. - ArtifactValue. Derlemedeki bir dosyayı temsil eder (kaynak veya
çıktı yapısı. Yapılar, dosyalarla neredeyse eşdeğerdir ve çeşitli
derleme adımlarının yürütülmesi sırasında dosyalara başvurur. Kaynak dosyalar
ilişkilendirilmiş düğümün
FileValue
değerine ve çıkış yapılarına bağlıdır projeninActionExecutionValue
metriğine bağlı olduğundan tespit eder. - ActionExecutionValue. Bir işlemin yürütülmesini temsil eder. Şuna bağlıdır:
giriş dosyalarının
ArtifactValues
. Yürüttüğü işlem içeriyor inceleyebilirsiniz; bu da SkyKeys'in uygun fiyatlı küçük olabilir. Aşağıdaki durumlardaActionExecutionValue
veArtifactValue
seçeneklerinin kullanılmadığını unutmayın emin olun.
Görsel yardımcı olarak, bu diyagram, Sprint İş Listesi’ndeki Bazel'ın kendisini oluşturduktan sonra SkyFunction uygulamaları: