Hangi sosyal veya teknik faktörler CIY zihniyetinin yükselmesine neden oldu?
Temel neden açık bir şekilde teknik nedendir: İkili taşınabilirlik, kaynak taşınabilirliğinden daha zordur . Dağıtım paketlerinin dışında, çoğu Özgür yazılım hala sadece kaynak formda mevcuttur, çünkü bu yazar (lar) / sürdürücüler için çok daha uygundur.
Linux dağıtımları, ortalama insanların kullanmak isteyeceği çoğu şeyi paketlemeye başlayana kadar, tek seçeneğiniz kaynağı almak ve kendi sisteminiz için derlemekti. Ticari Unix satıcıları genellikle neredeyse herkesin istediği şeyleri içermiyordu (örneğin GNU bashveya benzeri gibi güzel bir kabuk ), sadece kendi uygulamaları shve / veya uygulamaları csh, bu yüzden (sys-admin olarak) istediyseniz kendiniz bir şeyler oluşturmanız gerekiyordu etkileşimli kullanım için kullanıcılarınıza hoş bir Unix ortamı sağlamak için.
Şimdi, çoğu insan masaüstünde oturan tek yönetici ve tek kullanıcı olan durum, geleneksel Unix modelinden büyük ölçüde farklı. Bir sistem yöneticisi yazılımı merkezi sistemde ve herkesin masaüstünde tuttu. (Çoğunlukla insanların iş istasyonlarının sadece NFS montajı /optve /usr/local/merkezi sunucudan bulunması ve oraya bir şeyler kurulması.)
.NET ve Java gibi şeylerden önce, farklı CPU mimarileri arasında gerçek ikili taşınabilirlik mümkün değildi. Unix kültürü, LSB gibi son Linux çabalarına kadar ikili taşınabilirliği etkinleştirmeye çalışmak için çok az çaba harcayarak, kaynak taşınabilirliği ile bu nedenle varsayılan olarak gelişti. Örneğin, POSIX ( majör Unix standardı) sadece bile son sürümlerinde, kaynak-taşınabilirlik standardize dener.
İlgili kültürel faktör: Erken ticari AT&T Unix, kaynak kodu (bantlarda) ile geldi. Sen etmedi var bu size bir şey görmek istedim durumunda sadece orada, kaynağından sistem inşa etmek gerçekten dokümanlar yeterli değildi zaman çalıştı.
Wikipedia diyor ki :
"Kapsamlı çevrimiçi dokümantasyon ve (yıllarca) tüm sistem kaynak kodlarına hazır erişim Unix politikası, programcı beklentilerini artırdı ve 1983'ün özgür yazılım hareketinin başlatılmasına katkıda bulundu."
Bu kararı neyin motive ettiğinden emin değilim, çünkü müşterilere ticari yazılımın kaynak koduna erişim vermek bugünlerde duyulmamış. Bu yönde açıkça bazı erken kültürel önyargılar vardır, ancak belki de Unix'in köklerinden, çoğunlukla C (montaj dili değil) ile yazılmış ve farklı donanımlar için derlenebilen taşınabilir bir işletim sistemi olarak ortaya çıkmıştır. Önceki birçok işletim sisteminin kodlarının belirli bir CPU için daha fazla yazıldığını düşünüyorum, bu yüzden kaynak düzeyinde taşınabilirlik erken Unix'in güçlü yönlerinden biriydi. (Bu konuda yanlış olabilirim; erken Unix konusunda uzman değilim, ancak Unix ve C ilgili.)
Yazılımın kaynak formda dağıtımı, insanların yazılımın üzerinde çalışmasını istedikleri herhangi bir sisteme uyarlamasını sağlamanın en kolay yoludur. (Ya son kullanıcılar ya da bir Linux dağıtımı için paketleyen kişiler). Yazılım zaten bir dağıtım için / tarafından paketlenmişse, son kullanıcılar bunu kullanabilir.
Ancak, çoğu paketin yazarının olası her sistem için ikili dosyalar oluşturmasını beklemek çok fazladır. Bazı büyük projeler birkaç yaygın durum için ikili dosyalar sağlar (özellikle işletim sisteminin bir oluşturma ortamıyla gelmediği x86 / pencereler ve işletim sistemi satıcısı yalnızca ikili yükleyicilerin dağıtımına büyük önem verir).
Bir yazılımın yazarın kullandığı sistemden farklı bir sistemde çalışmasını sağlamak, kaynak ile kolay olan bazı küçük değişiklikler gerektirebilir . Birinin kendi kaşıntısını çizmek için yazdığı küçük bir kerelik program muhtemelen çoğu karanlık sistemde hiç test edilmemiştir. Kaynağa sahip olmak, bu tür değişiklikleri yapmayı mümkün kılar. Orijinal yazar bir şeyi gözden kaçırmış olabilir ya da çok az zaman kazandığından kasıtlı olarak daha az taşınabilir kod yazmış olabilir. Info-ZIP gibi büyük paketlerin bile hemen her platformda testçileri yoktu ve problemler keşfedildikçe insanların taşınabilirlik yamalarını göndermeleri gerekiyordu.
(Sırf inşa env'deki farklılıkların olur ve burada konuyla. With Java tarzı ikili taşınabilirlik, otomatik araçlar (gerçekten alakalı olmadığını kaynak düzey taşınabilirlik sorunları diğer türü vardır autoconf/ auto-make) ve benzeri benzer şeyler cmakeolmazdı 't gerekli. ve böyle bir şeyleri olmazdı bazı sistemler dahil edilmesini gerektirir <netinet/in.h>yerine<arpa/inet.h> içinntohl(3) . (ve belki olmazdı ntohl()ya da ilk etapta başka bayt sırası şeyler!)
.NET dillerinde düzenli olarak gelişiyorum, bu yüzden bilgisayar okuryazar değilim.
Bir kez derleme, her yerde çalıştırma .NET ve ayrıca Java'nın temel hedeflerinden biridir, bu nedenle bu sorunu çözmek için tüm dillerin icat edildiğini ve geliştirme deneyiminiz bunlardan biriyle olduğunu söylemek doğrudur. .NET ile ikili dosyanız taşınabilir bir çalışma zamanı ortamında (CLR) çalışır . Java, çalışma zamanı ortamını Java Sanal Makinesi olarak adlandırır . Herhangi bir sistemde (en azından birinin zaten bir JVM veya CLR uyguladığı herhangi bir sistem) çalışacak tek bir ikili dağıtmanız gerekir. Elbette yol ayırıcılara /karşı \veya nasıl yazdırılacağı veya GUI mizanpaj ayrıntıları gibi taşınabilirlik sorunlarınız olabilir .
Pek çok yazılım tamamen yerel koda dönüştürülmüş dillerde yazılmıştır . .netTaşınabilir bayt kodu yok veya java bayt kodu var, sadece çalıştırılacak CPU için yerel makine kodu, taşınabilir olmayan bir yürütülebilir dosya biçiminde saklanıyor. C ve C ++ bunun en önemli örnekleridir, özellikle Unix dünyasında. Açıkçası bu, belirli bir CPU mimarisi için bir ikili dosya derlenmesi gerektiği anlamına gelir .
Kütüphane sürümleri başka bir sorundur . Kütüphaneler ikili düzey ABI'yi değiştirirken kaynak düzeyindeki API'yi sabit tutabilir ve çoğu zaman sabit tutarlar. (Bkz . API ve ABI arasındaki fark .) Örneğin, bir opak için başka bir üye eklemek structyine de boyutunu değiştirir ve dinamik olsun (malloc), bu tür bir yapı için alan ayıran herhangi bir kod için yeni kütüphane sürümü için üstbilgilerle yeniden derleme gerektirir. ), statik (global) veya otomatik (yığın üzerinde yerel).
İşletim sistemleri de önemlidir . Aynı işlemci mimarisi için Unix farklı bir lezzet farklı ikili dosya biçimlerine sahip olabilir, gibi sabitleri için sistem çağrıları ve farklı sayısal değerler yapmak için farklı bir ABI fopen(3)s' O_RDONLY, O_APPEND,O_TRUNC .
Dinamik olarak bağlı bir ikili dosyada bile daha önce çalışan işletim sistemine özgü bazı başlangıç kodlarının bulunduğunu unutmayın main(). Windows'da bu crt0. Unix ve Linux aynı şeylere sahiptir, burada bazı C-Çalışma Zamanı Başlangıç kodu statik olarak her ikili dosyaya bağlıdır. Teoride, bu kodun dinamik olarak bağlandığı ve libc veya dinamik bağlayıcının kendisinin bir parçası olduğu bir sistem tasarlayabileceğinizi tahmin ediyorum, ancak işin farkında olduğum herhangi bir işletim sisteminde işler bu şekilde çalışmaz. Bu, yalnızca sistem çağrısı ABI sorununu çözer, standart kütüphane işlevleri için sabitler için sayısal değerler sorununu çözmez. (Normalde sistem çağrıları libc sarmalayıcı işlevleriyle yapılır: Kullanılan kaynak için normal bir x86-64 Linux ikili mmap()dosyası, syscalltalimatı içermez;call aynı adın libc sarma işlevine yönelik talimat.
Bu neden i386-Linux üzerinde i386-FreeBSD ikili dosyalarını çalıştıramayacağınızın bir parçasıdır. (Bir süre için, Linux çekirdeğinde sistem çağrısı uyumluluk katmanı vardı. Bence BSD'lerden en az biri benzer bir uyumluluk katmanıyla Linux ikili dosyalarını çalıştırabilir, ancak elbette Linux kütüphanelerine ihtiyacınız var.)
İkili dosyaları dağıtmak istiyorsanız, CPU / OS-flavor + sürüm / kurulu kütüphane sürümlerinin her birleşimi için ayrı bir tane oluşturmanız gerekir .
80'lerde / 90'larda, Unix sistemleri (MIPS, SPARC, POWER, PA-RISC, m68k, vb.) Ve Unix (IRIX, SunOS, Solaris, AIX, HP-UX, BSD vb.).
Ve bu sadece Unix sistemleri. Birçok kaynak paketi de VAX / VMS, MacOS (m68k ve PPC), Amiga, PC / MS-DOS, Atari ST, vb. Gibi diğer sistemler üzerinde derlenir ve çalışır.
Hala birçok CPU mimarisi ve işletim sistemi var, ancak şimdi masaüstü bilgisayarların büyük çoğunluğu x86 üç büyük işletim sisteminden birini çalıştırıyor.
Bu nedenle, farklı sistemlerde farklı sürümlerde olabilecek üçüncü taraf kitaplıklarındaki bağımlılıkları düşünmeye başlamadan önce bile, bir çubuk sallayabileceğinizden daha fazla CPU / OS kombinasyonu var. (İşletim sistemi satıcısı tarafından paketlenmemiş herhangi bir şeyin el ile kurulması gerekir.)
İkili dosyada derlenen yollar da sisteme özgüdür. (Bu, başlangıçta bir yapılandırma dosyasından okumakla karşılaştırıldığında RAM ve zamandan tasarruf sağlar). Eski okul Unix sistemlerinde genellikle çok sayıda elle özelleştirilmiş malzeme vardı, bu yüzden nerede olduğu hakkında geçerli bir varsayım yapmanın bir yolu yok.
İkili dağıtım, eski ana Unix için tüm büyük kombinasyonları inşa etmeyi ve test etmeyi göze alabilecek büyük ticari projeler dışında tamamen olanaksızdı .
Hatta ikili i386-linux-gnuve ikili yapmak bile amd64-linux-gnuzordur. Taşınabilir ikili dosyaları mümkün kılmak için Linux Standard Base gibi şeylere çok zaman ve çaba harcanmıştır . Statik olarak ikili dosyaları bağlamak bile her şeyi çözmez. (örneğin, bir kelime işlem programı bir Debian sistemine karşı bir RedHat sistemine nasıl yazdırılmalı? Yükleme, bir arka plan programı için bir kullanıcı veya grup eklemeli ve her yeniden başlatmanın ardından başlangıç komut dosyasının çalışmasını nasıl ayarlamalıdır?) Bunlar harika değil örnekler, çünkü kaynaktan derleme onları çözmez.
Tüm bunların yanı sıra, o günlerde bellek şimdi olduğundan daha değerliydi. Derleme zamanında isteğe bağlı özellikler bırakmak , veri yapıları için daha az bellek kullanan daha küçük ikili dosyalar (daha az kod boyutu) oluşturabilir. Bir özellik, belirli bir öğenin her örneğinde classveya bir structşeyi izlemek için fazladan bir üye gerektiriyorsa , bu özelliğin devre dışı bırakılması nesneyi 4 bayt (örneğin) küçültür, bu da programın 100k ayırdığı bir nesne olması güzeldir.
Bu günlerde isteğe bağlı derleme zamanı özellikleri çoğunlukla ek kitaplıkları isteğe bağlı yapmak için kullanılır. mesela sen derlemek olabilir ffmpegolan veya olmayan libx264, libx265, libvorbisDaha yaygın, bir çok şey olan veya olmayan derlenmiş edilebilir vs vs Belirli bir video / ses kodlayıcı, altyazı tutulması için bu ve diğer birçok kütüphaneler libreadline: Sunulursa, çalıştırdığınızda ./configure, sonuçta ortaya çıkan ikili kitaplığa bağlı olacak ve bir terminalden okurken süslü hat düzenleme sağlayacaktır. Değilse, program stdin'den satırları fgets()veya bir şeyleri okumak için bazı geri dönüş desteğini kullanacaktır .)
Bazı projeler performans nedeniyle gereksiz kodları dışarıda bırakmak için isteğe bağlı özellikler kullanmaya devam etmektedir. örneğin Linux çekirdeğinin kendisi SMP desteği olmadan oluşturulabilir (örneğin gömülü bir sistem veya eski bir masaüstü için), bu durumda kilitlemenin çok daha basittir. Veya yalnızca sürücüleri veya diğer donanım özelliklerini dışarıda bırakmakla kalmayıp, bazı temel kodları etkileyen birçok isteğe bağlı özellik ile. (Her ne kadar kemere özgü ve donanıma özgü yapılandırma seçenekleri toplam kaynak kodunun çoğunu oluştursa da . Bkz. Linux çekirdeği neden 15+ milyon satırlık kod? )