1 puan yazan GN⁺ 2024-04-20 | 1 yorum | WhatsApp'ta paylaş
  • 『Programming: Principles and Practice Using C++』 3. baskı, öncelikle programlamayı ilk kez öğrenen okurları hedefliyor; biraz deneyimi olan okurlar için de modern C++ ile daha iyi stil ve teknikleri öğrenmeye yönelik bir giriş kitabı olarak kullanılabilir
  • Kitabın odağı C++ sözdizimi ayrıntılarını ezberletmek değil, programlamanın temel ilkeleri ve pratik teknikleri; prosedürel, nesne yönelimli ve jenerik programlamayı birlikte ele alıyor
  • PPP3, PPP2’ye göre yaklaşık yarı boyuta indirilmiş; bir dönemlik derste işlenen temel bölümler güçlendirilirken C++20/C++23 ve Qt tabanlı Graphics/GUI kodu yansıtılmış
  • Daha uzmanlaşmış bölümler ve salt başvuru materyalleri, gerektiğinde bakılmak üzere web’e taşınmış; güncel başvuru bilgilerini cppreference.com gibi web kaynaklarıyla tamamlama yönünde ilerliyor
  • Örnek PDF, PPP modülü ve header’ları, Qt GUI kodu, ders slaytları, kodlama stili rehberi gibi materyaller sunuluyor; hem derslerde hem de kendi kendine öğrenmede kullanılabilir

Kitabın amacı ve okurları

  • 『Programming: Principles and Practice Using C++ (3rd Edition)』, kısaca PPP3, programlama deneyimi olmayan kişiler için bir giriş kitabıdır
  • Daha önce biraz programlama yapmış okurlar da stil ve tekniklerini geliştirmek veya modern C++ öğrenmek için kaynak olarak kullanabilir
  • Derslerde kullanılmak üzere tasarlanmış olsa da kendi kendine öğrenme de göz önünde bulundurularak yazılmıştır
  • Önceki baskı, Texas A&M University’de elektrik mühendisliği, bilgisayar mühendisliği ve bilgisayar bilimi öğrencilerine yönelik ilk programlama dersinde ve çeşitli başka yerlerde kullanılmıştı

Programlamayı öğretme yaklaşımı

  • Kitap, okurun sonunda başkalarının kullanabileceği ve bakımını yapabileceği kadar iyi programlar yazabilmesini hedefler
  • Odak, tali dil teknolojisi ayrıntılarından çok temel kavramlar ve teknikler üzerindedir
  • Yalnızca basit bir C++ dili giriş kitabı değil, genel olarak programlamaya giriş niteliğinde kurgulanmıştır
    • Prosedürel programlama
    • Nesne yönelimli programlama
    • Jenerik programlama
  • Modern üst düzey tekniklerin yanı sıra, donanımı verimli kullanmak için gereken düşük düzeyli teknikleri de ele alır
  • Kullanışlı, doğru, tip güvenli, bakımı yapılabilir ve verimli kod yazmak için temel sağlar
  • Temel kavramları, tasarım ve programlama tekniklerini, dil özelliklerini ve kütüphaneleri geniş kapsamda ele alır

3. baskıda değişenler

  • PPP3, PPP2’ye kıyasla yaklaşık yarı boyuttadır
  • Bir dönemlik kursta genellikle işlenen temel bölümler güçlendirilerek hacim azaltılmıştır
    • C++20 ve C++23’ün temel kısımlarından yararlanır
    • Graphics/GUI bölümlerindeki kod, tarayıcılar ve cep telefonları gibi ortamlara taşınabilirlik dikkate alınarak Qt tabanlı biçimde yeniden düzenlenmiştir
  • PPP2’de “broadening the view” olarak adlandırılan daha uzmanlaşmış bölümler, gerektiğinde kullanılabilmesi için web’e konumlandırılmıştır
  • Salt başvuru materyalleri kaldırılmıştır
    • Web’de daha fazla ve daha güncel materyal bulunabilir; örnek olarak cppreference.com’dan söz edilir

C++ standardı ve kütüphane kapsamı

  • Kitap C++20 ve C++23 kullanır
  • Yerleşik tipler ile kullanıcı tanımlı tiplerin tasarımını ve kullanımını ele alır
    • Girdi
    • Çıktı
    • Hesaplama
    • Basit grafik/GUI
  • C++ standart kütüphanesinin container’ları ve algoritmalarına giriş de içerir

Yayınlanan örnek materyaller

  • Preface: Kitabın neleri vaat edip neleri vaat etmediğini ele alır
  • Table of Contents: İçindekiler PDF’i
  • Chapter 0: Notes to the Reader: Kitabın yaklaşımını anlatır
  • Chapter 10: A Display Model: Örnek bölüm
    • Tamamen yeni başlayanların henüz okumaması daha iyi olur
    • Öğretmenlere ve deneyimli okurlara, haftada 2 bölüm temposuyla yaklaşık 5. haftada kitabın ulaştığı seviyeyi göstermek için hazırlanmış bir bölümdür
    • Modern C++’ın bir kısmını gösterme amacı da vardır

Destek materyalleri ve kod

Web’de kalan PPP2 bölümleri

Çeviri durumu

  • PPP3’ün henüz çeviri baskısı yok
  • Önceki baskıların çevirileri book covers page üzerinden görülebilir

1 yorum

 
GN⁺ 2024-04-20
Hacker News görüşleri
  • Bu kitabın “klasik ilk program”ının daha ilk satırdan import std; kullanmasını epey sorunlu buluyorum. Bildiğim kadarıyla MSVC dışında hiçbir derleyici varsayılan hâliyle bunu düzgün desteklemiyor.
    Debian’da g++ --std=c++23 -fmodules-ts yapsanız da olmuyor; https://en.cppreference.com/w/cpp/23 sayfasına bakınca ilgili öneri P2465R3, clang++ 17’de de “kısmi destek” var. clang++17 kursanız bile module 'std' not found çıkıyor.
    import std;nin çok yeni bir özellik olduğunu anlıyorum ama bu kitap C++’a yeni başlayanlar için; ortalama bir aceminin buna nasıl tepki vereceğini merak ediyorum. 1-2 yıl önce “Tour of C++” okurken de aynı sorunu görmüştüm.

    • İyi bir nokta ve ben de aynı şeyi yaşadım. Benim g++ de tam olarak aynı hatayı ve yönlendirmeyi veriyor.
      Şu anda tartışılan Stroustrup’un son baskısını okumadım, ama eski baskısını C++’ı her gün kullandığım dönemde okumuştum. Aradan 20 yıl geçmiş olsa da Koenig ve Moo’nun Accelerated C++ kitabını hâlâ daha çok tercih ediyorum. Sonrasında daha iyi kitaplar çıkmış olabilir ama okumadım.
      Hatırladığım kadarıyla o kitaptaki Hello World #include, int main(), std::cout << "Hello, world!" << std::endl; gibi bir yapıdaydı; bugün Arch Linux’ta da g++ a.cpp ile derleyip ./a.out çalıştırınca aynen çalışıyor.
      Kitabın tamamı, C’nin pointer aritmetiği olmadan, modern C++ ile neredeyse sözde kod kadar basit ve temiz bir stili taklit eden mükemmel bir kurguya sahipti. Erken dönem Python’ın düzenli hissine de benziyordu; Python tarafında ise pandas’ın numpy, scipy gibi C++ sarmalayıcı kütüphaneleri getirmesine kadar böyle unsurlar yoktu.
      Gerçek işlerde temiz C++ kodunu neredeyse hiç görmedim. FAANG’de çalışmadım ve hızlı prototiplerde kod incelemesi de nadirdi; bu yüzden Koenig ve Moo tarzı rehberliğin benim deneyimlediğim sıfırdan proje dünyasının dışında ne kadar yayıldığını bilmiyorum. Bir sonraki Therac-25 olmak istemeyen radyoterapi gibi alanlar istisna olabilir.
    • Mevcut GCC 13.2.1 belgeleri, standart kütüphanenin içe aktarılabilir header unit’ler olarak sunulmadığını söylüyor. Böyle birimleri import etmek için önce açıkça derlemek gerekiyor; dikkat edilmezse modül mekanizmasının birleştirmesi gereken yinelenen bildirimler oluşabilir ve derleyicinin kaynak kullanımı, başlık dosyalarının nasıl bölündüğünden etkilenebilir.
      Bu yüzden şimdilik importun çalışması için önce uygun modül dosyasını yazmak gerekiyor. Yine de GCC’nin standart C++ kütüphanesini güncellemesinin çok uzun süreceğini sanmıyorum; ileride bu yeni kitabı doğrudan olduğu gibi kullanmak mümkün olabilir.
      Zaten eski C++’ı bilen ve sadece bilgisini güncellemek isteyen biri için o modül dosyasını bizzat yazmak da iyi bir öğrenme deneyimi olabilir.
    • Artık ilginç bir C++ programını build sistemi olmadan sürdürmek gerçekçi değil. Yine de örnek verilen g++ çağrısının, bir gün biri GCC’ye yama eklerse derleyicinin özel işlemesiyle çalışır hâle gelmesi büyük olasılık.
      Genel olarak araştırma amaçlı örnekler dışında g++ çağrılarını elle birbirine bağlamak artık gerçekçi değil. Diğer derlenen dillerde de insanlar gccgo, rustc, javac ile doğrudan uğraşmak yerine gobuild, cargo, Maven gibi sistemler kullanıyor.
      https://www.kitware.com/import-std-in-cmake-3-30/
    • Kitap sayfasında atıf yapılan şu belge modül sorunu konusunda yardımcı olabilir: https://www.stroustrup.com/module_use.html
  • GUI bölümünde FLTK yerine Qt’ye geçmiş. Qt sektörde yaygın kullanıldığı için bu oldukça büyük bir değişiklik ve iyi karşılanacak gibi; ama öğrenme eğrisinin nasıl değişeceğini bilmiyorum.

    • Stroustrup’un Meta Object Compiler hakkında ne düşündüğünü merak ediyorum. Bazı yönlerden Qt, C++’ın kendi lehçesi gibi hissettiriyor.
    • Qt’de Qt Creator olduğu için bunun daha iyi bir tercih olduğunu düşünüyorum.
    • Özel bir sarmalayıcı kütüphane kullandığı için gerçek Qt’nin ne kadarının açığa çıktığından pek emin değilim.
    • Denediğim 4 yapay zeka kodlama yardımcısının (claude3, gemini, gpt4, deepseek) hepsinden C++ ile boids ve Game of Life yazmasını istediğimde grafikler için SFML kullandılar.
      Bunun çapraz platform olmasından mı, yoksa bu modellerin eğitildiği kodlarda SFML kullanım örneklerinin daha fazla olmasından mı kaynaklandığını merak ediyorum. SFML, Qt veya FLTK’ye göre nispeten daha yeni gibi; daha fazla eğitim verisi olması garip, ayrıca dördünün de C++ grafiklerinde SFML kullanalım diye aynı fikirde olması da tuhaf.
  • Stroustrup kodunda hoşuma giden şey using namespace std; kullanması. Her şeyin başına std::every std::last std::bloody std::thing gibi std:: ekleme geleneği insanı çıldırtıyor.

    • Duruma göre değişir. Header dosyalarına, hangi ad alanı olursa olsun, kesinlikle using namespace koymamak gerekir. Çünkü ad alanlarının kaçınmak için tasarlandığı ad çakışmalarını tam da böyle yaratmış olursunuz.
      Uygulama dosyalarında da kişisel olarak using namespace std; sevmiyorum. Kod okunabilirliğini azalttığını düşünüyorum; std:: içeriği çok büyük ve sürekli büyüdüğü için ad çakışması ihtimalinden tamamen kaçınmak istiyorum.
      Kod bir kez yazılır ama defalarca okunur; bu yüzden ad alanı dâhil kısa isimler seçmek verimlilik açısından kötü bir tercih gibi görünüyor.
    • Ad çakışması olmaması güzel. Ama bir şekilde diğer diller bu sorunu çözdü.
    • C++ modülleri düzgün oturduğunda bu artık tartışma konusu olmaktan çıkmayacak mı acaba?
    • stdnin kendisinden çok çift iki nokta :: çirkin. Neden diğer dillerdeki gibi sadece nokta kullanılamadığını hiç anlayamadım.
    • Sanırım Windows’ta programlama öğrenmişsin.
  • 10 yılı aşkın süredir C++ kullanmadım ama bu kitabın önceki baskısını gerçekten derinlemesine çalıştığımı hatırlıyorum. Üniversitede 4 yıl boyunca neredeyse %99 C++ kullanmış olmama rağmen böyleydi.
    Gerçekten çok iyi bir kitap. Kitaptaki C++’ı zaman ayırıp düzgünce anlarsanız, dünyanın C++’tan neden bu kadar korktuğunu biraz hüzünlü biçimde hissedebilirsiniz.
    Tabii sonrasında, böyle kitapları hiç okumadan korkunç C++ kodu yazan bir sürü insanla karşılaştım.

  • C++ ile çalıştığım günleri özlüyorum. Öncekine göre geliştirme yığınının daha alt katmanlarına inmişim gibi geliyor. Eskiden UI, API ayrıştırma, neredeyse her şeyi C++ ile yapardık.

    • Bir süre Fortran’ı özledim; yaklaşık 30 dakika kod yazınca hemen iyileştim. C++ ile bir kez JSON ayrıştırmayı deneyip özleminizin o sürece dayanıp dayanmadığına bakın.
    • Ben de gerçekten özlüyorum. O kadar da eski olmayan bir zamanda hem istemcisi hem sunucusu C++ olan bir uygulamamız vardı; UI, API, her şey C++’tı. Gerçekten genel amaçlı bir dil gelmiş gibi hissettirmişti.
      Kusursuzdu demem ama iş eğlenceliydi ve o yığında çalışabilecek yüksek seviyeli insanlarla birlikte olmak keyifliydi. Blade sunucuda distcc çalıştırıp derlemeyi çok daha hızlı hale getirdiğimiz zamanki kadar heyecan verici bir öğle arası hatırlamıyorum. Linux’a tutkuyla bağlı tek kişinin ben olmamam da güzeldi.
    • Bizim şirkette UI dışında neredeyse her şey C++. UI’ın C++ olmamasının tek sebebinin, yeni mezunların C++ eğitimi almadan önce de hemen çalışabileceği kod tabanının bir kısmını bırakmak olduğunu düşünüyorum.
    • C++ özlemimi gidermek için hâlâ kişisel proje olarak biraz oyun motoru kurcalıyorum. Tüm eleştirilere rağmen C++ kullanmayı gerçekten seviyorum.
    • Yeter ki Python ile çalışmak zorunda kalmayayım.
  • Geçen yıl boyunca 2. baskının büyük kısmını bitirdim. Gerçekten mükemmel bir kitap ve yıllar içinde programlamada karşılaştığım birçok zihinsel engeli aşmama yardımcı oldu.
    Bu baskının kısalmasının ana nedeni Part IV: Broadening the View bölümünün çıkarılmış olması. Metin işleme, sayısal hesaplama, gömülü sistemler gibi ek konuları ele alan bu bölüm artık çevrimiçi sunuluyor. İlgili bölümler hâlâ geçerli ve C++11/14 kullandığı için 2. baskıdan beri güncellenmemiş.

  • Modern C++ için sürekli güncellenen C++ Annotations kitabını da paylaşıyorum: http://www.icce.rug.nl/documents/cplusplus/

    • Bir emülatör projesinde sınıflı C üzerine sadece akıllı işaretçiler ve auto ekleyerek kullanmanın oldukça iyi bir yaklaşım olup olmadığını merak ediyorum.
      Eskiden C++’ın dört bileşeni olduğu söylenmişti. İlki “C”, ikincisi nesne yönelimlilik, üçüncüsü STL ve şablonlar gibi üretkenlik ve esneklik sağlayan kısım, sonuncusu ise volatile, asm gibi özel durumlara yönelik kısım diye sınıflandırılmıştı. O kişi 1 numarayı dikkatli kullanmayı ve 4 numarayı kullanmak zorunda kalınacak durumlardan kaçınmayı önermişti; bunun mantıklı olup olmadığını merak ediyorum.
    • 404 veriyor.
  • Daha kalın bir tuğla kitap olacağını sanmıştım; şaşırtıcı biçimde yarıya inmiş.
    2. baskı karton kapak 1312 sayfa, ağırlığı 4,81 pound’du; 3. baskı ise karton kapak 656 sayfa, ağırlığı 2,71 pound.

    • Önsöze bakılırsa referans materyalinin epey bir kısmı kitaptan çıkarılıp internetteki C++ dokümantasyonuna aktarılmış gibi.
      “Programming: Principles and Practice Using C++” 3. baskı, 2. baskının yaklaşık yarısı boyutunda ve kitabı yanında taşımak zorunda olan öğrencilerin hafifleyen ağırlığı memnuniyetle karşılayacağı söyleniyor. Küçülmenin nedeni olarak C++ ve standart kütüphane hakkında daha fazla bilginin web’de bulunması gösterilmiş.
    • C++ bilgisinin pound cinsinden sayılmasını görmek hoşuma gitti.
    • Kelimenin tam anlamıyla tam yarısı. Acaba daha küçük bir yazı tipi mi seçmişler?
  • Bjarne’in #include sonrasında neden bazen boşluk koyup bazen koymadığını merak ediyorum.
    https://www.stroustrup.com/PPPheaders.h

    • Elle girilen header’lar ile IDE’nin otomatik eklediği header’lar karıştıysa, üstüne import’ları varsayılan olarak katlayan bir ayar varsa ya da kaydederken clang-format çalıştırılmadıysa gözden kaçabilir.
  • Yeni sürümün çıkması gerçekten heyecan verici. C++ ile ilgilenmiyor ya da zaten deneyimli bir programcı olsanız bile bu kitap okunmaya değer.
    Bildiğim kadarıyla teknik yazım ve bilgisayar programlama eğitimi alanındaki en iyi örneklerden biri.