Neden Derleme Sistemi?

Sorun bildir Kaynağı görüntüle Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Bu sayfada, derleme sistemlerinin ne olduğu, ne işe yaradığı, neden derleme sistemi kullanmanız gerektiği ve kuruluşunuz büyümeye başladığında derleyicilerin ve derleme komut dosyalarının neden en iyi seçenek olmadığı açıklanmaktadır. Bu kılavuz, derleme sistemi konusunda fazla deneyimi olmayan geliştiriciler için hazırlanmıştır.

Derleme sistemi nedir?

Temelde tüm derleme sistemlerinin basit 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ürmek. Derleme sistemleri yalnızca insanlar tarafından yazılan kodlar için değil, makinelerin de test veya üretime yönelik yayınlar için otomatik olarak derleme oluşturmasına olanak tanır. Binlerce mühendisin çalıştığı bir kuruluşta, çoğu derlemenin doğrudan mühendisler tarafından değil, otomatik olarak tetiklenmesi yaygın bir durumdur.

Sadece derleyici kullanamaz mıyım?

Derleme sistemine duyulan ihtiyaç hemen anlaşılmayabilir. Mühendislerin çoğu kod yazmayı öğrenirken derleme sistemi kullanmaz. Çoğu, gcc veya javac gibi araçları doğrudan komut satırından ya da entegre geliştirme ortamında (IDE) eşdeğer bir şekilde ç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 geçerli 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.

Ancak kod genişlediği anda sorunlar 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 (ör. birkaç proje tarafından paylaşılan bir kitaplık) depolanan kodu bulamaz. Ayrıca yalnızca Java kodu oluşturmayı bilir. Büyük sistemler genellikle çeşitli programlama dillerinde yazılmış farklı parçalar içerir. Bu parçalar arasında bağımlılık ağları bulunur. Bu nedenle, tek bir dil için derleyici tüm sistemi oluşturamaz.

Birden fazla dildeki veya birden fazla derleme birimindeki kodlarla çalışmaya başladığınızda kod oluşturma işlemi tek adımlı bir süreç olmaktan çıkar. Şimdi kodunuzun neye bağlı olduğunu değerlendirmeniz ve bu parçaları uygun sırada oluşturmanız gerekir. Belki de her parça için farklı bir araç seti kullanmanız gerekecektir. Bağımlılıklarda değişiklik olursa eski ikili dosyalara bağlı kalmamak için bu işlemi tekrarlamanız gerekir. Orta büyüklükteki bir kod tabanı için bile bu süreç kısa sürede sıkıcı ve hataya açık hâle 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. Derleme sistemi olmadan, bağımlılığı internetten indirip sabit sürücüdeki bir lib klasörüne yerleştirerek ve derleyiciyi kitaplıkları bu dizinden okuyacak şekilde yapılandırarak bunu yönetebilirsiniz. Zaman içinde bu harici bağımlılıkların güncellemelerini, sürümlerini ve kaynağını korumak zorlaşır.

Kabuk komut dosyaları?

Hobi projenizin, yalnızca bir derleyici kullanarak oluşturabileceğiniz kadar basit olduğunu ancak daha önce 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üşünüyorsunuz ve işleri doğru sırada derlemeyi sağlayan bazı basit kabuk komut dosyalarını kullanarak sıkıcı kısımları otomatikleştirebilirsiniz. Bu yöntem bir süre yardımcı olur ancak kısa süre sonra daha da fazla sorunla karşılaşmaya başlarsınız:

  • Bu durum sıkıcı hale gelir. Sisteminiz daha karmaşık hale geldikçe, derleme komut dosyalarınızda gerçek kod üzerinde çalıştığınız kadar zaman harcamaya başlarsınız. Kabuk komut dosyalarında hata ayıklama, giderek daha fazla sayıda geçici çözümün üst üste eklenmesi nedeniyle zorlaşıyor.

  • Yavaş çalışıyor. Eski kitaplıklara yanlışlıkla güvenmediğinizden emin olmak için derleme komut dosyanız, her çalıştırıldığında tüm bağımlılıkları sırayla oluşturur. Hangi bölümlerin yeniden oluşturulması gerektiğini algılamak için biraz mantık eklemeyi düşünüyorsunuz ancak bu, bir komut dosyası için çok karmaşık ve hataya açık görünüyor. Veya her seferinde hangi parçaların yeniden oluşturulması gerektiğini belirtmeyi düşünürsünüz ancak sonra başa dönersiniz.

  • İyi haber: Yayın zamanı geldi! Son derlemenizi oluşturmak için jar komutuna iletmeniz gereken tüm bağımsız değişkenleri bulmanız gerekir. Ayrıca, nasıl yükleyeceğinizi ve merkezi depoya nasıl göndereceğinizi unutmayın. Ayrıca doküman güncellemelerini oluşturup yayınlayın ve kullanıcılara bildirim gönderin. Hmm, belki de başka bir senaryo gerekir...

  • Felaket! Sabit sürücünüz çöktü 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ıklar ne olacak? Bu dosyaları tekrar bulup ilk indirdiğinizdeki sürümle aynı olduğundan emin olabilir misiniz? Komut dosyalarınız muhtemelen belirli araçların belirli yerlere yüklenmesine bağlıydı. Komut dosyalarının tekrar çalışması için aynı ortamı geri yükleyebilir misiniz? Peki derleyicinin düzgün çalışması için çok uzun zaman önce ayarladığınız ve sonra unuttuğunuz tüm ortam değişkenleri ne olacak?

  • Sorunlara rağmen projeniz yeterince başarılı olduğu için daha fazla mühendis işe almaya başlayabilirsiniz. Artık önceki sorunların ortaya çıkması için felaket yaşanmasının gerekmediğini fark ediyorsunuz. Yeni bir geliştirici ekibinize her katıldığında aynı zorlu başlangıç sürecinden geçmeniz gerekiyor. Ayrıca, elinizden gelenin en iyisini yapsanız da her kullanıcının sisteminde küçük farklılıklar olabilir. Genellikle bir kullanıcının makinesinde çalışan kod, başka bir kullanıcının makinesinde çalışmaz. Her seferinde, farkın nerede olduğunu bulmak için hata ayıklama aracı yollarında veya kitaplık sürümlerinde birkaç saatlik hata ayıklama işlemi yapmak gerekir.

  • Derleme sisteminizi otomatikleştirmeniz gerektiğine karar veriyorsunuz. Teoride bu, yeni bir bilgisayar edinip her gece cron kullanarak derleme komut dosyanızı çalıştıracak şekilde ayarlamak kadar basittir. Yine de zorlu kurulum sürecinden geçmeniz gerekir ancak artık küçük sorunları tespit edip çözebilecek bir insan beyninin avantajından yararlanamazsınız. Şimdi her sabah işe geldiğinizde, dün bir geliştiricinin kendi sisteminde çalışan ancak otomatik derleme sisteminde çalışmayan bir değişiklik yapması nedeniyle önceki geceki derlemenin başarısız olduğunu görüyorsunuz. Her seferinde basit bir düzeltme yapmanız gerekir ancak bu durum o kadar sık yaşanır ki her gün bu basit düzeltmeleri keşfedip uygulamak için çok fazla zaman harcarsınız.

  • Proje büyüdükçe derlemeler yavaşlar. Bir gün, derleme işleminin tamamlanmasını beklerken tatile giden iş arkadaşınızın boşta duran masaüstü bilgisayarına hüzünle bakıp bu boşa giden işlem gücünden yararlanmanın bir yolu olmasını istersiniz.

Ölçeklendirme ile ilgili klasik bir sorunla karşılaştınız. En fazla bir veya iki hafta boyunca en fazla birkaç yüz satırlık kod üzerinde çalışan tek bir geliştirici için (üniversiteden yeni mezun olmuş bir junior geliştiricinin şu ana kadarki tüm deneyimi bu olabilir) ihtiyacınız olan tek şey derleyicidir. Komut dosyaları sizi biraz daha ileriye taşıyabilir. Ancak birden fazla geliştirici ve makinesi arasında koordinasyon sağlamanız gerektiğinde, bu makinelerdeki küçük farklılıkları hesaba katmak çok zorlaştığı için 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 yapma zamanı gelir.