Neden Derleme Sistemi?

Sorun bildir Kaynağı göster Nightly · 8.0 · 7.4 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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ığı açıklanmaktadır. Derleme sistemiyle ilgili çok fazla deneyimi olmayan geliştiriciler için tasarlanmıştır.

Derleme sistemi nedir?

Tüm derleme sistemlerinin temel amacı, mühendisler tarafından yazılan kaynak kodu makineler tarafından okunabilen yürütülebilir ikili programlara dönüştürmektir. Derleme sistemleri yalnızca insanlar tarafından yazılan kodlar için değil, makinelerin test veya üretim sürümleri için derlemeleri otomatik olarak 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?

Bir derleme sistemine ihtiyaç duyulduğunu hemen anlayamayabilirsiniz. Çoğu mühendis, kodlamayı öğrenirken derleme sistemi kullanmaz. Çoğu, gcc veya javac gibi araçları doğrudan komut satırından ya da entegre geliştirme ortamındaki (IDE) eşdeğerlerini çağırarak başlar. Tüm kaynak kodları 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.

Ancak kod genişler genişlemez 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ık) depolanan kodu bulamaz. Ayrıca, yalnızca Java kodunun nasıl oluşturulacağını 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 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.

Derleyici, Java'daki üçüncü taraf JAR dosyaları gibi harici bağımlılıkların nasıl ele alınacağı hakkında da hiçbir şey bilmez. Bir derleme sistemi olmadan bunu, 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 harici bağımlılıkların güncellemelerini, sürümlerini ve kaynaklarını korumak zordur.

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ırada 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 harcamaya 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ştır. 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. Ya da her seferinde hangi parçaların yeniden oluşturulması gerektiğini belirtmeyi düşünürsünüz ancak yine aynı noktaya geri 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 öğrenmeniz daha iyi olur. Ayrıca, dosyayı nasıl yükleyeceğinizi ve merkezi depoya nasıl göndereceğinizi unutmayın. Doküman güncellemelerini oluşturup yayınlayın ve kullanıcılara bildirim gönderin. Hmm, bu durum için 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. Elinizden gelenin en iyisini yapsanız da her kullanıcının sisteminde küçük farklılıklar vardır. 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 daha da 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 kod satırı üzerinde çalışan tek bir geliştirici için (bu, üniversiteden yeni mezun olmuş bir junior geliştiricinin şimdiye kadarki deneyiminin tamamı 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.