Çerçeve

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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 Bir SkyValue öğesini referans göstermek için kısa ve sabit bir ad. Örneğin, FILECONTENTS:/tmp/foo veya PACKAGE://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 takdirde null döndürülür ve işlevin kendisinin null 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ı bir null 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çin inotify 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çin FileValue gibi) a öğesinin çözümlenmiş yolunu ve a/b çözümlenmiş yolunu gerektirir). İlgili içeriği oluşturmak için kullanılan FileValue ile FileStateValue 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ğenme FileStateValue, 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şkili FileValue.
  • 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ın FileValue ve ayrıca Paketteki glob'ları çözümlemek için kullanılan DirectoryListingValue (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ğu ConfiguredTargetValues 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 projenin ActionExecutionValue 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 durumlarda ActionExecutionValue ve ArtifactValue 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ı:

SkyFunction uygulama ilişkilerinin grafiği