A Tour of C++ İnceleme

Özet

C++ dilinin geliştiricisi olan Bjarne Stroustrup tarafından son basımı Eylül 2022’de yayımlanan bu kitap, C++ dilinin ve standart kütüphanenin standartlarına genel bir bakış atmak amacıyla yazılmıştır. Hedef kitlesi C++’ı yeni öğrenenler değil de C++ ile ilgili yeterli düzeyde bilgi sahibi olanlardır. Bu basım C++20 standartlarını da kapsamakta, ayrıca C++23 standartlarından dile eklenen yeni birkaç özelliği de ele almaktadır. Bu kitap ayrıca hali hazırda C++ dili ile uğraşan, ancak tekniklerini ve stilini geliştirmek isteyen okuyucular için de faydalıdır.

İnceleme

Bölüm 1: The Basics (Temeller)

Bu bölümde ilk olarak C++’ın en temel kavramları olan temel program yazımı ve derlenmesi, yorumlar, fonksiyonlar, türler, değişkenler, aritmetik ifadeler ve ilk değer verme (initialization) gibi konular ile kitaba başlanmaktadır. Daha sonra faaliyet alanı (scope) ve ömür (lifetime) kavramları açıklanarak, C++’taki şu üç faaliyet alanı tanıtılmaktadır:

  • Local Scope (Yerel Faaliyet Alanı)
  • Class Scope (Sınıf Faaliyet Alanı)
  • Namespace Scope (İsim Alanı Faaliyet Alanı)

Daha sonra ise C++’ta sabit tanımlamaya geçilmektedir. Burada hem "const" anahtar kelimesinden hem de C++11 ile dile eklenen "constexpr" anahtar kelimesinden bahsedilmektedir. İkisi arasındaki farklara değinilmektedir. C++’ın daha alt seviye özellikleri olan göstericiler, diziler ve referanslar konusu ele alınıp Null gösterici konusuna değinilmektedir. Daha sonraki kısımda C++’ta bulunan "if", "switch-case", "while" ve "for" gibi kontrol ve döngü yapıları anlatılmaktadır. Ayrıca bu konuda C++11 ve C++17 standartları ile gelen bazı yeni özelliklere de değinilmektedir. Bölümün sonunda ise atama ve ilk değer verme gibi işlemlerin bellekte neye karşılık geldiği diyagramlarla açıklanmaktadır.

Bölüm 2: User-Defined Types (Kullanıcı Tanımlı Türler)

Bu bölümde genel olarak kullanıcı tanımlı türler oluşturmaya yarayan sınıf (class), yapı (structure), birlik (union) ve numaralandırma (enumeration) gibi dil özelliklerine değinilmektedir. Bir yapının veya bir sınıfının nasıl oluşturulacağına, üye (member) kavramına, erişim düzenleyici (access modifier) kavramına ve sınıf ile yapı arasındaki temel farka değinilmektedir. Daha sonra C++11 ile dile eklenen "enum class" kavramına ve eski "enum" kavramıyla olan farklarına dikkat çekilmektedir. En son ise yine C dilinden aşina olduğumuz birlik (union) kavramından bahsedilmektedir.

Bölüm 3: Modularity (Modülerlik)

Bu bölümde genel olarak C++’ta modüler programlar yazmamıza yarayan teknikler gösterilmektedir. Bildirim ve tanımlamanın bu alanda kullanımı, başlık (header) dosyası, C++20 ile eklenen modüller (modules) gibi konulara değinilmektedir. Daha sonra isim alanı (namespace) kavramına değinilmekte ve isim alanlarını programlarınızda nasıl kullanabileceğiniz anlatılmaktadır. En son ise fonksiyonların argümanları ve geri dönüş değerleri biraz daha ayrıntılı anlatılmaktadır. Burada fonksiyonlara argüman geçmek, geri dönüş türü, geri dönüş türünün çıkarımı (deduction), Suffix veya bir diğer adıyla Trailing geri dönüş değerlerinin ne olduğu ve Structured Binding gibi içerisinde güncel olan konular da dahil pek çok konu ele alınmaktadır.

Bölüm 4: Error Handling (Hata Yakalama)

Bu bölüm aslında 2. basımda yer almayan bir bölümdür. Önceki basımda diğer bölümlerde parçalı olarak anlatılan konular 3. basımda bu bölümde birleştirilmiştir. Bu bölümde genel olarak "try-catch" ile istisna (exception) yakalama, Invariant kavramı, çeşitli alternatif hata yakalama teknikleri, Assertion kavramı ("assert", "static_assert") ve "noexcept" kullanımı gibi konular yer almaktadır.

Bölüm 5: Classes (Sınıflar)

Bu bölüm ilk olarak yeni türler tanımlama ve kullanmanın çeşitli yollarını size sunmaktadır. Bir sınıfın temel elemanlarını, implementasyon tekniklerini ve dil özelliklerini tanıtmaktadır. Sınıfları şu üç başlık altında incelemektedir:

  • Somut sınıflar (Concrete classes)
  • Soyut sınıflar (Abstract classes)
  • Sınıf hiyerarşileri (Class hierarchies)

Somut sınıfların özelliklerini anlatırken 2 çeşit örnek verilmiştir. İlk örnek aritmetik bir tür oluşturmayla ilgili iken, ikinci örnek bir konteyner türü oluşturmakla ilgilidir. Daha sonra soyut sınıfları anlatırken sanal fonksiyonlar (virtual functions) ve saf sanal fonksiyonlar (pure virtual functions) da anlatılmakta, türetme ve çok çeşitlilik örnekleri verilmektedir. En son ise sınıf hiyerarşileri konusu anlatılmaktadır. Burada ise hiyerarşilerin faydalarından, hiyerarşilerin kullanımından ve hiyerarşilerde kaynak sızıntılarını önlemekten bahsedilmektedir.

Bölüm 6: Essential Operations (Temel İşlemler)

Bu bölümde bir sınıfın temel yapıtaşlarını oluşturan, sınıfın yapıcı (constructor), yıkıcı (destructor) ve atama (assignment) metotları anlatılmaktadır. Bu metotların sınıfın yaşam döngüsündeki önemi ve sınıflarda kaynak yönetimi (RAII prensibi gibi) ile ilgili önemli bilgiler verilmektedir. Yine bu bölümde C++11 standartlarındaki en önemli yenilik olan taşıma semantiği (move semantics) geniş bir biçimde ele alınmaktadır. Sınıflarda operatör aşırı yüklemelerinin (operator overloading) nasıl yapıldığı anlatılmakta ve bunlarla ilgili örnekler verilmektedir. En son ise oluşturduğunuz sınıf için kullanıcı tanımlı değişmezlerin (user-defined literals) nasıl tanımlanabileceği gösterilmektedir.

Bölüm 7: Templates (Şablonlar)

Bu bölümde C++’ın önemli konularından biri olan şablonlar (templates) konusuna genel bir bakış atılmaktadır. Şablonlara verilen çeşitli argüman türlerinin ne anlam ifade ettiği ve şablonlarda argüman çıkarımı (template argument deduction) gibi konular ele alınmaktadır. Daha sonra parametreli işlemler yapabileceğiniz çeşitli araçlar şu 3 kategoride incelenmektedir:

  • Fonksiyon şablonu
  • Fonksiyon nesnesi: Veri taşıyan ve fonksiyon gibi çağrılabilen nesne
  • Lambda ifadesi: Fonksiyon nesnelerinin kısa yazımı

C++11’in önemli değişikliklerinden olan ve daha sonraki standartlarda da pek çok özelliği eklenmiş olan Lambda ifadeleri bu bölümde geniş bir biçimde ele alınmaktadır. Son olarak da iyi bir şablon tanımlamak için kullanılan çeşitli şablon mekanizmaları anlatılmaktadır. Bahsedilen şablon mekanizmaları şöyledir:

  • Türe bağlı değerler: Değişken şablonları (variable templates)
  • Tür ve şablonlar için takma isim: Takma isimi şablonları (alias templates)
  • Derleme zamanında seçim yapma mekanizması: “if constexpr”
  • Türlerin ve ifadelerin derleme zamanında özelliklerini belirleme mekanizması : “required-” ifadeleri

Sonuncusu hariç hepsi bu bölümde ele alınmaktadır. Sonuncusu ise bir sonraki bölümde daha ayrıntılı bir biçimde ele alınmaktadır.

Bölüm 8: Concepts and Generic Programming (Konseptler ve Genelleyici Programlama)

Bu bölüme C++20 standartları ile dile eklenen konsept (concept) kavramı ile giriş yapılmaktadır. Konseptlerin kullanılması, konsept bazlı aşırı yükleme, konseptlerin tanımlanması, konseptler ve "auto" ilişkisi, konseptler ve türler arasındaki ilişkiler gibi çok çeşitli konular ele alınmaktadır. Daha sonra genelleyici programlama (generic programming) kavramı anlatılıp şablonlar ile soyutlama mekanizmalarından bahsedilmektedir.

Yine C++’ta pek çok yerde karşımıza çıkan değişken sayıda argüman alabilen şablonlar (variadic templates) konusu burada anlatılmaktadır. bu konuyla ilgili olarak C++17 ile dile eklenen katlama ifadelerine (fold expressions) yine burada değinilmektedir. Son olarak da çok kısa olarak şablonların derleme mekanizmasından bahsedilmektedir.

Bölüm 9: Library Overview (Kütüphaneye Genel Bakış)

Bu bölüm aslında kalan diğer tüm bölümlerin özeti niteliğindedir. Bu bölümde standart kütüphanenin organizasyonundan ve son standartlarda kütüphaneye eklenen başlık dosyalarından kısaca bahsedilmektedir.

Bölüm 10: Strings and Regular Expressions (String’ler ve Düzenli İfadeler)

Bu bölümde öncelikle C++’ta String’lerin ne olduğu ve bellekte nasıl tutulduğundan bahsedilmektedir. Daha sonra String’leri okumayı daha da optimize etmek amacıyla dile C++17 standartları ile eklenen "string_view" sınıfından bahsedilmektedir. Bilgisayar dünyasında önemli bir yere sahip olan ve C++11 standartları ile dile eklenen düzenli ifadeler (regular expression) kütüphanesi anlatılmakta ve bu kütüphane ile düzenli ifadeler kullanarak arama yapma, çeşitli sembollerin anlamları ve düzenli ifadelerde itaratörler gibi konular ele alınmaktadır.

Bölüm 11: Input and Output (Girdi ve Çıktı)

Bu bölümde öncelikle C++’ta çeşitli girdi ve çıktı işlemlerinde kullanılan sınıf yapıları ve bunlar arasındaki ilişkiler incelenmektedir. "ostream", "istream" ve "iostream" kütüphanelerinin içeriği genel anlamda anlatılmaktadır. Daha sonra kullanıcı tanımlı türler üzerinde I/O işlemlerini nasıl gerçekleştirebileceğimiz gösterilmektedir. Bu konudan sonra çıktıyı formatlama konusuna geçilmektedir. Burada iki formatlama türü anlatılmaktadır:

  1. Stream formatting (Akış formatlama)
  2. printf()-style formatting (printf() stili formatlama)

Daha sonra ise C++’ın desteklediği diğer akış (stream) türlerine geçilmektedir. Üzerinden kısaca geçilen akışlar şöyledir:

  • Standard streams (Standard akışlar)
  • File streams (Dosya akışları)
  • String streams (String akışları)
  • Memory streams (Bellek akışları)
  • Synchronized stream (Senkronize akışlar)

Bölümün sonunda ise C++17 standartları ile dile eklenen ve bulunduğunuz işletim sisteminde dosya işlemlerini gerçekleştirmenize yarayan "filesystem" kütüphanesi ele alınmaktadır. Burada önce yol (path) konusu ele alınmakta, en son ise dosyalar ve dizinler (files and directories) konusu ile bölüm bitirilmektedir.

Bölüm 12: Containers (Konteynerlar)

Bu bölümde C++ standart kütüphanesinde bulunan çeşitli konteyner türleri anlatılmaktadır. Anlatılan konteynerlar şunlardır:

  • vector
  • list
  • forward_list
  • map
  • unordered_map

Daha sonra Allocator konusuna geçilmektedir. Burada yine C++’ta yer alan çeşitli Allocator mekanizmalarından bahsedilmektedir. En son ise konteynerlara genel bir bakış atılarak bölüm bitirilmektedir.

Bölüm 13: Algorithms (Algoritmalar)

Bu bölümde C++ standart kütüphanesinde yer alan çeşitli algoritmalar anlatılmaktadır. Öncelikle algoritmaların ve iteratörlerin kullanımı hakkında kısa bilgilendirme yapılmaktadır. Daha sonra çeşitli iteratör tiplerinden bahsedilmektedir. Algoritmalarda Predicate adı verilen fonksiyonların kullanımından ve bunların yerine alternatif olarak Lambda ifadelerinin kullanımından bahsedilmektedir. Daha sonra çeşitli algoritmalar bir tablo aracılığıyla özetlenip en son ise C++17 ile dile eklenen paralel algoritmalar anlatılmaktadır.

Bölüm 14: Ranges (Aralıklar)

Bu bölümde C++20 ile dile eklenen "ranges" kütüphanesi ele alınmaktadır. Range kavramının ne olduğundan bahsedilip daha sonra View kavramına geçilmekte ve dile eklenen çeşitli View’lara özet olarak değinilmektedir. Bundan sonra ise Generator yapılarına değinilmektedir. Yine son standartlar ile dile eklenen Pipeline yapılarına da değinilmektedir. En son ise bu konular ile alakalı konseptler (concepts) incelenmekte ve bölüm sonlandırılmaktadır.

Bölüm 15: Pointers and Containers (Göstericiler ve Konteynerlar)

Bu bölümde temel olarak akıllı göstericilerden (smart pointers), "array", "bitset", "pair" ve "tuple" gibi yeni konteynerlardan ve "variant", "optional" ve "any" gibi alternatif veri yapılarından bahsedilmektedir.

Bölüm 16: Utilities

Bu bölümde C++ standart kütüphanesinde çok çeşitli amaçlar için kulanılan birçok fonksiyon ve sınıfa değinilmektedir. Öncelikle zamanla ilgili veri yapılarından ve C++11 ile gelen yeni zaman sisteminden bahsedilmekte, ayrıca C++20 ile gelen takvim sistemine de değinilmektedir. Daha sonra fonksiyon adaptasyonu ve Lambda’lar ile ilgili kısa bir bölüm yer almaktadır. Bundan sonra ise "type_traits" kütüphanesi anlatılmakta ve şablonlar ile kullanımı gösterilmektedir. Yine C++20 ile gelen "source_location" kütüphanesine kısaca değinilmektedir. En son ise "move" ve "forward" fonksiyonları, "bit" kütüphanesinin kullanımı ve programdan çıkış yapmak için kullanılan çeşitli fonksiyonlar ("exit", "abort", "quick_exit", "terminate") anlatılarak bölüm bitirilmektedir.

Bölüm 17: Numerics

Bu bölümde C++ standart kütüphanesinde yer alan çeşitli matematiksel fonksiyonlara ve algoritmalara değinilmektedir. Öncelikle C dilinden de aşina olabileceğiniz çeşitli matematiksel fonksiyonlar ("abs", "ceil", "floor", "sin" vb.) ve onların kulanımları anlatılmaktadır. Daha sonra C++’ın "numeric" kütüphanesine geçilmekte ve buradaki çeşitli algoritmalar açıklanmaktadır. Bunu yaparken paralel sayısal algoritmalara da değinilmektedir. Sonrasında karmaşık sayıları (complex numbers) nasıl ele alabileceğimiz kısaca açıklanmaktadır. Rastgele sayıların ele alınması, "valarray" ile vektör işlemleri, sayısal limitler, tür takma isimileri (type aliases) ve matematiksel sabitler ile bölüm bitirilmektedir.

Bölüm 18: Concurrency (Eş Zamanlılık)

Bu bölümde C++’ta temel Thread sınıfları ve eş zamanlı programlama (concurrent programming) ile alakalı daha gelişmiş yapılar özetlenmektedir. Thread’lerin oluşturulması, onlara argüman geçme, paylaşılan veriler, Mutex’ler, Lock’lar ve Atomic’ler ile bölüme giriş yapılmaktadır. Daha sonra Thread’leri bekleme ve "condition_variable" ile ilgili kısaca konuşulmaktadır. Sonrasında ise yüksek seviyeli eş zamanlı görevlerin birbirleri ile iletişim kurmasına yarayan çeşitli özellikler açıklanmaktadır. Açıklanan özellikler şunlardır:

  • future
  • promise
  • packaged_task
  • async

Bölümün sonunda ise C++20 standartları ile dile eklenen Coroutine’lerden bahsedilmekte ve bölüm sonlandırılmaktadır.

Bölüm 19: History and Compatibility (Tarih ve Uyumluluk)

Bu bölüm genel olarak C++’ın tarihi gelişimi, ISO standartları, C++’ın kullanımı ve C++ modeli üzerinde bir anlatım sergilemektedir. Kitabın yazarı zaten C++ dilini geliştiren kişi olduğundan bir nevi kendi başından geçenleri anlatmaktadır. Daha sonra sırasıyla C++11, C++14, C++17 ve C++20 standartları ile dile ve kütüphaneye eklenen özellikler ve bu zamana kadar dilden kaldırılan veya kaldırılması planlanan özellikler ele alınmaktadır. En son ise C ile C++ arasındaki uyumluluk problemleri ele alınıp bölüm ve kitap bitirilmektedir.

Değerlendirme

Kitabın bu kadar önemli olmasının sebebi, dilin kendi geliştiricisi tarafından güncel olarak ele alınan bir referans kitabı olmasıdır. Çoğu bölümlerdeki anlatım oldukça açık olmasına rağmen, özellikle yeni eklenen dil özellikleri ile ilgili anlatımlar biraz daha karmaşık hale gelebilmektedir. Ancak kitabın okuyucu kitlesi zaten C++’ı bilen kişiler olduğu için bu bir sorun teşkil etmemektedir. Evet, kitabın okuyucu kitlesi dar bir kitle değildir; C++’a başlamış ve geliştirmekte olan kişiler, C++’a eklenen yeni özellikleri bilmek isteyen kişiler, C++’ta hali hazırda bildiklerini C++’ı geliştiren kişinin bakış açısından okumak isteyen kişiler, C++’ı çok iyi bilip/kullanıp kitabı referans olarak kullanmak isteyen kişiler şeklinde sıralayabiliriz.

Kitabın kısa bir özet bölüm ile doğrudan konuya dalması, zaten bu kitabın referans kitap özelliğini taşıdığını açık bir şekilde göstermektedir. Bölümlerdeki anlatım ve ilerleyiş C++’ı bilen okuyucular için oldukça uygundur. Her bölümün sonundaki tavsiye kısmında o bölümde anlatılanlar ile ilgili C++ Core Guidelines maddelerini vermesi kitabın bir başka harika yönüdür. Böylelikle yazar, sadece bu kitapta anlatılanlar ile sınırlı kalmayıp C++’ı stil olarak da geliştirmenizi istemektedir. Ayrıca 3. baskıda anlatım sıraları ve bölümler ile ilgili küçük dokunuşlar yapılmıştır ve bu dokunuşlar önceki baskılara göre kitabı daha sağlam bir hale getirmiştir.

Kitap bir dilin özellikeri üzerine olan referans kitap özelliği taşıdığından, kitapta çok fazla görsel ve diyagrama yer verilmemiştir. Okuyucuların kavramsal olarak bazı şeylere zaten aşina olması beklenmiştir. Özellikle bellek ile ilgili çeşitli durumları anlatırken bellek diyagramları kullanılmıştır. Bence çok fazla görsel ve diyagram kullanılmaması bu kitap için çok bir sorun değildir. Ancak özellikle bazı yeni konulardan bahsedilirken ufak da olsa 1-2 diyagram ile anlatım yapılabilirdi. Ancak bu da çok göze batmamaktadır.

Kitapta verilen kod örnekleri incelendiğinde durum oldukça başarılıdır. Özellikle ilk bölümlerde örnekler ilerlemeli olarak verilmiştir. Kitapta çok fazla tam kod örneği bulunmamakta, sadece ilgili kod parçaları kullanılmaktadır. Bu kitap bir referans kitabı özelliği taşıdığından, örneklerin çok uzun ve fazla olmaması normaldir. Ayrıca tavsiye kısmında verilen C++ Core Guidelines maddeleri de bu örnekleri desteklemektedir. Bazı kısımları çok hızlı atladığı ve çok örnek vermediği düşünülebilir. Ancak bu kısımların çoğu zaten defalarca anlatılan ve internette birçok kaynağı bulunan kısımlar veya dile çok yeni eklenen kısımlar olmaktadır.

Sonuç olarak geniş okuyucu kitlesi ele alındığında ve kitabın her zaman açıp bakılabilecek bir referans kitap olma özelliği taşıdığından, içerik anlamında oldukça iyi olduğu söylenebilir. Elbette bunu, kitabı yazan kişinin C++’ın geliştircisi olan Bjarne Stroustrup olmasına da borçludur. Kendisi zaten C++ dilinin ne amaçla geliştirildiğini ve hangi yönde geliştirilmeye devam edileceğini en iyi bilen kişidir. Ayrıca bu kitap Stroustrup’ın aralarında en güncel tuttuğu kitabıdır. Elbette kendisi daha ayrıntılı bilgiler için yine kendi kitabı olan (ancak çok da güncel olmayan) "The C++ Programming Language" kitabını okumanızı tavsiye etmektedir.

A Tour of C++ İnceleme Özeti


Tam İsim: A Tour of C++
Basım No: 3rd Edition
Yazarlar: Bjarne Stroustrup
Yayımlama Tarihi: 24 Eylül 2022
Sayfa Sayısı: 320
Anlaşılabilirlik/Okunabilirlik
Görsel/Diyagram Kullanımı
İçerik Kalitesi/Eşsizliği
Örneklendirme/Örnek Kalitesi

Sonuç Özeti

Sonuç olarak geniş okuyucu kitlesi ele alındığında ve kitabın her zaman açıp bakılabilecek bir referans kitap olma özelliği taşıdığından, içerik anlamında oldukça iyi olduğu söylenebilir. Elbette bunu, kitabı yazan kişinin C++’ın geliştircisi olan Bjarne Stroustrup olmasına da borçludur. Kendisi zaten C++ dilinin ne amaçla geliştirildiğini ve hangi yönde geliştirilmeye devam edileceğini en iyi bilen kişidir. Ayrıca bu kitap Stroustrup’ın aralarında en güncel tuttuğu kitabıdır. Elbette kendisi daha ayrıntılı bilgiler için yine kendi kitabı olan (ancak çok da güncel olmayan) “The C++ Programming Language” kitabını okumanızı tavsiye etmektedir.

4.6
0 0 votes
Article Rating
Subscribe
Bildir
guest

0 Yorum
Inline Feedbacks
View all comments