Neden Derleme Sistemi?

Sorun bildirin Kaynağı göster

Bu sayfada, derleme sistemlerinin ne olduğu, ne işe yaradığı, bir derleme sistemini neden kullanmanız gerektiği ve kuruluşunuz ölçeklendirmeye başlayan derleyiciler ile derleme komut dosyalarının neden en iyi seçim olmadığı açıklanmaktadır. Derleme sistemi konusunda fazla deneyimi olmayan geliştiriciler için tasarlanmıştır.

Derleme sistemi nedir?

Tüm derleme sistemlerinin temel 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 sadece insanlar tarafından oluşturulan kodlar için değil, makinelerin test amaçlı veya üretimde otomatik olarak derlemeler oluşturmasına da olanak tanır. Binlerce mühendisi olan bir kuruluşta, çoğu binanın doğrudan mühendisler yerine otomatik olarak tetiklenmesi yaygın bir durumdur.

Bir derleyici kullanamıyor muyum?

Derleme sistemine olan ihtiyaç hemen anlaşılamayabilir. Çoğu mühendis, kod yazmayı öğrenirken derleme sistemi kullanmaz. Çoğunlukla gcc veya javac gibi araçları doğrudan komut satırından veya entegre bir geliştirme ortamında (IDE) eşdeğeri kullanarak çağırabilirsiniz. Tüm kaynak kod aynı dizinde olduğu sürece şuna benzer bir komut kullanılabilir:

javac *.java

Bu komut, Java derleyiciye mevcut dizindeki her Java kaynak dosyasını alıp ikili sınıf dosyasına dönüştürmesini bildirir. En basit durumda bu kadar.

Ancak kod genişledikçe komplikasyonlar başlar. javac, içe aktarılacak kodu bulmak için mevcut dizinin alt dizinlerine bakmaya yetecek kadar akıllıdır. Ancak, dosya sisteminin diğer bölümlerinde (bazı projeler tarafından paylaşılan bir kitaplık) depolanan kodu bulması mümkün değildir. Ayrıca yalnızca Java kodunun nasıl oluşturulacağını da biliyor. Büyük sistemler genellikle çeşitli programlama dillerinde yazılı olan ve bu parçalar arasında bağımlılık web'leri içeren farklı parçalar içerir. Bu da, tek bir dil için hiçbir derleyicinin tüm sistemi oluşturamayacağı anlamına gelir.

Birden çok dil veya derleme biriminden alınan kodlarla çalışırken, kod oluşturma artık tek adımlı bir işlem değildir. Artık kodunuzun neye bağımlı olduğunu değerlendirmeniz ve bu parçalara uygun şekilde, muhtemelen her parça için farklı bir araç seti kullanarak derlemeniz gerekir. Herhangi bir bağımlılık değişirse, eski ikili dosyalara bağlı olmamak için bu işlemi tekrarlamanız gerekir. Orta boyutta bir kod tabanı için bu işlem kısa sürede yorucu ve hataya açık hale gelir.

Derleyici, Java'daki üçüncü taraf JAR dosyaları gibi harici bağımlılıkların nasıl işleneceği hakkında da hiçbir şey bilmez. Bir derleme sistemi olmadan, bağımlılığı internetten indirip sabit sürücüdeki bir lib klasörüne yapıştırarak ve derleyiciyi kitaplıklardan bu dizinden okuyacak şekilde yapılandırarak bunu yönetebilirsiniz. Bu harici bağımlılıkların zaman içinde güncellemeleri, sürümleri ve kaynağını yönetmek zordur.

Peki kabuk komut dosyaları?

Hobi projenizin derleyiciyle kolayca derlemeye yetecek kadar basit olduğunu, ancak daha önce açıklanan bazı sorunlarla başa çıkmaya başladığınızı varsayalım. Yine de bir derleme sistemine ihtiyacınız olmadığını düşünebilir ve görevleri doğru şekilde derleyen bazı basit kabuk komut dosyalarıyla zahmetli kısımları otomatik hâle getirebilirsiniz. Bir süreliğine faydalı olsa da yakında daha büyük sorunlarla karşılaşmaya başlıyorsunuz:

  • Sıkıcı hale gelir. Sisteminiz daha karmaşık hale geldikçe derleme komut dosyalarınız üzerinde gerçek kodla aynı şekilde çalışmaya başlayabilirsiniz. Kabuk komut dosyalarında hata ayıklama işlemi acı vericidir. Üst üste eklenen saldırıların sayısı giderek artıyor.

  • Yavaş. Eski kitaplıklara güvenmediğinizden emin olmak için derleme komut dosyanızı her çalıştırışınızda, her bir bağımlı için sırayla oluşturmanız gerekir. Hangi bölümlerin yeniden oluşturulacağını tespit etmek için belirli bir mantık eklemeyi düşünüyorsunuz, ancak bu kulağa çok karmaşık ve komut dosyası için hataya açık gibi geliyor. Ya da her seferinde hangi bölümlerin yeniden oluşturulacağını belirtmeniz gerektiğini, ancak birinci kareye geri döndüğünüzü düşünün.

  • Güzel bir haberimiz var: Yayın zamanı geldi! Son yapınızı oluşturmak için jar komutuna iletmeniz gereken tüm bağımsız değişkenleri belirleyin. Belgeyi nasıl yükleyeceğinizi ve merkezi depoya nasıl göndereceğinizi unutmayın. Ardından, doküman güncellemelerini oluşturup kullanıma sunun ve kullanıcılara bildirim gönderin. Hmm, belki başka bir komut dosyasına çağrılıyor...

  • Felaket! Sabit diskiniz kilitleniyor ve şimdi tüm sisteminizi yeniden oluşturmanız gerekiyor. Tüm kaynak dosyalarınızı sürüm kontrolünde tutacak kadar akıllıydınız, ancak indirdiğiniz kitaplıklara ne olacak? Bunların hepsini tekrar bulabilir ve ilk indirdiğiniz sürümle aynı olduklarından emin olabilir misiniz? Komut dosyalarınız muhtemelen belirli yerlere belirli araçların yüklemesine bağlıydı. Komut dosyalarının tekrar çalışması için aynı ortamı geri yükleyebilir misiniz? Derleyicinin düzgün şekilde çalışmasını sağlamak için uzun zaman önce ayarladığınız ve ardından unutulan tüm ortam değişkenleri hakkında ne düşünüyorsunuz?

  • Sorunlara rağmen, projeniz daha fazla mühendisi işe alabileceğiniz kadar başarılı. Önceki sorunların ortaya çıkmasının felaket gerektirmediğini artık anlıyorsunuz. Ekibinize her yeni geliştirici katıldığında aynı zahmetli önyükleme sürecinden geçmeniz gerekir. Tüm çabalarınıza rağmen her kişinin sisteminde hâlâ küçük farklar var. Genellikle, bir kullanıcının makinesinde nelerin çalıştığı bir başkasında işe yaramaz ve aradaki farkın nerede olduğunu anlamak için hata ayıklama aracı yollarında veya kitaplık sürümlerinde her defasında birkaç saat gerekir.

  • Derleme sisteminizi otomatikleştirmeniz gerektiğine karar verirsiniz. Teoride, yeni bir bilgisayar edinmek ve derleme komut dosyanızı her gece cron kullanarak çalıştırmak üzere ayarlamak yeterlidir. Acılı kurulum sürecinden geçmeniz gerekse de artık insan beyninin küçük sorunları tespit edip çözebilmesinin faydası yok. Dün, geliştirici burada çalışmaya başladıktan sonra otomatik oluşturulan sistemde çalışmayan bir sistem değişikliği yaptığı için her sabah çalışmaya başladığınızda dün bir binanın başarısız olduğunu gördünüz. Bu her zaman basit bir düzeltme olsa da o kadar sık gerçekleşiyor ki her gün bu basit düzeltmeleri keşfedip uygulamak için çok fazla zaman harcıyorsunuz.

  • Proje büyüdükçe derlemeler yavaşlar ve yavaşlar. Bir gün bir yapının tamamlanmasını beklerken iş arkadaşınızın boşta kalan masaüstüne bakıp tatildesiniz ve sizin de bu bilgi işlem gücünün boşa harcanmasını sağlamanın bir yolu olduğunu hayal edin.

Klasik bir ölçeklendirme sorunuyla karşılaştınız. En fazla bir iki hafta boyunca en fazla yirmi yüz kod üzerinde çalışan tek bir geliştirici için (bu, tüm deneyimi tecrübe etmiş olabilir ve henüz üniversiteden yeni mezun olmuş kıdemsiz bir geliştiricinin) olabilir. Senaryolar sizi biraz daha ileri taşıyabilir. Ancak birden fazla geliştirici ve makineleri arasında koordinasyon sağlamanız gerektiğinde, bu makinelerdeki küçük farkları hesaba katmak çok zorlaşacağından, mükemmel bir derleme komut dosyası bile yeterli değildir. Bu noktada, bu basit yaklaşım kopuk ve gerçek bir derleme sistemine yatırım yapma zamanı geldi.