Modern C C23 Sürümü
(gustedt.wordpress.com)- Yeni C standardına uyarlanmış Modern C’nin gözden geçirilmiş sürümü ücretsiz indirilebilir olarak yayımlandı; C dilini öğrenme ve başvuru materyallerini C23 temelinde yeniden değerlendirmek mümkün
- Revizyonun odağında C23’ün yansıtılması var; ISO’nun yayın süreci ve zamanlamasıyla uyumlu biçimde yeni standarda geçişe yardımcı olmaya odaklanıyor
- Başlıca derleyicilerin yeni sürümleri C23 özelliklerinin çoğunu şimdiden uyguladığı için, kitaptaki değişiklikler deneysel bir tanıtımın ötesine geçip gerçek kullanım ortamlarıyla bağlantı kuruyor
_BitInt(N),nullptr,auto,typeof,constexprgibi dil ve kütüphane değişiklikleri geniş kapsamlı biçimde yansıtılmış; bunlar mevcut C kodu yazma biçimlerini de etkiliyor- Mevcut platformlarda hemen deneme yapılabilmesi için geçişe yönelik ek ve geçici include header’ları eklendi, ancak Manning’in MEAP’i hâlâ devam ediyor
Ücretsiz yayımlanan materyaller ve standart belgeleri
- Modern C C23 Sürümü ücretsiz olarak indirilebilir
- İndirme: https://hal.inria.fr/hal-02383654
- Kitaba özel sayfada ilgili materyalleri de bulabilirsiniz
- Özel sayfa: https://gustedt.gitlabpages.inria.fr/modern-c/
- Kitapla birlikte sunulan kod örnekleri indirme bağlantısı da bu sayfada yer alıyor
- Gözden geçirilmiş sürümde birçok açıklama elden geçirilmiş olsa da temel amaç, yeni C standardı olan C23’ü yansıtmak
- Herkese açık erişilebilen belgeler içinde yeni standardın içeriğine en yakın kaynak N3220 PDF
- Başlıca derleyicilerin yeni sürümleri, C23’ün getirdiği yeni özelliklerin çoğunu şimdiden uygulamış durumda
C23 dil değişiklikleri ve geçiş desteği
- Tamsayılarla ilgili değişiklikler önemli bir yer tutuyor
- Yeni bit kesinlikli tip
_BitInt(N)eklendi - Taşma denetimli aritmetik ve bit işlemleri için yeni C kütüphanesi header’ları eklendi
- Modern mimarilerde 128 bit tip olasılığı yansıtıldı
- enum tiplerinde kayda değer iyileştirmeler de içeriyor
- Yeni bit kesinlikli tip
- C23’ün diğer yeni kavramları da dahil edildi
nullptrsabiti ve onun temel tipi- attributes aracılığıyla sözdizimsel açıklama ekleme
autovetypeofdahil tip-jenerik programlama araçları- Değişken uzunluklu dizilere de uygulanan
{}varsayılan başlatma - Tüm tiplerde adlandırılmış sabitler için
constexpr
- Yeni materyal; bileşik ifadeleri, lambda’ları, “uluslararasılaştırma”yı ve program hatalarına kapsamlı yaklaşımı da ele alıyor
- Mevcut platformlarda C23’e hemen başlanabilmesi için ek ve geçici include header’ları eklendi
- Manning’in yeni sürüm MEAP’i hâlâ açık
- MEAP: https://www.manning.com/books/modern-c-third-edition
- Manning sürümü C23 edisyonunun nihai yayın zamanı henüz bilinmiyor
1 yorum
Hacker News görüşleri
Benim makinemdeki depolama sırası olan little endianın aksine, en yüksek basamaklı gösterimin önce geldiği yönteme big endian deniyor; ama modern işlemcilerde ikisinin de yaygın kullanıldığını söylemek, s390x dışında pek bir şey kalmadığı için biraz abartı gibi geliyor
Herkesin sevdiği niş/ölmüş big endian mimarileri yorumları birazdan gelir gibi
Bir üst yorumdaki gibi, modern demek mutlaka popüler ya da yaygın kullanılıyor demek değildir
AIX ve IBM i, IBM mainframe’leri kadar aktif olmayabilir; ancak AIX’in Solaris ya da HP/UX’ten bile daha canlı olduğu söylenebilir, eski pek çok ticari Unix ile kıyaslayınca bu daha da geçerli. IBM i de zar zor ayakta duruyor, ama HP MPE gibi satıcı desteği resmen sona ermiş rakip legacy midrange platformlardan çok daha canlı
C’nin en önemli yönü taşınabilirliktir. Küçük mikrodenetleyicilerden neredeyse tüm bilişim platformlarına kadar gidebilmesi işin özü; ama yeni C sürümünün bu kadar benimseneceğinden şüpheliyim
En ileri olanı kullanmak istesem C yerine C++2x ya da Rust seçerdim. Bir şeyi kaçırıyor muyum? Bu sözde modern C’nin sağladığı avantajın ne olduğunu merak ediyorum
En ileri uç için Zig’i öneririm. Modern C++ ve Rust’a göre dil karmaşıklığı çok daha düşük. C23’ün daha az göze çarpan güzel bir yan etkisi de
... = {}ve{0}gibi sözdizimlerini C++ ile daha uyumlu hâle getirerek, C kütüphanesi bakımcılarının C kodunu C++ derleyicisiyle derlemek isteyenleri desteklemesini daha az zahmetli kılması0b, mikrodenetleyici dünyasında yaygın kullanılıyorMikrodenetleyici araç zincirleri genelde GCC üzerine kurulduğu için özellikleri bedavaya alıyor. Her zaman geriden gelen tescilli C derleyicileri de var, ama 20 yıl önceki kadar önemli değiller
Gömülü sistemleri ya da çok geniş bir mimari kümesini hedeflemiyorsanız, bugünden C23 kullanmamanız için bir neden yok
thread_localbelirteci bazı mikrodenetleyici platformlarında zaten kullanılıyor, ama C11 öncesinde tamamen yasa dışıydı. Yine de iş parçacıklı ortamlarda bellek yönetimini büyük ölçüde basitleştiriyorBunun için özellikle C++ dünyasına girmeye gerek var mı?
Şahsen
guard,defer,auto,constexpr,nullptrgibi şeyler C’yi çok daha karmaşık hâle getiriyor. C’yi sadelik gerektiği için seçiyorum; karmaşıklık istesem genelde istemesem bile C++ seçerim, hatta onun yerine Go’yu ya da sunucu tarafındaysa Elixir’i seçerdim_BitInt(N)de çirkin; neyse ki artıkboololan_Boolu hatırlatıyor.constexprvenullptrise fazla C++ kokuyor. Yine de Modern C harika bir kitap ve kullanmaya devam etmeyi düşündüğüm C99 için çok işime yaradıNULLda sorun ne sorusunun yanıtı, ISO standardizasyonunun az sayıdaki avantajlarından biri sayesinde ilgili belgeyi okuyunca ortaya çıkıyor: https://wg21.link/p2312Özetle,
NULLargümanını tür-jenerik makrolara verdiğinizde şaşırtıcı sonuçlar doğabilir ve(1 ? 0 : NULL)ile(1 ? 1 : NULL)gibi koşullu ifadelerin statüsüNULLın nasıl tanımlandığına göre değişir. Ayrıca işaretçi bekleyen değişken argümanlı bir fonksiyonaNULLgeçirmek ciddi sonuçlar doğurabilir. Günümüzde birçok mimarideintilevoid*boyutları farklı olduğundan,NULLyalnızca0ise fonksiyona yanlış boyutta argüman iletilirEv inşa etmeye benzer. Çekiç ve tornavida çok basittir, vinç ise aşırı karmaşıktır; ama ev inşa etmeyi basitleştiren vinçtir. Yalnızca çekiç ve tornavidayla ev yapmak için son derece karmaşık bir prosedür tasarlamanız gerekir
Programlama dilleri de aynıdır. C++’ta jenerik container yapmak önemsizdir, C’de ise çok zordur.
void *ve manuel cast ile bir ölçüde taklit edebilirsiniz, ama zahmetlidir, hataya açıktır ve kodu daha karmaşık hâle getirirstd::sortveqsortiçin de durum aynı. Template’lerin ve fonksiyon nesnelerinin gücüyle implementasyon daha basit ve hızlıdır.void *geçirip çalışma zamanında dereference etmek gerekmez, karşılaştırmayı fonksiyon tanımının içine koyabilirsiniz. Dolaylı çağrı yoktur, stack üzerinden geçiş yoktur ve karşılaştırma fonksiyonu inline bile edilebilir. Dil karmaşıklığı implementasyon karmaşıklığı anlamına gelmezautoçoğunlukla tür-jenerik makrolarla uğraşırken faydalıdır, ama normal kodda kullanmamak daha iyi. Bir dönem C++ dünyasında moda olan almost always auto gibi çılgınlıklardan kaçınılmasını umarımNe yazık ki derleyiciler arasında küçük farklar var. Hatırladığım kadarıyla Clang C++ tarzı
autoyu, GCC ise C tarzıautoyu implemente etmişti;autopointer’larda ince bir fark vardı. Bu fark şimdi düzeltildi mi bilmiyorum_BitInt(N)genelde doğrudan kullanılmaz, ihtiyaç duyulan genişliğe göretypedefedilerek kullanılır. Örneğintypedef _BitInt(2) u2;gibi._Bgibi çirkin sözdizimleri, alt çizgi ardından büyük harf kombinasyonları C standardında ayrılmış olduğu için, dile küçük bir özellik eklerken mevcut kodla çakışmamak adına gereklidir._Booladı da aynı nedenden. Bildiğim kadarıyladeferaslında C23’e girmediEski tanım,
NULLın işaretçi mi yoksa tamsayı mı olduğunu bile belirtmiyordu. Bu yüzden Posix’in((void*)0)şartını izlemeyen platformlarda, ne işaretçi türünde ne de işaretçi boyutunda bir mayın gibiydiconstexprvenullptrın C++ kokması muhtemelen C++’tan geri ithal edilmiş olmalarından. Yine deNULLkullanılmaya devam edebilir; görünüşe görenullptrolarak yeniden tanımlanmış gibiexeclp("echo", "echo", "Hello, world!", NULL);Bu kodda o hata yok:
execlp("echo", "echo", "Hello, world!", nullptr);Bu da olur:
execlp("echo", "echo", "Hello, world!", (char *)NULL);İyi bir C kitap listesi var mı diye soracaktım, cevabı kendim buldum. Burada Modern C orta seviye olarak sınıflandırılıyor
https://stackoverflow.com/questions/562303/the-definitive-c-...
K&R’ye modern bir C eşlikçisi olarak Ben Klemens’in 21st Century C kitabı ile King’in C Programming: A Modern Approach kitabının daha erişilebilir alternatifler olduğunu düşünüyorum
Kişisel olarak Effective C’yi Modern C’den daha çok beğeniyorum. Modern C çok titiz; uzmanlar için gerekli olabilecek, dil üzerine açıklamalı bir spesifikasyon okuyormuş hissi veriyor ve benim gibi C’yi daha hafif kullanan biri için okuması sıkıcı
Metaware’in High C genişletmelerinden bazıları epey hoşuma gidiyor
https://news.ycombinator.com/item?id=41647843
https://news.ycombinator.com/item?id=38938402
Son bir yılı aşkın süredir kişisel projem olan bir dil yorumlayıcısında modern C++ kullanıyorum; ama C++’ın zihinsel yükü ve araç sorunları yüzünden sürekli C’ye geçmeyi düşünüyorum. Visual Studio’nun IntelliSense’i C++20 modülleri kullanıldığında hâlâ neredeyse hiç çalışmıyor; dilin başarısızlığı yüzünden çok fazla şey arayüze itilmiş durumda ve derleme süreleri de çirkinleşiyor
Öte yandan sınıflara, üye fonksiyonlara, generic programminge ve ad alanlarına fazla alıştığım için çoktan tuzağa düşmüşüm gibi de geliyor
Bu amaç için C#’ı düşündün mü? Visual Studio, C# ile çok daha iyi uyumlu
macOS Preview’de kenar çubuğundaki içindekiler bağlantılarına tıklayınca düzgün çalışmıyor
Bakımını yaptığım bir kütüphanede C derleyicilerinin hepsinin C99 desteklediğine güvenebilir hâle gelmem sadece birkaç yıl önce oldu: https://github.com/eyalroz/printf
Ama birkaç yıl geçer geçmez, kaçınılmaz olarak bazı kadim gömülü araç zincirleri yüzünden C89 uyumluluğu isteyen bir issue açıldı. Yani C23 güzel, ama sanki bunu 20 yıl sonra tekrar konuşalım gibi
Pratikte C’nin neden fiilen C99’da takılı kaldığını açıklayan bir yazı linkleyebilecek olan var mı? Konuşmaya değer projeler arasında C11 sonrası özelliklerden yararlanan neredeyse hiç yok
Onlarca yıl boyunca C fiilen donmuş kaldığı için, kullanıcı kitlesi de C’yi olduğu gibi seven ve antik döküntü derleyici desteğinden rahatsız olmayan kişilerden kendi kendine seçilmiş gibi. Sabrını yitiren ya da 21. yüzyıl dili isteyenler C++/Rust/Zig vb. dillere geçti
2010 civarında MSVC hâlâ çok önemliydi; bugün çoğu geliştiricinin Linux’a geçmiş gibi göründüğü bir bakış açısından bu kulağa garip geliyor. Öte yandan C11 özelliklerine mutlaka ihtiyaç duyan proje de pek yok. C11, C99’daki VLA’yı da götürdü; pek de üzülecek bir kayıp değildi. C23, C99’dan bu yana birçok C kod tabanının gerçekten yükseltmeye değer bulabileceği ilk sürüm olabilir