Neden Derleme Sistemi?

Bu sayfada derleme sistemlerinin ne olduğu, ne işe yaradığı, neden bir derleme sistemi kullanmanız gerektiği ve kuruluşunuz ölçeklendirmeye başlarken derleyicilerin ve 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 basit bir amacı vardır: Mühendisler tarafından yazılan kaynak kodunu makineler tarafından okunabilen yürütülebilir ikili programlara dönüştürürler. Derleme sistemleri yalnızca insanlar tarafından yazılan kodlara yönelik değildir. Aynı zamanda makinelerin test amacıyla veya üretim sürümü yayınlamak amacıyla otomatik derlemeler 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ın bir durumdur.

Yalnızca bir derleyici kullanamaz mıyım?

Derleme sistemine olan ihtiyaç hemen anlaşılmayabilir. Çoğu mühendis, kodlamayı öğrenirken bir derleme sistemi kullanmaz. Çoğu mühendis, gcc veya javac gibi araçları doğrudan komut satırından ya da entegre geliştirme ortamındaki (IDE) eşdeğer çağırarak başlar. Kaynak kodun tamamı aynı dizinde olduğu sürece aşağıdaki gibi bir komut çalışacaktır:

javac *.java

Bu komut, Java derleyicisine geçerli dizindeki her Java kaynak dosyasını alıp ikili sınıf dosyasına dönüştürmesi talimatını verir. En basit senaryoda, ihtiyacınız olan tek şey budur.

Ancak kod genişler genişlemez komplikasyonlar başlar. javac, içe aktarılacak kodu bulmak için geçerli dizinin alt dizinlerine bakacak kadar akıllıdır. Ancak, dosya sisteminin diğer bölümlerinde (birkaç proje tarafından paylaşılan bir kitaplık olabilir) depolanan kodu bulmak mümkün değildir. Ayrıca sadece Java kodunun nasıl oluşturulacağını da bilir. 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 web'leri vardır. Bu da tek bir dil için derleyicinin tüm sistemi derlemesi mümkün değildir.

Birden fazla dilden veya derleme birimlerinden oluşan kodlar üzerinde çalışırken, yapı kodu artık tek adımlı bir işlem olmaktan çıkar. Şimdi kodunuzun neye bağlı olduğunu değerlendirmeli ve bu parçaları doğru sırayla derleyip muhtemelen her parça için farklı bir araç seti kullanmalısınız. Herhangi bir bağımlılık değişirse eski ikili programlara bağlı kalmamak için bu işlemi tekrarlamanız gerekir. Orta büyüklükte bir kod tabanı için bu işlem hızla sıkıcı ve hataya açık hale gelir.

Derleyici ayrıca, Java'da üçüncü taraf JAR dosyaları gibi dış bağımlılıkların nasıl işleneceğini bilmez. Derleme sistemi olmadan, bağımlılığı internetten indirip sabit diskte bir lib klasörüne yapıştırarak ve derleyiciyi bu dizinden kitaplıkları okuyacak şekilde yapılandırarak bunu yönetebilirsiniz. Zaman içinde bu dış bağımlılıkların güncellemesini, sürümlerini ve kaynağını yönetmek zorlaşır.

Kabuk komut dosyalarında durum nedir?

Hobi projenizin sadece bir derleyici ile oluşturabileceğiniz kadar basit olduğunu, ancak daha önce açıklanan bazı problemlerle karşılaştığınızı varsayalım. Belki de bir derleme sistemine ihtiyacınız olmadığını düşünüp bazı basit kabuk komut dosyalarını kullanarak sıkıcı kısımları otomatik hale getirebilirsiniz. Bu bir süre işe yarar ama kısa süre sonra daha da fazla sorunla karşılaşmaya başlarsınız:

  • Bu yöntem sıkıcı hale gelir. Sisteminiz daha karmaşık hale geldikçe, derleme komut dosyalarınız üzerinde gerçek kod üzerinde çalışmak kadar vakit harcamaya başlarsınız. Kabuk komut dosyalarında hata ayıklama yapmak zahmetlidir, çünkü gittikçe daha fazla saldırı birbiri üzerine katman olarak yerleştirilmektedir.

  • Yavaş çalışıyor. Eski kitaplıklardan istemeden yararlanmadığınızdan emin olmak için derleme komut dosyanızın her çalıştırıldığında sırayla her bağımlılığı derlemesini sağlayın. Hangi parçaların yeniden oluşturulması gerektiğini tespit edecek birkaç mantık eklemeyi düşünüyorsunuz, fakat bu çok karmaşık ve komut dosyası açısından hataya açık bir iş gibi görünüyor. Ya da her seferinde hangi parçaların yeniden oluşturulması gerektiğini belirlemeyi düşünüyorsunuz, ama sonrasında tekrar bir kare oluşturuyorsunuz.

  • Güzel bir haberimiz var: Albüm yayınlama zamanı geldi. Son derlemenizi yapmak için jar komutuna iletmeniz gereken tüm bağımsız değişkenleri bulsanız iyi olur. Onu nasıl yükleyeceğinizi ve merkezi depoya nasıl aktaracağınızı da unutmayın. Ayrıca doküman güncellemelerini derleyip aktararak kullanıcılara bildirim gönderebilirsiniz. Hımm, belki de bu başka bir senaryo gerektiriyor...

  • Felaket! Sabit diskiniz kilitlenir ve şimdi tüm sisteminizi yeniden oluşturmanız gerekir. Kaynak dosyalarınızın tümünü sürüm kontrolünde tutacak kadar akıllıydınız. Peki indirdiğiniz kitaplıklar ne olacak? Hepsini tekrar bulabilir ve ilk indirdiğinizdeki sürümle aynı olduklarından emin olabilir misiniz? Komut dosyalarınız muhtemelen belirli yerlerde yüklü olan belirli araçlara 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 ayarladığınız tüm bu ortam değişkenleri ve sonrasında neler unuttunuz?

  • Sorunlara rağmen projeniz daha fazla mühendis almaya başlayabileceğiniz kadar başarılı oldu. Artık önceki sorunların ortaya çıkmasının felaketle sonuçlanmadığını fark ediyorsunuz. Ekibinize her yeni geliştirici katıldığında aynı zahmetli başlatma sürecini uygulamanız gerekiyor. Elinizden geleni yapsanız bile her insanın sisteminde hâlâ küçük farklar vardır. Sık sık bir kişinin makinesinde çalışan şey başka bir kişinin cihazında işe yaramaz ve her seferinde farkın nerede olduğunu anlamak için hata ayıklama aracı yolları veya kitaplık sürümleri birkaç saat sürer.

  • Derleme sisteminizi otomatikleştirmeniz gerektiğine karar verirsiniz. Teoride bu, yeni bir bilgisayar almak ve derleme komut dosyanızı her gece cron kullanarak çalıştırmak üzere kurmak kadar basittir. Hâlâ zahmetli kurulum sürecinden geçmeniz gerekiyor, ancak şu anda insan beyninin küçük sorunları tespit edip çözmesinden yararlanamıyorsunuz. Artık her sabah, dün bir geliştirici kendi sisteminde çalışan ancak otomatik derleme sisteminde çalışmayan bir değişiklik yaptığı için dün geceki derlemenin başarısız olduğunu görüyorsunuz. Her seferinde bu basit bir çözüm gibi görünse de, her gün bu basit düzeltmeleri keşfetmek ve uygulamak için çok fazla zaman harcıyorsunuz.

  • Proje büyüdükçe derlemeler yavaşlar ve yavaşlar. Bir gün, bir derlemenin tamamlanmasını beklerken tatilde olan iş arkadaşınızın boşta kalan masaüstüne üzüntüyle bakıyor ve boşa harcanan tüm hesaplama gücünden yararlanmanın bir yolu olmasını diliyorsunuz.

Klasik bir ölçek sorunuyla karşılaştınız. En fazla bir veya iki haftada en fazla birkaç yüz satır kod üzerinde çalışan (bu, üniversiteden yeni mezun olmuş bir tecrübeli geliştiricinin şimdiye kadar yaşadığı tüm deneyim) tek bir geliştirici için ihtiyacınız olan tek şey derleyicidir. Senaryolar sizi biraz biraz daha ileriye götürebilir. Ancak birden fazla geliştirici ve geliştiricinin makinelerini koordine etmeniz gerektiğinde, mükemmel bir derleme komut dosyası bile yeterli olmaz, çünkü bu makinelerdeki küçük farklılıkları hesaba katmak çok zor hale gelir. Bu noktada, bu basit yaklaşım bozulur ve gerçek bir derleme sistemine yatırım yapma zamanı gelir.