· kaynak Hacker News – Front Page (native)
Bir açıklama yazısına göre C'nin esnek tamsayı boyutları bir hata değil, taşınabilirlik özelliğiydi
Hacker News ana sayfasına çıkan bir pikuma.com yazısı, C'nin platforma bağımlı tamsayı türlerinin 12, 18, 36 ve 60 bitlik bilgisayarların olduğu bir dönemde taşınabilirliğin anahtarı olduğunu savunuyor.
C'nin gevşek tamsayı türlerine yönelik viral bir savunma
Retro donanımlarla birlikte programlama öğreten bir site olan pikuma.com'dan bir yazı, C'nin en çok eleştirilen özelliklerinden birini savunarak Hacker News ana sayfasına yerleşti: tamsayı türlerinin sabit bir boyutu yok. Yazara göre bu gevşeklik bir ihmal değil, tam tersine dilin 12, 18, 36 ve 60 bitlik bilgisayarların olduğu bir dönemde taşınabilirliği elde etmesini sağlayan mekanizmaydı.
Başlangıç noktası, her C yeni başlayanın yaşadığı bir an. sizeof operatörünü öğrendikten sonra, programlarının sizeof(int) sorusuna 4 yazdırığını görür ve bir tamsayının dört byte yer kapladığı sonucuna varırlar. Vintage makineler ve eski oyun konsollarıyla çalışan öğrencilere ders veren yazar, kişisel geçmişinden bir de sürpriz ekliyor: ilk kod yazmayı öğrendikleri 386 makinede aynı sorgu 2 byte döndürüyordu. C'de temel türlerin — char, short, int ve long — ne kadar bellek kaplayacağına dair hiçbir garanti yoktur.
Yazının yanıt verdiği eleştiri
Makale, standart eleştirinin haklı olduğunu açıkça kabul ediyor. Bir makinede int 16 bitken başka bir makinede 32 bit; Linux'ta long 64 bitken 64 bit Windows'ta 32 bit; ve bu tutarsızlık on yıllar boyunca taşınabilirlik hatalarına yol açtı. Bugün satılan hemen her CPU'nun 8, 16, 32 ve 64 bit aritmetikle rahatça çalışan 64 bitlik bir parça olduğu düşünülürse, C neden baştan boyutları sabitlemedi?
Yazarın yanıtı, bunun 1970'lerdeki bir tasarımı 2020'lerin koşullarıyla yargılamak olduğu. C, birbirinden çok farklı mimarilere verimli şekilde eşlenmesi gereken taşınabilir bir sistem dili olarak tasarlandı ve esnek tür boyutları tam da bu eşlemenin verimli kalmasını sağlayan şeydi. Yazı ayrıca Java'nın sonraki "bir kez yaz, her yerde çalıştır" vaadiyle bir çizgi çekiyor: C'nin taşınabilirlik anlayışı daha dar bir şey anlamına geliyordu.
Endüstrinin standartlara kavuşmasından önceki kelime boyutları
Bugünün temel varsayımları — 8 bitlik byte'lar, byte adreslenebilir bellek, 32 veya 64 bitlik register'lar, ikinin tümleyeni aritmetiği ve düz bir bellek modeli — C ortaya çıktığında garanti değildi. Yazi 1960 ve 70'lerin donanım manzarasını şöyle özetliyor:
- Oldukça popüler bir minibilgisayar olan DEC PDP-8, 12 bitlik kelimeler kullanıyordu.
- UNIX'in ilk kez assembly ile yazıldığı DEC PDP-7, 18 bitlik bir kelimeye sahipti.
- C'nin büyüdüğü, byte adreslemeli DEC PDP-11, 16 bit kullanıyordu.
- DEC PDP-10 ve DECSYSTEM-20, karakterleri 36 bitlik kelimelerin içinde yedi ya da dokuz bit halinde paketliyordu; C'nin erken hedeflerinden biri olan Honeywell 6000 de 9 bitlik karakterlerle 36 bitlik kelimeler kullanıyordu.
- UNIVAC 1100 ve Unisys 2200 ailesi, 36 bitlik kelimeler üzerinde birlerin tümleyeni aritmetiği yapıyordu ve bugün hâlâ bir C derleyicisine sahip.
- CDC 6600, 60 bitlik kelimelere, 6 bitlik karakter kodlarına sahipti ve hiç byte adresleme yoktu.
- Kelime adreslemeli Cray-1'de, makalenin belirttiğine göre, short, int ve long'un hepsi 64 bit olabiliyordu.
Bu arka plan karşısında, argümana göre, int'i 32 bitte sabitlemek C'yi o zaman gerçekten var olan makinelerin çoğunda kullanılmaz hale getirirdi. Her türün donanımın doğal olarak işlediği boyuta eşlenmesine izin vermek, taşınabilirlik stratejisinin kendisiydi.
Modern çıkış kapısı
Gerçekten kesin genişliklere ihtiyaç duyulan kodlar için yazar, öğrencileri 1999'daki C99 standardıyla gelen stdint.h'a yönlendiriyor. Sabit genişlikli türleri — int8_t, uint8_t, int16_t, int32_t ve diğerleri — derleyiciden veya hedef mimariden bağımsız olarak kesin bir bit sayısı garanti eder; bit düzeyinde kesin davranışın önemli olduğu her yerde artık bu yüzden önerilmektedirler.
Neden önemli
Yazının Hacker News'te gördüğü ilgi, argümanın geliştiricilerde bir duyguya dokunduğunu gösteriyor. C'nin en kötü şöhretli tuzaklarından birini tarihsel olarak gerekçelendirilmiş bir karar olarak yeniden çerçeveliyor: dilin türleri programcının neye ihtiyacı olduğunu tanımlar ve her makine, en hızlı yürütebileceği gösterimi kendisi belirler. Bu bağlam acıyı ortadan kaldırmıyor — makale, farklılaşan boyutların on yıllar boyunca hatalara neden olduğunu kabul ediyor ve long hâlâ Linux ile 64 bit Windows arasında farklılık gösteriyor. Ama ödünleşimin neden var olduğunu açıklıyor ve kodun hedefi ana akım 64 bitlik bir CPU'dan başka bir şey olduğu her yerde — mikrodenetleyicilerden yazarın öğrencilerinin çalıştığı retro konsollara ve vintage minibilgisayarlara kadar — güncelliğini koruyor. Yazının ima ettiğine göre, eski bir dil tasarımını yazıldığı donanımdan yoksun olarak yargılamak, tam olarak yanlış derse götürür.
- #c-language
- #programming-languages
- #retro-computing
- #portability
- #history