Bu sayfada, derleme sistemlerinin ne olduğu, ne işe yaradığı, neden derleme sistemi kullanmanız gerektiği ve kuruluşunuz ölçeklenmeye başladığında derleyicilerin ve derleme komut dosyalarının neden en iyi seçenek olmadığı ele alınmaktadır. Derleme sistemiyle ilgili çok fazla deneyimi olmayan geliştiriciler için tasarlanmıştır.
Derleme sistemi nedir?
Temelde tüm derleme sistemlerinin tek bir amacı vardır: Mühendisler tarafından yazılan kaynak kodu, makineler tarafından okunabilen yürütülebilir ikili programlara dönüştürürler. Derleme sistemleri yalnızca insanlar tarafından yazılmış kodlara yönelik değildir. Derleme sistemleri, aynı zamanda makinelerin test amaçlı veya üretime yönelik sürümler için otomatik olarak derleme oluşturmasına da olanak tanır. Binlerce mühendisin bulunduğu bir kuruluşta, çoğu derlemenin doğrudan mühendisler tarafından değil, otomatik olarak tetiklenmesi yaygındır.
Bir derleyici kullanamaz mıyım?
Derleme sistemi ihtiyacı ilk bakışta anlaşılmayabilir. Mühendislerin çoğu, kodlamayı öğrenirken bir derleme sistemi kullanmaz. Bunun çoğu, doğrudan komut satırından gcc
veya javac
gibi araçları ya da entegre bir geliştirme ortamındaki (IDE) eşdeğerini çağırarak başlar. Kaynak kodun tamamı aynı dizinde olduğu sürece aşağıdaki gibi bir komut sorunsuz çalışır:
javac *.java
Bu, Java derleyicisine mevcut dizindeki her Java kaynak dosyasını alıp ikili sınıf dosyasına dönüştürmesini söyler. En basit durumda, ihtiyacınız olan tek şey budur.
Bununla birlikte, kod genişledikçe sorunlar başlar. javac
, içe aktarılacak kodu bulmak için mevcut dizinin alt dizinlerine bakacak kadar akıllıdır. Ancak dosya sisteminin diğer bölümlerinde (ör. birkaç proje tarafından paylaşılan bir kitaplıkta) depolanan kodu bulamaz. Ayrıca sadece Java kodu
derlemeyi biliyor. Büyük sistemler genellikle çeşitli programlama dillerinde yazılmış farklı parçalar içerir ve bu parçalar arasında bağımlılık ağları bulunur. Bu da tek bir dil için hiçbir derleyicinin sistemin tamamını derleyemeyeceği anlamına gelir.
Birden fazla dilden veya birden fazla derleme biriminden kodla uğraştığınızda kod oluşturma artık tek adımlı bir işlem değildir. Artık kodunuzun hangi bileşenlere bağlı olduğunu değerlendirmeniz ve bu bileşenleri doğru sırayla oluşturmanız gerekir. Bu işlem için her bileşen için farklı bir araç grubu kullanmanız gerekebilir. Bağımlılıklar değişirse eski ikili dosyalara bağımlı olmamak için bu işlemi tekrarlamanız gerekir. Orta büyüklükteki bir kod tabanı için bile bu süreç hızla sıkıcı ve hatalara açık hale gelir.
Ayrıca derleyici, Java'daki üçüncü taraf JAR
dosyaları gibi harici bağımlılıkların nasıl işleneceği hakkında da bilgiye sahip değildir. Bir derleme sistemi olmadan bu işlemi, bağımlılık dosyasını internetten indirerek, sabit diskteki bir lib
klasörüne yerleştirerek ve derleyiciyi bu dizindeki kitaplıkları okuyacak şekilde yapılandırarak yönetebilirsiniz. Zaman içinde bu dış bağımlılıkların güncellemeleri, sürümleri ve kaynaklarını yönetmek zorlaşır.
Kabuk komut dosyaları ne olacak?
Hobi projenizin, yalnızca bir derleyici kullanarak derleyebileceğiniz kadar basit bir başlangıç yaptığını ancak daha önce açıklanan sorunlardan bazılarıyla karşılaşmaya başladığınızı varsayalım. Hâlâ bir derleme sistemine ihtiyacınız olmadığını düşünüyor ve doğru sırayla derlemeyi yapan bazı basit kabuk komut dosyaları kullanarak sıkıcı kısımları otomatikleştirebilirsiniz. Bu yöntem bir süreliğine işe yarar ancak kısa süre sonra daha da fazla sorunla karşılaşmaya başlarsınız:
Bu durum can sıkıcı hale gelir. Sisteminiz daha karmaşık hale geldikçe, derleme komut dosyalarınız üzerinde gerçek kod üzerinde çalıştığınız kadar zaman çalışmaya başlarsınız. Kabuk komut dosyalarında hata ayıklama işlemi, birbirinin üzerine yığılmış daha fazla hile olduğu için can sıkıcıdır.
Yavaş yavaş. Yanlışlıkla eski kitaplıklara güvenmediğinizden emin olmak için derleme komut dosyanızı her çalıştırdığınızda her bağımlılığı sırayla derlemesini sağlayın. Hangi bölümlerin yeniden oluşturulması gerektiğini algılamak için bazı mantık eklemeyi düşünüyorsunuz ancak bu, bir komut dosyası için son derece karmaşık ve hataya açık görünüyor. Her seferinde hangi parçaların yeniden oluşturulması gerektiğini belirtmeyi düşünürsünüz, ama sonra kare haline dönersiniz.
Güzel bir haberimiz var: Yeni sürümün zamanı geldi. Nihai derlemenizi yapmak için jar komutuna iletmeniz gereken tüm bağımsız değişkenleri belirlemenizi öneririz. Ayrıca, dosyayı nasıl yükleyeceğinizi ve merkezi depoya nasıl göndereceğinizi unutmayın. Doküman güncellemelerini oluşturup gönderin ve kullanıcılara bildirim gönderin. Hımm, belki bunda başka bir komut dosyası gerekebilir...
Felaket! Sabit sürücünüz kilitlenirse sistemin tamamını yeniden oluşturmanız gerekir. Tüm kaynak dosyalarınızı sürüm kontrolünde tutacak kadar akıllıydınız. Peki indirdiğiniz kitaplıklar ne olacak? Bunları tekrar bulup ilk indirdiğiniz sürümle aynı sürüm olduğundan emin olabilir misiniz? Komut dosyalarınız muhtemelen belirli araçlar belirli yerlere yüklenmesine bağlıydı. Komut dosyalarının tekrar çalışması için aynı ortamı geri yükleyebilir misiniz? Derleyicinin düzgün çalışmasını sağlamak için uzun zaman önce ayarlayıp sonra unuttuğunuz tüm ortam değişkenleri ne olacak?
Sorunlara rağmen projeniz, daha fazla mühendis işe alabileceğiniz kadar başarılıdır. Artık önceki sorunların ortaya çıkması için bir felaketin gerekmediğini anlıyorsunuz. Ekibinize her yeni geliştirici katıldığında aynı zahmetli ilk kurulum sürecini yaşamanız gerekiyor. En iyi çabanıza rağmen herkesin sisteminde hâlâ küçük farklılıklar bulunuyor. Bir kişinin makinesinde işe yarayan yöntemler genellikle başka bir kişinin makinesinde işe yaramaz. Bu durumda, farkın nerede olduğunu bulmak için her seferinde araç yollarında veya kitaplık sürümlerinde birkaç saatlik hata ayıklama işlemi gerekir.
Derleme sisteminizi otomatikleştirmeniz gerektiğine karar verdiniz. Teoride bu, yeni bir bilgisayar alıp cron'u kullanarak derleme komut dosyanızı her gece çalıştıracak şekilde ayarlamak kadar basittir. Ağrılı kurulum sürecinden geçmeniz yine de gerekir ancak artık küçük sorunları tespit edip çözebilecek bir insan beyninin avantajından yararlanamazsınız. Artık her sabah işe geldiğinizde, bir geliştiricinin dün yaptığı ve kendi sisteminde işe yarayan ancak otomatik derleme sisteminde çalışmayan bir değişiklik nedeniyle önceki geceki derlemenin başarısız olduğunu görüyorsunuz. Her seferinde basit bir çözüm olsa da bu sorunlar o kadar sık yaşanır ki her gün bu basit çözümleri bulup uygulamak için çok fazla zaman harcarsınız.
Proje büyüdükçe derlemeler de yavaşlar ve yavaşlar. Bir gün, bir derlemenin tamamlanmasını beklerken tatilde olan iş arkadaşınızın boş masaüstüne hüzünle bakar ve boşa giden tüm bu bilgi işlem gücünden yararlanmanın bir yolunu dilersiniz.
Klasik bir ölçek sorunuyla karşılaştınız. En fazla bir veya iki hafta boyunca en fazla birkaç yüz satır kod üzerinde çalışan tek bir geliştirici için (bu, üniversiteden yeni mezun olmuş bir junior geliştiricinin şimdiye kadarki tüm deneyimi olabilir) tek ihtiyacınız bir derleyicidir. Komut dosyaları sizi biraz daha ileri götürebilir. Ancak birden fazla geliştirici ve onların makineleri arasında koordinasyon sağlamanız gerektiğinde, bu makinelerdeki küçük farklılıkları hesaba katmak çok zor hale geldiğinden mükemmel bir derleme komut dosyası bile yeterli olmaz. Bu noktada, bu basit yaklaşım işe yaramaz ve gerçek bir derleme sistemine yatırım yapmanın zamanı gelir.