C++ Gerçekten Eğlenceli
(learncodethehardway.com)- C++11’den sonra C++’ın dili ve ekosistemi büyük ölçüde değişti; bir şeyleri bizzat yapıp deneme sürecinde programlamanın keyfini yeniden canlandıran bir dil haline geldi
- C++ bir dönem template metaprogramming fazlalığı ve standart/pattern odaklı kültürü yüzünden birçok geliştiricinin aklında yorucu bir dil olarak kaldı
auto,nullptr,range-for, lambda,<chrono>, akıllı pointer’lar,<thread>gibi değişimler C++’ın kodlama stilini ciddi biçimde değiştirdi- Modern C++ dosya sistemi, paket yönetimi, GUI/TUI, grafik, matematik, yapay zeka ve OS API erişimine kadar geniş seçenekler sunuyor; istenen şeyi doğrudan üretmeyi kolaylaştırıyor
- Derleyici hataları, build araçları, standarda uyum, tarihsel karmaşıklık ve RAII gibi eksiler hâlâ var; ancak yaratma olanağı bu rahatsızlıkların önüne geçiyor
C++’ın yeniden eğlenceli hale gelmesinin nedeni
- Küçük bir roguelike oyun yaparken harita üretiminde Dijkstra algoritmasını kullanarak odaları bağlayan tüneller implemente edildi ve bu süreçte C++ denemeleri ciddi biçimde engellemedi
- FTXUI kullanıcı arayüzünü SFML render penceresine doğrudan çizme denemesi de mümkün oldu; bu süreçte C++’ın Unicode işleme tarafı öğrenildi
- Bu işler kolay değildi ama gerçekten yapılabildi; “bu fikir gerçekten çalıştı” hissi C++’ın eğlencesini yarattı
- Programlamaya başlama nedeni bir milyardere daha fazla para kazandırmak, render motorlarıyla boğuşmak ya da bir açık kaynak projesinin üst katmanlarını memnun etmek değil, fikirleri hayata geçirmenin keyfiydi
Template metaprogramming döneminin yorgunluğu
- 1990’ların sonundan 2000’lerin başına kadar C++’ta template metaprogramming’i her şeye uygulama havası güçlüydü; bu dönem C++’ı eğlencesiz hale getiren dönüm noktası olarak ele alınıyor
- İki sayıyı template ile toplamanın doğrudan toplamaktan daha hızlı olduğu gibi tartışmalar vardı; ancak gerçek assembly çıktısının aynı olduğu örnekler ortaya çıktı
- C++ standart komitesinin programcılara iyi bir kullanım deneyimi sunma konusunda isteksiz olduğu algısı da olumsuz deneyimi büyüttü
- O dönemin C++’ı, çok sayıda
<>açılı parantez ve karmaşık sözdizimi barındıran ama karşılığında az şey veren bir dil olarak hatırlanıyor - Java da başta garbage collector’ı ve geliştirici dostu yapısı nedeniyle çekici görünüyordu; ancak sonrasında boilerplate ve design pattern fazlalığıyla benzer bir yorgunluk yarattı
C++11’in dilin hissini değiştirmesi
- C++11’e eklenen özellikler, C++ hakkındaki izlenimi büyük ölçüde değiştiren yenilikler olarak değerlendiriliyor
- Başlıca özellikler şöyle
auto: Aynı tip adını tekrar tekrar yazma yükünü azaltan otomatik tip çıkarımı anahtar sözcüğünullptr: C’dekiNULLsorununu tamamlayan null pointer ifadesirange-for:autoile birlikte container dolaşımını daha basit hale getiren döngülambda expressions: API tasarımını ve kullanılabilirliği ciddi biçimde değiştirebilen lambda’lar<chrono>:100msgibi ifadeleri mümkün kılan tip güvenli zaman kütüphanesi<regex>: Standart kütüphaneye dahil edilen regular expression özelliğiunique_ptr,shared_ptr: Sahiplik ve referans sayımıyla ilgilenen akıllı pointer’lar<thread>: Multithreading’i temel dil ekosistemine dahil eden özellik
- C++11, eski yöntemi terk etmeden dilin felsefesini ve stilini değiştirdi; bu yönüyle JavaScript’in ES6’sına benzer şekilde algılandı
Modern C++ ekosistemindeki seçenekler
- Güncel C++, diğer dillerden beklenen özelliklerin önemli bir kısmına sahip
- Örnek olarak verilen araç ve kütüphaneler şöyle
- Dosya sistemi dolaşımı:
filesystem - Paket yönetimi: Conan, Meson WrapDB, vcpkg
- Matris kütüphanesi: Eigen
- Yapay zeka: TensorFlow C++ API
- Grafik: SFML
- GUI: Qt, wxWidgets, ImGui
- TUI: FTXUI
- Dosya sistemi dolaşımı:
- Ekosistem kalitesi kalemden kaleme değişse de genel olarak JavaScript ve Python’da deneyimlenenlerden daha yüksek değerlendiriliyor
- Özellikle FTXUI ve STL, iyi tasarım ve kullanılabilirlik gösteren örnekler olarak öne çıkıyor
“Eğlenceyi” yaratan geniş implemente edilebilirlik
- C++’ın eğlenceli olmasının nedeni yalnızca modern özellikler eklenmiş olması değil; neredeyse her şeyi yapabilmeye dönük uygulama olanağında yatıyor
- Masaüstü uygulamaları fenster, SFML, Qt kullanarak ya da doğrudan OS API’leriyle çalışarak yapılabiliyor
- Ses tarafında SFML gibi hızlı seçeneklerden Wwise gibi ticari araçlara kadar geniş bir yelpaze var
- 3D grafiklerde OpenGL, Vulkan, Direct3D, Ogre3D gibi çeşitli seçenekler bulunuyor
- Matematik alanında BLAS, Eigen, GMTL gibi kütüphaneler var
- Gerekli kütüphane olmasa bile C veya C++ ABI’ye ve işletim sistemi API’lerine doğrudan erişerek yapılabiliyor; bu doğrudan üretim sürecinin kendisi de eğlencenin bir parçası oluyor
Modanın dışında kalmış bir dilin yaratıcı özgürlüğü
- C++’ın dili ve ekosistemi kaliteli olsa da şu anda moda bir dil olmadığı için, dili bozan türden ilgiyi daha az çektiği değerlendiriliyor
- C++ topluluğu, ne yapılırsa yapılsın pek karışmayan bir ortam olarak tasvir ediliyor
- Matris kütüphanesi, GUI kütüphanesi, oyun motoru, tuhaf bir oyun gibi projeler serbestçe denenebiliyor
- Yaratıcı işlerde önce fikri dışarı çıkarma aşaması, sonra da soğukkanlı biçimde eleştirip kaliteyi yükseltme aşaması birlikte gerekiyor
- Diğer dillerde organizasyonlar, liderlik ve topluluk baskısının yaratım sürecindeki ara deneyleri engellediği değerlendiriliyor
- C++’ın geniş olanakları ve görece düşük utandırma kültürü yaratıcı bir deneyim oluşturabiliyor
cppreference.com’un güçlü yönleri
- cppreference.com, kullanılan programlama dili dokümantasyonları arasında en üst seviyelerden biri olarak değerlendiriliyor
- Avantajları şöyle
- Tüm anahtar sözcükler ve kütüphaneler referans dokümanı olarak düzenlenmiş
- Çoğu maddede gerçekten çalışan örnekler var
- Her özelliğin hangi C++ standart sürümünde eklendiğini gösteriyor
- Standart dokümana ve ilgili referanslara bağlantı veriyor
- DuckDuckGo tabanlı arama kutusu sayesinde yazım hatalı olsa ya da doğru terim bilinmese de bulmak kolay
- Copy elision gibi önemli kavramları da örneklerle açıklıyor
- Eksik yanı, farklı platformlarda derleyici kurma yöntemlerinin bulunmaması
- C++ derleyicisi ve platform sayısı çok fazla olmadığı için başlangıç rehberi ekleme payı da var
C++’ın hâlâ kalan sorunları
- Bu, C++’ın kusursuz bir dil olduğu anlamına gelmiyor; diğer diller gibi pek çok rahatsız edici yanı var
- Windows’ta Microsoft dışı kurulum yollarıyla derleyici ve geliştirme araçlarını yapılandırmak zor; bunun için bizzat PowerShell kurulum script’i hazırlanmış
- Şu anda hissedilen başlıca rahatsızlıklar şöyle
- Derleyici hata mesajlarının %95’inden fazlası sektörün en kötüleri arasında değerlendiriliyor
- Build araçlarını kullanmak zor; Meson bile kurulu paket yönergelerini yok sayıp bozuk sistem kütüphanelerini kullanma sorununa yol açmış
- Derleyici üreticilerini standarda uymaya zorlayan teşvikler yetersiz
- C++ tarihi nedeniyle çok karmaşık; eski heap allocation/raw pointer stili, template metaprogramming stili, C++11 sonrası stack merkezli stil ve
structmerkezli daha yeni stil bir arada var - RAII gerçekçi yapılandırma durumlarında çoğu zaman engel oluyor; diğer dillerdeki başlatma constructor’larıyla mevcut RAII arasında bir orta noktaya ihtiyaç olduğu düşünülüyor
- Bu eksilere rağmen C++’ın rahatsızlıkları eğlenceyi bozacak düzeyde değil; C++, geçmişteki açılı parantez ve pointer merkezli dil imajından farklılaştı
- FTXUI GUI layout kodu, C++ olduğu bilinmese başka bir dil gibi görünecek kadar modern sözdizimi gösteren bir örnek
1 yorum
Hacker News yorumları
C++ nefretçisi sayılırım, ama bunun nedeni güvenilirlik gerektiren iş kodlarında ve tamamen güvenmesi zor iş arkadaşlarıyla birlikte C++ ile uğraşmaktan hoşlanmamam
Kişisel projelerde ise şimdiye kadar denediğim kodlama ortamları arasında en tatmin edici olanlardan biriydi; yürütmeyi son derece ince ayrıntısına kadar kontrol edebilmek gerçekten heyecan verici
Yaklaşık 10 yıl önce C++'ı bıraktım ve geri dönmeyi düşünmüyorum; ama bugünlerde projelerimde uzun vadeli güvenilirlik en önemli şey olduğundan Rust + CI/CD tam uyuyor
Yine de bir programın tam da benim amaçladığım şekilde çalışması için onu tasarlayıp uygulamanın, bunun da benim uzmanlığım ve içgörüm sayesinde olduğunun verdiği o heyecanı özlüyorum
Birlikte çalıştığım insanların böyle bir motivasyonla hareket etmesini ister miyim, kesinlikle hayır; ama kişisel olarak unutulmaz bir keyif
Build sistemleri ve paket yönetimi kâbus gibi, önişlemci sadistçe bir şaka gibi, sözdizimi berbat ve runtime tarafında kendi ayağını makineli tüfekle taramamak için yılların deneyimini gerektiren çok fazla tortu var
Ama bir anlamda bu acılar, zekâ ve kanlı gözyaşıyla sarıp sarmaladığın çalıştırılabilir dosyayı sonunda çıkarmanın sevincini daha da büyütüyor
C/C++'ı birkaç yıl işte kullandım ve geri dönmek istemiyorum
Başkalarının kodunu debug etmek, muğlak entegrasyon sorunları yaşamak ve build sistemi spagettisi döndürmekle çok fazla zaman harcadım
Son 10 yılda teknoloji sektörünün bu düşünceyi kaybettiğini düşünüyorum; bunda da en iyi insanları iyi yemeklerin ve yumuşak sandalyelerin olduğu yetişkin hapishanelerine koyan büyük teknoloji şirketlerini suçluyorum
Startup'lar da daha az eğlenceli hale geldi; VC sektörü dar bir düşünce penceresini teşvik ettikçe aynı şeyi yapan kopya startup'lar ve modalar çok arttı
Her yeni projede C++ kullanmamın nedeni, doğrudan yapmam gerektiğinde yapabileceğime dair güvenim olması
Framework'ler, özellikle projenin çekirdeğiyle uğraşırken, çoğu zaman istediğim şekilde davranmıyor; bu yüzden sürekli kullanmak istemiyorum
Kendin yapabiliyorsan kendin yaparsın, yapamıyorsan framework kullanırsın
Kendin yapabiliyorsan C++, her şeyi yapabilen ve önemli şekillerde yoluna çıkmayan harika bir araç
Rust gibi diller tehlikeli bir şey yaptığımı söyleyip şikâyet edebilir, ama C++'ta kafamdaki modeli doğrudan ifade edebilirim
Bazen pointer'larla düşünürsün ve pointer'lar gerçekten iyi araçlardır
Eğlenceyi geri kazanalım; sadece kişisel hayatta değil, işte de
Bu yazı biraz dağınık görünüyor
Pek çok noktaya değiniyor ama bunların neden C++'ın daha eğlenceli ya da daha az eğlenceli olduğu sonucuna vardığını çıkarmak zor
Modern C++'ı son derece yüksek kaliteli diye nitelerken aynı anda yaygın legacy sorunlardan ve korkunç araçlardan bahsetmesi de kafa karıştırıcı
unique_ptrharika derken RAII'den gerçekten nefret ettiğini söylemesi ve metaprogramlamanın eskiden her yerde olduğu ama artık olmadığı gibi iddiaları da tuhafconceptsa bakınca bunun öyle olmadığı görülüyor; C++'ın en iyi grafik kütüphanelerine sahip olduğu veya Python kurulumunun C++'tan daha zor olduğu gibi sözler de ana argümanla pek ilgisi olmayan yazar takıntıları gibi görünüyorSonuçta yazar, kişisel etkenlerin karmaşık bir birleşimi nedeniyle C++'ı eğlenceli buluyor gibi; bunun kendisi sorun değil
Performansı ve teknik karakteri nedeniyle C++ ile en keyifli programlamalarımı yaptığım oldu, ama pratik yazılım geliştirmede bildiğimiz sayısız nedenle C++ pek iyi değil
C++, onlarca yıllık legacy ve siyasetten yaralanmış, derinden çelişkili bir dil; C++ gerçekliğini görmezden gelmek de C++ tartışmalarındaki en büyük hata
Bugünlerde C++'a karşı tavrım daha çok yorgunluk; son yıllarda C++'ın önüme çıkardığı engellerin üzerinden artık atlamak istemiyorum
Zaten çoktan ölmüş bir atı dövmeye devam etmeye gerek yok; C++'ı C++ olarak bırakmak yeterli
Bana göre yazı dağınık olmaktan çok, yazarın keyif aldığı ve bu keyfi olabildiğince paylaşmaya çalıştığı bir yazı
Düzgün bir fikir yazısından ziyade, aktif biçimde ikna etmeye çalışan bir metin değil; daha çok “ikna edilmene gerek kalmadan sana hitap ediyorsa, sen de eğlenebilirsin” gibi
Ticari işlerde gerçeklikle hırpalanıp yorulmuş biriysen bunun anlamsız gelmesini de tamamen anlayabilirim
Ben de bugünlerde nedense JavaScript kullanırken çok eğleniyorum; benzer bir yazı yazsam, son 10 yılda ticari JavaScript'ten bıkmış birine aynı şekilde kötü görünebilir
Yine de yazarın keyif alması ve bu keyfi paylaşmayı seçmesi sevindirici
Bir C++ projesinde üçüncü taraf bağımlılığı Linux/Windows/macOS'ta çalışacak şekilde statik linklemek için 3 gün harcadım
O paket conan/vcpkg'de yoktu; yalnızca tuhaf bir Makefile/cmake karışımı olan bir GitHub deposu vardı
cmake/cpp uzmanı olmaktan çok uzağım, ama çoğu modern dilde
pip install,cargo add,npm install,go getgibi yollarla bu sorun olmazC++ semantiğinin ayrıntılarını bir kitabı baştan sona okuyarak öğrensen bile, gerçek bir projede çalışmak hâlâ acı verici
Sonunda JavaScript sürümü autotools gibi bir şeye varmış olmamız şaşırtıcı
Başkasının kodunu statik build etmek ya da başka platformlarda build edilecek hale getirmek bazen uğraştırıcıdır, ama linkleme tarafı genelde include dizinleri, kütüphane yolları ve kütüphane belirtmekten ibarettir
Birisi vcpkg/conan paketlemesini yapmadıysa pip/cargo/npm'de de olmama ihtimali yüksek
C++'ta zorlandıysan başka dillerde çok daha zor olabilir
Yine de tarihsel C++'ın bazı kısımlarının, özellikle build hikâyesinin, çok kötü durumda olduğu burada da ortaya çıkıyor
Yalnızca vcpkg'ye girmiş olsa kurulum zorluğu diğer ekosistemlerle birebir benzer hale gelir
Düzenli olarak C yerine C++ ile çalışmayı deniyorum; her seferinde benzer bir kalıp oluyor
Yeni bir C++ tekniği öğreniyorum, bir şeylerin daha iyi olacağını düşünerek kod yazıyorum, derleyici hatasıyla karşılaşıyorum ve günün kalanını neden istediğim şeyi yapamadığımı öğrenmeye harcıyorum
Genelde C++14 ile sınırlı kalıyorum ve bazı sorunlar sonraki sürümlerde düzeltilmiş olsa da durum yine de böyle
C++'ı gerçekten sevmek istiyorum; teoride üretkenliği artıracak daha güçlü bir C sunuyor ama sonunda bilişsel yük o kadar fazla oluyor ki çoğu zaman “sınıflı C” yazıp geçiyorum
2003'te gerçek zamanlı C++'ı çok kullandım ve nefret ettim, ama geçen yıl kodun çoğunu C++ ile yazarken sonunda sevmeye başladım
lambda'lar ve
auto, C++'tan nefret etmememi sağlayan dönüm noktasıydıŞablonları da biraz kullandım ama çoğunlukla aynı fonksiyonun varyantları için bir sürü dal yazmamak içindi
Lambda'lar sayesinde, SICP havasındaki Lisp ailesinden hocalardan ilk öğrendiğim şekilde kod yazabilir oldum
unique_ptrkullanınca tahsisler de rahatsız edici gelmediBöyle yapmayın; önce kodu nasıl kullanacağınızı düşünün, sonra bir özellik sorunu çözüyorsa onu kullanın
Sorun → çözüm olmalı, tersi değil
Örneğin C++ şablonları genel olarak berbattır ama derleme zamanı duck typing ya da
sizeof()tabanlı otomatik padding ekleme gibi şeyler bazen çok kullanışlıdırBaşta bir C# programcısı olarak gömülü bir proje yüzünden C öğreniyordum; akış birebir aynıydı
C++'ta, uygulamayla tam örtüştüğünde güçlü görünen pek çok havalı özellik var
Ama ne zaman yeni bir özellik denesem, yapmak istediğim şey her zaman o durumda çalışmayan bir uç durum oluyordu; saatlerce ya da günlerce denedikten sonra vazgeçip sadece C ile yazıyordum
Elbette Python veya Ruby gibi bu eğilimin dışına çıkan diller de var
Genelde hata metnini kopyalayıp ona çözdürüyorum
C++ gerçekten eğlenceli ve insanların şikâyetlerinin büyük ölçüde bağlama bağlı olduğunu düşünüyorum
Birçok C++ geliştiricisi dilden nefret ediyor, ama aslında bu nefretin yönü bazen yanlış oluyor
Çoğu zaman gerçekte, yazılımı pek de iyi kullanamamış kişilerin yaptığı eski ürünlerle uğraşıyorlar
Ben Rust'ta da benzer bir şey yaşadım; şirketin mevcut Rust projesine dahil oldum ve eski kod tabanında birbiriyle çelişen çok sayıda gelenek vardı
Birbiriyle iyi birleşmeyen hata işleme tipleri, kötü sınıf soyutlamaları, gereksiz
unsafeblokları vardı ve şimdiye kadar yaptığım projeler içinde en acı verici olanıydıRust'ı suçlamak kolay, ama aslında bu sadece kötü yazılım geliştirmeydi
C++'ta kusurlar olduğu doğru, ama insanların yaşadığı acının önemli bir kısmı, hangi dilde yazılmış olursa olsun berbat olacak kötü kodla uğraşmalarından kaynaklanıyor
v[x]=yyazdığınızda keyfi bellek bozulmasını davet etmiş olmazsınızC++'ın
std::optional'ındavboşken*vçağırırsanız bu tanımsız davranış oluroptional'ın özü boş olabilecek bir değeri tutmaktır; optional boşken en yaygın işleme neden tanımsız davranış koyulduğunu anlamak zor
C++'ı çok kullanmış biri olarak sorun şu: projedeki tüm programcıların zamanın %100'ünde %100 kusursuz olması gerekiyor
Bellek denetleyicileri ve STL debug modunu çalıştırabilirsiniz, ama bunları release'te de çalıştırmıyorsanız test takımınızın aptal ya da kötü niyetli kullanıcıların yapabileceği tüm garip şeylere dokunmasını beklemeniz gerekir
Yazılımın bu kadar önemli hâle geldiği bir çağda, Rust C++ performansına yakın görünürken, temel özelliklerinin çoğunu güvenli kullanmanın çok zor olduğu bir dili kullanmaya değip değmediğini sorguluyorum
Üstelik giderek daha da kötüleşiyor: boş
std::functionçağrısı assert fırlatıyordu, ama yenistd::copyable_functionbunu tanımsız davranış hâline getirdiTip sistemi sinir bozucu ve buna rağmen doğru düzgün bellek güvenliği de elde edilmiyor
En can sıkıcı ayrıştırma gerçekten can sıkıcı ve pointer decay gibi C'den miras kalan tuhaflıklar da aynen duruyor
Üstüne
std::arraygibi yeni çözümler ekleniyor ama eski yöntemler ortadan kaldırılamıyorGerçek bir modül içe aktarma sistemini taklit etmek için hâlâ önişlemciye bel bağlamak da sorun; bu yüzden sınıf kodu düzeni veya pimpl idiomu gibi dolambaçlı çözümler ortaya çıkıyor
Özünde kusurları o kadar büyük ve çok ki artık içindeki güzelliği bulmak zor
Buna karşılık basit bir blub dili projesi, kod tabanının durumundan bağımsız olarak genellikle oldukça kolay çözümleniyor
Birinin C++'tan keyif alması güzel ama kişisel olarak 20 yılı aşkın uğraştan sonra artık C++'ı bırakmam gerektiğini düşünüyorum
Düpedüz darmadağın
Gerçekten düşük seviye kontrol gerekiyorsa kusurları olsa da C ile uğraşırım; değilse Rust, Python vb. beni çok daha mutlu ediyor
Yine de C++ var olmaya devam edecek
O dille yazılmış çok fazla kod var; ayrıca öğrenmiş olmak kesinlikle iyi bir beceri ve çok para kazandıran işler de var
Benim için dil fazlasıyla ayak bağı oluyor ve aşırı karmaşık geliyor
“Modern C++”ın harika olduğu, eski sürümleri öğrenmeye gerek olmadığı ve her yeni sürümle daha da basitleştiği söylemini biliyorum
Sorun, pratikte elinize geçen kod tabanının modern C++ olmaması
Bugüne kadar çıkmış tüm özellikleri kullanıyor; zor ve tuzaklarla dolu
Yıllarca yalnızca kendi projelerinde C++ yazmış biri bir ölçüde uzmanlık geliştirip karmaşıklığa bağışıklık kazanabilir ama gerçekten iyi bir dil değil
Temel veri türlerini, standart kütüphaneyi vb. değiştirmek gibi
Özellikle C++20 sonrası bu alternatif temel oldukça yerel ve ifade gücü yüksek hissettiriyor
Gördüğüm yeni C++ projelerinin önemli bir kısmı bu yönü güçlü biçimde benimsiyor
Uygulamalar için sistem düzeyinde alana özgü dilleri kolayca oluşturabilmek C++'ın güçlü yanı
Ne yazık ki tamamlayamadım ama hatırladıklarım sınıflar,
std::function,std::unordered_map,std::string,std::unique_ptrcivarındaBenzer bir tarzda değilse başkasının kodunu okumayı hayal etmek zor
Büyük ölçekli programları profesyonel olarak yazmadığım için Visitor deseni gibi programlama desenlerini aşmak en zor kısmıydı
Keşke C++ C++11'de dursaydı
Komite şu anda her şeyi dile koymak istiyor gibi ve C++ her niş programlama tarzını destekleyen devasa bir dil gibi görünüyor
Ama eğlenceli bir dağınıklık ve C++ ile yazmayı seviyorum
Bazen önemli olan da bu
Rust ile ilişkim çok daha soğuk
Rust'a saygı duyuyorum; özellikle iş gibi C++ kullanımını savunmanın zor olduğu bağlamlarda Rust'ın doğru olduğunu düşünürsem onu kullanıyorum ve Rust'ın yaptığı işin önemli olduğunu düşünüyorum
Ama şimdiye kadar epey Rust projesi yapmış olmama rağmen yazması bana sıkıcı geliyor
Temel açılardan daha iyi ama en azından benim için daha az keyifli
unsafemührünü açarsanız tamsayıları açıkça pointer'a cast edebilir ve örneğin bellek eşlemeli giriş/çıkış ile donanımı kontrol edebilirsiniz, değil mi?Bu yazı kapsamı geniş, uzun bir nutuk ve sadece “C++” harfleri bile insanları tetikleyip büyük kısmının göz ardı edilmesine yol açabilir
Ben de bazen öyleyim
Şikâyet kısmı için “It's Not All Puppies and Butterflies” bölümüne atlayabilirsiniz
Yazar C++11'den çok etkilenmiş; ben de neredeyse 20 yıl boyunca bilerek C++'ı görmezden geldikten sonra benzer hissettim
Oynamalık paketler ve kütüphaneler tanıtması hoş ama yine de başka kütüphaneleri projeme dahil etmek çoğu zaman acı verici
Tek dosyalık header'lar akla geliyor
FTXUI ilginç
Ve gerçekten cppreference.com muazzam
Python belgeleri de oldukça iyi ama cppreference.com kadar iyi bir dokümantasyon görmedim
Python belgeleri sağa sola dağılmış, birçok yerde eksik ve tutarlı bir editoryal üslup da yok
Ancak Diataxis çerçevesi açısından yalnızca referans dokümanlarını değil, birkaç farklı doküman türünü de oldukça iyi kapsıyor
O dokümanları yazanlar bu çerçeveyi açıkça dikkate alarak iyileştirme yönü arıyor
Yine de neredeyse kod geliştirme gibi işleyen, gönüllülere dayalı bir açık kaynak çalışması
Bir süredir “sisteme daha yakın” olmak istiyordum ve bir yandan Rust öğrenmek de kolay değildi
Bu yazıyı görünce C++'ı yeniden öğrenirsem bunun mümkün olabileceğine dair umutlandım
Merhaba CMake… yoksa belki de Meson demeliyim
Yetenekli bir ekip modern C++'ı iyi kullanmayı biliyor ve yeni bir projeye başlıyorsa C++'ın harika olduğuna katılıyorum
Keyifli ve güçlü bir dil; performansı iyi ve karmaşık olsa da debug etmek ve optimize etmek görece anlaşılır
Yaklaşık 5 yıllık bir kod tabanında çalışma fırsatım olmuştu; C++11 sonrası standartlara göre yazılmıştı ve yazıda söylenen birçok nedenle çok keyifliydi
Buna karşılık 20-30 yıl boyunca evrilmiş eski bir kod tabanı ya da yetkin kişilerce bakımı yapılmamış bir kod tabanıysa deneyim bambaşka olur
21 yaşındayken şirket okul ücretimi ödemeyi teklif etti, ben de bilgisayar mühendisliği lisans programına geri döndüm; sonra bilgisayar bilimine geçtim
“Programlamaya Giriş” dersinin ilk gününde C++'a dokunduğum anda âşık oldum
O sırada kullandığım PHP 7'ye kıyasla tip sistemi, debug etme ve ekosistem harikaydı
Müdürümün izniyle mevcut intranet uygulamalarının bir kısmı için C++ tabanlı API'ler oluşturdum; PHP bunları websocket üzerinden çağırıyordu ve tip sistemiyle performanstan yararlanabiliyordum
O sistemler hâlâ şirket genelinde her gün kullanılıyor ve bakımları da sorun olmadı
Üstelik IBM Pase for i gibi oldukça tuhaf bir ortamda çalışıyor olmalarına rağmen
Şimdi Rust ve Axum'u denedikten sonra böyle API'ler yaparken Rust ekosistemini çok daha fazla tercih ederim ama C++ da hakkını vermeyi hak ediyor
Özellikle TypeScript olmayan JavaScript ya da PHP gibi web dillerinden geliyorsanız gerçekten harika bir dil
Aslında aklıma gelen birkaç olasılığa, örneğin C, Java, Fortran'a kıyasla C++'ı tercih ederdim
İstisna C# olabilir ama o koşula girecek kadar eski sayılır mı bilmiyorum
C++’a yerleşik düzenli ifadeler geldiği ve oldukça iyi olduğu söylenmiş olsa da,
std::regexiçin iyi demek zorPerformansı kötü ve Unicode desteği de yetersiz olduğu için genel olarak kaçınmak daha iyi
std::regexkullanılmamasını zorunlu kılıyorC++ öğrendim ve keyif de aldım ama derinine inmedim
C’yi her zaman daha çok sevdim; zaten Dune oyun motoru veya Unix yardımcı araçları gibi, C’yi daha iyi öğrenmek için okunabilecek en üst düzey kod tabanları da çok
Son zamanlarda Rust’a biraz dokununca C++ kullanmak için güçlü bir neden pek göremiyorum
Fonksiyonel programlamadan ilham alan güçlü tip sistemi ile performansın birleşimi yenmesi zor görünüyor; neredeyse mükemmel bir dil gibi
Yine de C++ kullanmayı gerektiren eskiye dönük nedenler mutlaka vardır
Oyun motorları, gömülü programlama ya da başka türden legacy bağımlılıklar gibi şeyler olabilir
Yeni bir C++ kod tabanıysa oldukça temiz hâle getirilebilir
Ama bu noktada yeni bir yazılımı neden C++ ile yapacağını pek anlayamıyorum
C++’ın sinir bozucu çok yanı var
Kütüphane/paket yönetimi standart değil, header’lar kod tekrarı, standart kütüphane uygulamaya göre değişiyor ve neredeyse okunması zor
Standartta tuhaf davranışlar var; insanlar tanımsız davranışa yaslanıyor ama bunun farkında olmuyor, atamadan önce kullanım sorunları var; sahiplik sorunları ve hatalı referans sayımı yüzünden bellek sızıntıları incelikli biçimde ortaya çıkıyor
Her şeyi varsayılan yapmak yerine
constyapmanız gerekiyor;noexceptgarantisi vermek için çağırdığınız her şeyin istisnalarını kontrol etmeniz gerekiyor; standart kütüphane işlemlerindeki hataları okumak zorNesne yönelimliliği ağır basan kod fiilen teknik borç
C++’ın LSP’si, Rust’taki gibi soyut sözdizimi ağacını kontrol ederek tanımı bulan yapısal bir yöntem kullanmadığından gezinme ve kod tabanını kavrama yavaş
Rust
nostd’yi birinci sınıf olarak açıkça destekliyor; C++’ta ise standart kütüphaneyi kapatmak için derleyiciye özgü bayraklar gerekiyor ve bunu doğru yapıp yapmadığınızı doğrulamak zorBu yüzden gömülü sistemler nedeniyle C++ kullanıldığı argümanı bana pek ikna edici gelmiyor
Rust’ta bevy gibi oyun motorları da var ama hâlâ yeni; isterseniz Godot scripting’e Rust da bağlayabilirsiniz
Düşük seviyeli ses işleri de Rust’ta aynı derecede kolay ve tek bir crate ile çapraz platform yönetimi mümkün
Genel olarak meselenin özünün legacy kod ve değişime karşı tereddüt olduğunu düşünüyorum
Kullanıcı sayısı, yayımlanmış ve erişilebilir bilgi ve kaynaklar, kitaplar, dersler, bloglar, yazılar, videolar, yazılım kütüphaneleri ve bir başka devasa dil olan C ile yüksek uyumluluk da buna dahil
Bu alanda birkaç yıldan fazla bulunmuş biri için bu, yazılım sektörünün genel bilgisi sayılır
Ben C++’ı çok kullanmış değilim, bu yüzden düzgün bir acemi bile sayılmam zor; ama eskiden dilin yaratıcısı Bjarne Stroustrup, Scott Meyers ve benzerlerinin klasik C++ kitaplarını satın alıp okumuş ve bir ölçüde anlamıştım
Ancak C’yi, başarılı ticari ürünler de dahil olmak üzere yıllarca production’da çok kullandım
https://www.stroustrup.com/applications.html
https://www.stroustrup.com
https://en.m.wikipedia.org/wiki/Bjarne_Stroustrup
https://en.m.wikipedia.org/wiki/Scott_Meyers
Bu yüzden oyun geliştirmenin C++’ta en uzun süre kalacağını düşünüyorum
Kullanıcıların %0,001’inde oyun segmentation fault yüzünden çökse ne olacak ki, deniyor