Neden Derleme Sistemi?

Sorun bildirin Kaynağı göster

Bu sayfada derleme sistemlerinin ne olduğu, ne işe yaradığı, neden derleme sistemi kullanmanız gerektiği, kuruluşunuz ölçeklenmeye başladığında derleyiciler ile derleme komut dosyalarının neden en iyi seçenek olmadığı anlatılmaktadır. Derleme sistemi konusunda 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 insan tarafından yazılmış kodlara yönelik değildir. Derleme sistemleri, aynı zamanda makinelerin test amaçlı veya üretime yönelik yayınlar için otomatik olarak derleme oluşturmasına da olanak tanır. Binlerce mühendis bulunan bir kurumda çoğu derlemenin doğrudan mühendisler yerine otomatik olarak tetiklenmesi yaygın bir durumdur.

Sadece 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 komut, Java derleyicisine mevcut dizindeki her Java kaynak dosyasını alıp bir ikili sınıf dosyasına dönüştürme talimatı verir. En basit senaryoda, ihtiyacınız olan tek şey bu.

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 (belki birkaç proje tarafından paylaşılan bir kitaplık) depolanan kodu bulmak mümkün değildir. 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ın arasında bağımlılık ağları bulunur. Bu da tek bir dil için derleyicinin tüm sistemi kuramayacağı anlamına gelir.

Birden çok dilden veya derleme biriminden gelen kodlarla uğraşırken kod oluşturma artık tek adımlı bir süreç değildir. Şimdi kodunuzun neye bağlı olduğunu değerlendirmeniz ve bu parçaları doğru sırayla derlemeniz gerekiyor. Muhtemelen her parça için farklı bir araç seti kullanacaksınız. Herhangi bir bağımlılık değişirse eski ikili programlara bağlı kalmamak için bu süreci tekrarlamanız gerekir. Hatta orta büyüklükte bir kod tabanı için bu işlem kısa sürede yorucu ve hataya 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. Derleme sistemi olmadan, bağımlılığı internetten indirerek, bunu sabit diskteki bir lib klasörüne yapıştırarak ve derleyiciyi o 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ı için durum nedir?

Hobi projenizin, bir derleyici kullanarak geliştirebileceğiniz kadar basit bir şekilde başladığını, ancak önceden açıklanan sorunlardan bazılarıyla karşılaşmaya başladığınızı varsayalım. Belki de hâlâ bir derleme sistemine ihtiyacınız olmadığını düşünmüyor ve işleri doğru sırayla yapan bazı basit kabuk komut dosyalarını kullanarak can sıkıcı kısımları otomatikleştirebilirsiniz. Bu bir süre yardımcı olacaktır, ancak çok sonra daha fazla sorunla karşılaşmaya başlarsınız:

  • Bu da yorucu oluyor. Sisteminiz daha karmaşık hale geldikçe derleme komut dosyalarınız üzerinde gerçek kod üzerinde çalışmaya neredeyse vakit harcamaya başlarsınız. Kabuk komut dosyalarında hata ayıklama işlemi zahmetlidir. Bu nedenle, giderek daha fazla saldırı birbirlerinin üzerine yerleştirilmektedir.

  • Yavaş yavaş. Yanlışlıkla eski kitaplıklara güvenmediğinizden emin olmak için derleme komut dosyanızın, her çalıştırışınızda her bağımlılığı sırayla derlemesini sağlarsınız. Hangi parçaların yeniden oluşturulması gerektiğini tespit etmek için bir mantık eklemeyi düşünüyorsunuz, ancak bu yöntem 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: Şarkınızı yayınlama zamanı geldi. Nihai derlemenizi yapmak için jar komutuna iletmeniz gereken tüm bağımsız değişkenleri tespit etmeniz önerilir. Ayrıca verileri nasıl yükleyeceğinizi ve merkezi depoya nasıl aktaracağınızı da unutmayın. Dokümanlar güncellemelerini oluşturup aktarın ve kullanıcılara bir bildirim gönderin. Hımm, belki bunda başka bir komut dosyası gerekebilir...

  • Felaket! Sabit diskiniz kilitleniyor ve şimdi tüm sisteminizi yeniden oluşturmanız gerekiyor. Kaynak dosyalarınızın tümünü sürüm kontrolünde tutacak kadar akıllıydınız. Peki ya indirdiğiniz kitaplıklar? Hepsini tekrar bulup ilk indirdiğinizdeki sürümle aynı olduklarından emin olabilir misiniz? Komut dosyalarınız muhtemelen belirli yerlerde yüklü belirli araçlara bağlıydı. Komut dosyalarının tekrar çalışması için aynı ortamı geri yükleyebilir misiniz? Derleyicinin doğru çalışmasını sağlamak için uzun zaman önce ayarladığınız tüm ortam değişkenleri ne olacak?

  • Sorunlara rağmen, projeniz daha fazla mühendisi işe almanıza yetecek kadar başarılı oluyor. Artık önceki sorunların ortaya çıkması için bir felaketin olmadığını fark ettiniz. Ekibinize her yeni geliştirici katıldığında aynı zahmetli önyükleme sürecinden geçmeniz gerekir. En iyi çabanıza rağmen herkesin sisteminde hâlâ küçük farklılıklar bulunuyor. Çoğu zaman, bir kişinin makinesinde işe yarayan şey bir başkasının makinesinde işe yaramaz. Ayrıca, her seferinde birkaç saat hata ayıklama araç yolları veya kitaplık sürümleriyle farkın nerede olduğunu anlamak gerekir.

  • Derleme sisteminizi otomatikleştirmeniz gerektiğine karar verdiniz. Teoride bu iş, yeni bir bilgisayar alıp derleme komut dosyanızı her gece cron kullanarak çalışacak şekilde kurmak kadar basittir. Yine de zahmetli bir kurulum işlemi gerçekleştirmeniz gerekiyor, ancak artık küçük sorunları tespit edip çözecek insan beyninden yararlanamazsınız. Artık her sabah geldiğiniz zaman dün geceki derlemenin başarısız olduğunu görüyorsunuz çünkü dün bir geliştirici kendi sisteminde çalışan ancak otomatik derleme sisteminde çalışmayan bir değişiklik yapıyor. Her seferinde basit bir düzeltme yapılsa da, bazen her gün bu basit çözümleri keşfetmek ve uygulamak için çok fazla zaman harcamanız gerekir.

  • Proje büyüdükçe derlemeler de yavaşlar ve yavaşlar. Bir gün, derlemenin tamamlanmasını beklerken, tatilde olan iş arkadaşınızın boşta olan masaüstüne hüzünlü bir şekilde bakıyor ve boşa giden bilgi işlem gücünden yararlanmanın bir yolu olsaydı keşke.

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 (şimdiye kadar üniversiteden yeni mezun olmuş bir geliştirici tüm deneyimi yaşamış olabilir) için ihtiyacınız olan tek şey bir derleyicidir. Senaryolar sizi biraz öne çıkarabilir. Ancak birden fazla geliştirici ve 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 bozulur ve gerçek bir derleme sistemine yatırım yapmanın zamanı gelir.