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?
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ılmış kodlara yönelik değildir. Derleme sistemleri, aynı zamanda makinelerin test amaçlı veya üretime yönelik sürümler için otomatik olarak derleme 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.
Sadece derleyici kullanamaz mıyım?
Bir derleme sistemine ihtiyaç duyulduğunu hemen anlayamayabilirsiniz. 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.
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 (belki birkaç proje tarafından paylaşılan bir kitaplık) depolanan kodu bulmak mümkün değildir. 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 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 ç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.
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 bu işlemi, 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ırayla 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ış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ş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 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. 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: Şarkınızı yayınlamanın zamanı geldi. Nihai derlemenizi yapmak için jar komutuna iletmeniz gereken tüm bağımsız değişkenleri tespit etmeniz önerilir. Ayrıca, dosyayı nasıl yükleyeceğinizi ve merkezi depoya nasıl göndereceğinizi 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? 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. En iyi çabanıza rağmen herkesin sisteminde hâlâ küçük farklılıklar bulunuyor. 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 iş, yeni bir bilgisayar alıp derleme komut dosyanızı her gece cron kullanarak çalıştıracak şekilde kurmak kadar basit. 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 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 çö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 de yavaşlar ve 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 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 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.