Bu sayfada, göreve dayalı derleme sistemleri, nasıl çalıştıkları ve komplikasyonları beraberinde getirir. Kabuk komut dosyalarından sonra, göreve dayalı derleme sistemleri, binaların mantıksal evrimidir.
Görev tabanlı derleme sistemlerini anlama
Görev tabanlı bir derleme sisteminde, temel çalışma birimi görevdir. Her biri görev, her türlü mantığı yürütebilen bir komut dosyasıdır. Görevler ise diğer önce çalışması gereken bağımlılıklar olarak düşünebilirsiniz. Kullanılan en önemli derleme sistemleri bugün, Ant, Maven, Gradle, Grunt ve Rake gibi modeller göreve dayalı. Şunun yerine: kabuk komut dosyalarını, çoğu modern derleme sisteminde mühendislerin bir şablondur.
Bu örneği Ant kılavuzu:
<project name="MyProject" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init"
description="compile the source">
<!-- Compile the Java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile"
description="generate the distribution">
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean"
description="clean up">
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
Derleme dosyası XML'de yazılır ve derlemeyle ilgili bazı basit meta verileri tanımlar.
ve görev listesi (XML'deki <target>
etiketleri) sağlar. (Karınca
hedef bir görevi temsil eder ve ifade etmek için görev kelimesini kullanır
komutlar gibi). Her görev, Karınca tarafından tanımlanan olası komutların bir listesini yürütür.
Bu işlemler arasında dizin oluşturma ve silme, javac
çalıştırma ve
JAR dosyası oluşturuyoruz. Bu komut grubu, kullanıcı tarafından sağlanan komutlar tarafından genişletilebilir
her tür mantığı kapsaması için ekleyebilirsiniz. Her görev ayrıca o görev için
bağımlı özelliği aracılığıyla değişir. Bu bağımlılıklar döngüsel bir grafik,
Şekil 1'de gösterildiği gibidir.
Şekil 1. Bağımlılıkları gösteren döngüsel grafik
Kullanıcılar, Ant'ın komut satırı aracına görev vererek derlemeleri gerçekleştirir. Örneğin,
bir kullanıcı ant dist
yazdığında Karınca şu adımları uygular:
- Geçerli dizinde
build.xml
adlı bir dosyayı yükler ve şuna ayrıştırır: Şekil 1'de gösterilen grafik yapısını oluşturabilirsiniz. - Komut satırında sağlanan
dist
adlı görevi arar ve bu görevin,compile
adlı göreve bir bağımlılığı olduğunu keşfeder. compile
adlı görevi arar ve şuna bağımlı olduğunu keşfeder:init
adlı görev.init
adlı görevi arar ve herhangi bir bağımlılığı olmadığını keşfeder.init
görevinde tanımlanan komutları yürütür.- Tüm bu koşulları göz önünde bulundurarak
compile
görevinde tanımlanan komutları yürütür ve bu görevin bağımlılıkları yürütüldüğünden emin olun. - Tüm bu koşulları göz önünde bulundurarak
dist
görevinde tanımlanan komutları yürütür ve bu görevin bağımlılıkları yürütüldüğünden emin olun.
Sonuç olarak, dist
görevini çalıştırırken Karınca tarafından yürütülen kod eşdeğerdir
şu kabuk komut dosyasına ekleyin:
./createTimestamp.sh
mkdir build/
javac src/* -d build/
mkdir -p dist/lib/
jar cf dist/lib/MyProject-$(date --iso-8601).jar build/*
Söz dizimi kaldırıldığında, derleme dosyası ve derleme komut dosyası aslında
pek de farklı değil. Ama bu sayede zaten büyük kazanç elde ettik. Google'da
diğer dizinlerde yeni derleme dosyaları oluşturun ve bunları birbirine bağlayın. Bu sayede
rastgele ve karmaşık yollarla mevcut görevlere dayalı yeni görevler ekleme. Biz
ant
komut satırı aracına yalnızca tek bir görevin adını iletebilir ve
çalıştırılması gereken her şeyi belirler.
Karınca, ilk olarak 2000'de piyasaya sürülen eski bir yazılımdır. Örneğin, Maven ve Gradle ara yıllarda Karınca'yı iyileştirdiler. otomatik yönetim gibi özelliklerle değiştirilmiştir. bağımlılıkları ve XML içermeyen daha net bir söz dizimi. Ancak bu yeni platformların doğası aynı kalır: mühendislere komut dosyalarını kolayca prensip haline getirilmiş ve modüler bir şekilde yürüttük ve bu görevlerin yürütülmesi için ve yönetmeyi öğreneceksiniz.
Görev tabanlı derleme sistemlerinin karanlık tarafı
Bu araçlar temelde mühendislerin herhangi bir komut dosyasını görev olarak tanımlamasına olanak tanıdığından son derece güçlü olup hayal edebileceğiniz hemen her şeyi yapmanızı görüntüleyebilirsiniz. Ancak bu gücün bazı dezavantajları vardır ve göreve dayalı derleme sistemleri, oluşturma komut dosyaları daha karmaşık hale geldiğinden bunlarla çalışmak zorlaşır. İlgili içeriği oluşturmak için kullanılan bir sorun da bu sistemlere çok fazla güç veya sisteme yeterli gücün olmamasını sağlayabilir. Çünkü sistemin çok ihtiyatlı olması gerektiği için performansta düşüş yaşanır. ve yürütme aşamalarında ne kadar rol oynar? Sistem bunun hiçbir şey için her bir komut dosyasının olması gerektiği gibi çalıştığını doğrulayın, bu nedenle komut dosyaları daha karmaşıktır ve hata ayıklama gerektiren başka bir unsurdur.
Derleme adımlarını paralel yapma zorluğu
Modern geliştirme iş istasyonları oldukça güçlüdür ve bunların her biri paralel olarak birkaç derleme adımı yürütebilir. Ama görev tabanlı sistemler görevin yürütülmesi gerektiği gibi görünse de genellikle sahip olacaksınız. A görevinin B ve C görevlerine bağlı olduğunu varsayalım. Çünkü B ve C görevleri birbirine bağımlı olmadığı için, bunları aynı anda çalıştırmak güvenli midir? daha hızlı bir şekilde A görevine geçmesini mi sağlayacak? Belki de herhangi bir birlikte çalışır. Ama belki de hayır. Her iki durumda da izleme için aynı dosyayı durumlarının aynı anda çalıştırılması bir çakışmaya neden olur. Hayır, çoğu zaman sistem bunu bilebilir, o yüzden bu çatışmaları (nadir bulunan ancak hata ayıklaması çok zor yapı sorunlarına yol açar) veya tüm derlemeyi tek bir işlemde tek bir iş parçacığında çalışacak şekilde sınırlandırır. Bu, güçlü bir geliştirici makinesini israfa yol açabilir ve derlemenin birden fazla makineye dağıtılması olasılığını belirler.
Artımlı derlemeleri gerçekleştirme zorluğu
İyi bir derleme sistemi, mühendisler makine öğrenimi gibi güvenilir artımlı derlemeler ve küçük bir değişikliğin kod tabanının tamamının yeniden oluşturulmasını gerektirmediğini oluşturalım. Bu, özellikle derleme sistemi yavaşsa ve sistem yukarıda belirtilen nedenlerden dolayı derleme adımlarını paralel hale getirin. Ama ne yazık ki, görev tabanlı derleme sistemleri de bu açıdan zorlaşır. Görevler her şeyi yapabileceği için genel olarak bunların yapılıp yapılmadığını kontrol etmenin bir yolu yoktur. Birçok görev bir dizi kaynak dosya alarak bir dizi kaynak dosyası oluşturmak için bir derleyici ikili programlar; bu nedenle, kaynak dosyalarda sorun yoksa değişmedi. Ancak ek bilgi olmadan sistem bunu söyleyemez emin olabilirsiniz. Görev, değiştirilmiş olabilecek bir dosya indirir veya her çalıştırmada farklı olabilecek bir zaman damgası yazar. Garanti yeniden çalıştırması gerektiği anlamına gelir. Biraz mühendislere izin vererek artımlı derlemeler oluşturmayı, gerekli koşulları ve koşulları ifade eder. Bu bazen uygulanabilir ancak genellikle göründüğünden çok daha karmaşık bir problem. Örneğin, C++ gibi, dosyaların doğrudan diğer dosyalara eklenmesine olanak tanır. değişiklikler için izlenmesi gereken dosya grubunun tamamını belirlemek imkansız olduğu anlamına gelir. Mühendisler çoğu zaman kestirme yollara başvuruyor Bu kısayollar, görev sonucunun belirli bir görev sonucunun kullanılmaması gerektiği halde tekrar kullanılmasıdır. Bu durumla sık sık mühendisler, yeni bir yapıya kavuşmak için her derlemeden önce temizlik yapmayı alışkanlık haline getirin. geliştirme sürecinin ilk aşamasında artımlı yer. Bir görevi ne zaman tekrar çalıştırmanız gerektiğini belirlemek şaşırtıcı derecede kolay değildir ve insanlardan çok makineler tarafından daha iyi işleme alınır.
Komut dosyalarını yönetme ve hata ayıklama konusunda zorluk
Son olarak, görev tabanlı derleme sistemlerinin uyguladığı derleme komut dosyaları zorlaşır. Sıklıkla daha az incelik gösterseler de, komut dosyaları inşa edilen sistem gibi kodlardır ve hataların kolayca gizlenebildiği yerlerdir. Aşağıda, göreve dayalı derleme sistemi:
- A görevi, çıkış olarak belirli bir dosya üretmesi için B görevine bağlıdır. Sahibi B görevi diğer görevlerin buna bağlı olduğunun farkında değildir; bu nedenle, ve farklı bir konum üretebilir. Bu durum, yalnızca bir kullanıcı A görevini çalıştırmaya çalışır ve başarısız olduğunu görür.
- Görev A, B görevine bağlıdır. B görevi ise C görevine bağlıdır. Bu görev, gereken çıktı olarak kullanabilirsiniz. B görevinin sahibi artık C görevine bağlı olmadığına karar verir. Bu da B görevi C görevini hiç önemsememesine rağmen A görevi başarısız olur.
- Yeni bir görevin geliştiricisi yanlışlıkla o görev hakkında bir aracın konumu veya aracın değeri gibi değişkenlerine odaklanacağız. Görev, kullanıcının makinesinde çalışıyor ancak başarısız oluyor otomatik olarak eklenir.
- Görev, dosya indirme gibi deterministik olmayan bir bileşen içeriyor veya derlemeye zaman damgası ekleyerek kullanabilirsiniz. Kullanıcılar artık her çalıştırıldığında farklı sonuçlar elde edebilir. Bu da mühendisler her zaman birbirlerinin hatalarını yeniden üretip düzeltemeyebilir. veya otomatik bir derleme sisteminde oluşan hatalar için de faydalıdır.
- Birden çok bağımlılığı olan görevler yarışma koşulları oluşturabilir. Görev A ise görev B’ye ve C görevine bağlıdır; B ve C görevi de dosyasıyla birlikte, A görevi de B ve C görevlerinden hangisinin biter.
Bu performans ve doğruluk sorunlarını gidermenin genel amaçlı bir yolu yoktur. sürdürülebilirlik sorunlarından bahsedeceğiz. Şimdilik hoşça kalın mühendisler derleme sırasında rastgele çalışan rastgele bir kod yazabildiği için her zaman derlemeleri hızlı ve kolay bir şekilde çalıştırabilmek için sağlayabilir. Sorunu çözmek için gücümüzden yararlanmamız gerekiyor. yeniden vererek sistemi yeniden oluşturup değil, eserler üretmekten ibarettir.
Bu yaklaşım, Blaze gibi yapı tabanlı derleme sistemlerinin oluşturulmasını sağladı ve Bazel.