C++ Programlama Dili

Cabir C.
8 min readJan 28, 2021

--

C++ Programlama Dilinin Tarihsel Gelişimi, Avantajları ve Dezavantajları, Program Geliştirme Aşamaları, Uygulama Alanları ve Temel Kod Bileşenlerinin İncelenmesi

1. TANIM VE TARİHSEL GELİŞİM

1.1. C++ Programlama Dilinin Tarihi

C++ programlama dilinin 1979'a uzanan bir geçmişi bulunmaktadır. Bjarne Stroustrup doktora tezi üzerinde çalışırken ilk nesne tabanlı programlama dili sayılan Simula ile çalışma fırsatı bulmuştur. Ancak Simula pratik kullanım için çok yavaş kalmıştı. Bjarne Stroustrup, hem nesne tabanlı hem de pratik kullanıma uygun olacak bir programla dili üzerine çalışmış, ilk olarak ismini “C with classes” (sınıflar ile C) olarak verdiği programlama dili bugünkü C++ adını 1983'de almıştır. İsminden de anlaşılacağı gibi, bu dil geliştirilirken C’nin üst kümesi olacak şekilde tasarlanmıştır. Henüz standartlaştırılmamış olsa da 1985'de C++ ticari bir ürün olarak piyasaya sürülmüştür.[1] Uluslararası standartlara ilk kez 1998 yılında ulaşmıştır. ISO tarafından günümüze kadar 2003, 2011, 2014, 2017 ve 2020 yıllarında yeni güncellemeler ile tekrar standartlaştırılmıştır.[2]

1.2. Tanım

C++ programla dilinin ne olduğunu tanımlamak yerine, nasıl bir dil olduğunu listelersek daha anlaşılır olacaktır.[3]

· C++ 1998'den beri standardize edilmiş bir dildir.

· Derlenmiş bir dildir.

· C++ kodu derlendiğinde, herhangi bir aracı olmadan makinenin yerel kodu elde edilir. Optimizasyon ile dünyanın en hızlı çalışan kodları elde edilebilir.

· Güvensiz bir dildir. Çünkü çok fazla esneklik sağladığı için programcının gerekli şeyi bildiği varsayılır.

· Hem statik hem dinamik tip kontrolünü destekler. Tip dönüşümlerini derleme veya çalışma zamanında kontrol edilmesini sağlar.

· C ile doğrudan uyumludur. Çoğu C kütüphanesini destekler.

· Dünyanın en sık kullanılan ve en çok destek verilen dillerinden biridir. SourceForge gibi açık kaynak kütüphane sağlayıcı web sitelerinde 3000'den fazla C++ kütüphanesi bulunabilir.

· 2011 ve sonrası sürümlerinde nesneye yönelik programlama (sınıflar, kalıtım, biçimlilik, veri soyutlama…) yeteneği daha da artırılmıştır.

2. AVANTAJLAR VE DEZAVANTAJLAR

2.1. C++ Programlama Dilinin Avantajları

2.1.1. Taşınabilirlik

C++ kullanıcıya aynı programı farklı işletim sistemlerinde çalıştırma imkanı sayesinde platform bağımsızlığı sağlar. Mesela Linux işletim sisteminde koşan bir C++ uygulaması, aynı kaynak kodunu Windows işletim sisteminde derleyerek Windows makinesinde de çalıştırılabilir.[4]

2.1.2. Nesne Tabanlı

C++ dilinin en büyük avantajlarından birisi nesneye yönelik programlama imkanı sunabilmesidir. Sınıflar, kalıtım, biçimlilik, veri soyutlama gibi bir çok kavramı barındırır. Kodun tekrar tekrar kullanılmasına olanak sağlayarak programı daha güvenilir hale getirir.

Nesne tabanlı programla desteği, günümüzün problemlerine daha kolay çözüm imkanı da sağlamaktadır. C++ programlama dilinin bu özelliği sayesinde bir çok iş alanı ve teknoloji doğmuştur.[4]

2.1.3. Çok Paradigmalı

C++ çoklu paradigmalı bir dildir. Burada kullandığımız ‘paradigma’ kelimesini programlama stili olarak düşünebiliriz. Öyle ki, ‘generic’ programlama, ‘imperative’ programlama ve ‘nesneye yönelik’ programlama C++ dilinin üç farklı paradigması diyebiliriz.[4]

2.1.4. Alt Seviye Programlama

C++ programlama dili C’yi kapsayan bir dil olduğu için, C ile yapılan alt seviye veri manipülasyonu C++ ile de yapılabilir. Çoğu gömülü sistemler ve derleyiciler C++ programlama dilinin yardımı ile oluşturulmaktadır.[4]

2.1.5. Hafıza Yönetimi

C++, kullanıcıya bellek yönetimi üzerinde tam kontrol sağlar.[4]

2.1.6. Geniş Topluluk Desteği

C++, hem ücretli hem de ücretsiz çevrimiçi kurslar ve dersler veren büyük bir topluluğa sahiptir. İstatistiksel olarak, C++ StackOverflow ve GitHub’da en çok kullanılan ve takip edilen 6. etikettir.[4]

2.1.7. C Programlama Dili ile Uyumluluk

C++, C ile yüzde yüze yakın uyumluluktadır. Neredeyse her hatasız C programı geçerli bir C++ programıdır. Kullanılan derleyiciye bağlı olarak, her C++ programı .cpp uzantılı bir dosyada çalışabilir.[4]

2.1.8. Ölçeklenebilirlik

Ölçeklenebilirlik, bir programın ölçeklendirme yeteneğini ifade eder. Bu, C++ programının küçük veya büyük ölçekte veri çalıştırabildiği anlamına gelir. Ayrıca (video, ses gibi) yoğun kaynak içerlikli uygulamalar da geliştirilebilir.[4]

2.2. C++ Programlama Dilinin Dezavantajları

2.2.1. İşaretçi Kullanımı

C / C++ işaretçileri anlaşılması nispeten zor bir kavramdır ve çok fazla bellek tüketir. Yanlış kullanılan işaretçiler sistemin çökmesine veya anormal şekilde davranmasına neden olabilir.[4]

2.2.2. Güvenlik

Nesne yönelimli programlama, C gibi nesne yönelimli olmayan diğer programlama dillerine kıyasla işlenen verilere çok fazla güvenlik sunsa da, benzer fonksiyonların, global değişkenlerin ve işaretçilerin kullanımı nedeniyle bazı güvenlik sorunları hala mevcuttur.[4]

2.2.3. Artık Veri Temizliği

Daha önce bahsedildiği (bkz. 2.1.5) gibi, C ++, kullanıcıya DMA (direkt hafıza erişimi) kullanarak bilgisayar belleğini yönetme konusunda tam denetim verir. C++, gereksiz verileri otomatik olarak filtrelemek için bir çöp toplayıcı özelliğine sahip değildir.[4]

2.2.4. Yerleşik Thread

C ++ yerleşik iş parçacıklarını desteklemez. Thread’ler, C++ ‘da başlangıçta olmayan nispeten yeni bir kavramdır. Güncel olarak C++ lambda fonksiyonlarını destekleyebilir.[4]

3. PROGRAM GELİŞTİRME AŞAMALARI

Bu başlıkta bir C++ uygulamasının geliştirilme aşamaları incelenecektir. Aşağıda listelenen maddeler sadece C++ programla dili için değil genel bir program geliştirme rutinidir.[5]

3.1. Problemin Tanımlanması

İlk adım sorunu tanımlamaktır. Bu iş büyük yazılım projelerinde sistem analistinindir. Program geliştirme aşamasında yazılımcıların izleyeceği yol belirlenir. Belirlenen plan, programda kullanılacak veriyi, verinin nasıl ve nerede işleneceğini, programın çıktısını ve kullanıcı ara yüzünü irdeleyerek ilgili problemin çözümüne ulaştırmalıdır.

3.2. Program Tasarımı

Program tasarımı, programın ulaşmaya çalıştığı ana hedefe odaklanarak ve programı her biri bu hedefe katkıda bulunan yönetilebilir bileşenlere bölerek başlar. Program tasarımında bu yaklaşım, üst-alt program tasarımı veya modüler programlama olarak adlandırılır. İlk adım, programın ana faaliyetlerinden biri olan ana rutinin tanımlanmasını içerir. Bu noktadan sonra, programcılar ana rutinin çeşitli bileşenlerini modül adı verilen daha küçük parçalara ayırmaya çalışırlar. Her modül için, programcı modülün atama işini nasıl yapacağını görselleştirmek için uygun bir program tasarım aracı kullanarak kavramsal bir plan çizer. Aşağıda örnek tasarım kavramları listelenmiştir.

  • Yapı Şeması (Hiyerarşi Çizelgesi): Bir yapı şeması, programın yukarıdan aşağıya tasarımını gösterir. Yapı grafiğindeki her kutu, programın gerçekleştirmesi gereken bir görevi belirtir. Üst modül, Ana modül veya Kontrol modülü olarak adlandırılır.
  • Algoritmalar: Algoritma, bir çözüme en kolay şekilde nasıl ulaşılacağının adım adım açıklamasıdır. Algoritmalar yalnızca bilgisayar dünyasıyla sınırlı değildir. Günlük hayatımızda farkında olarak ya da olmayarak algoritmaları kullanmaktayız.
  • Karar tabloları: Karar tablosu, bir çift yatay ve dikey çizgi ile dört parçaya ayrılan özel bir tablo türüdür.
  • Pseudocode (Sözde Kod): Pseudocode çözüme ulaşmak için kullanılan başka bir araçtır. Gerçek kodu yazmadan önce programın temel mantığını ortaya çıkarmak için kullanılır.
  • Akış Şeması: Akış şeması, programın mantığını gösteren bir diyagramdır.

3.3. Kodlama

Programın kodlanması, algoritmanın (C++) programlama diline çevrilmesi anlamına gelir. İyi tanımlanmış kontrol yapılarının kullanıldığı programlama tekniğine ‘yapılandırılmış programla’ denir. Programcı bu teknikte, dil kurallarına uymalıdır. Herhangi bir kuralın ihlali hataya neden olur. Bir sonraki adıma geçmeden önce bu hataların giderilmesi gerekir.

3.4. Test ve Hata Ayıklama

Sözdizimi hatalarının giderilmesinden sonra program çalıştırılır. Ancak, programın çıktısı doğru olmayabilir. Bunun nedeni programdaki mantıksal hata(lar)dır. Mantıksal bir hata, programcının bir soruna çözüm tasarlarken yaptığı bir hatadır. Bu yüzden programcı Test verilerini kullanarak program çıktısını dikkatle inceleyerek mantıksal hataları bulmalı ve düzeltmelidir. Sözdizimi hataları ve mantıksal hatalar ‘bugs’ olarak bilinir. Hataları belirleme ve ortadan kaldırma işlemi hata ayıklama (debugging) olarak bilinir.

3.5. Dokümantasyon

Testten sonra yazılım projesi neredeyse tamamlanmıştır. Tasarım aşamasında geliştirilen yapı şemaları, sözde kodlar, akış şemaları ve karar tabloları, yazılım projesiyle ilişkili diğer kişiler için doküman haline gelir. Bu aşama, programın işlevselliğine genel bir bakış, yeni başlayanlar için öğretici metinler içeren, ana program özelliklerinin ayrıntılı açıklamalarını bulunduran, tüm program komutlarının referans dokümantasyonu ve program tarafından oluşturulan hata mesajlarının ayrıntılı bir açıklamasını sunan bir el kitabı yazarak sona erer.

3.6. Programın Yayınlaması ve Bakımı

Son aşamada, program kullanıcının sistemine dağıtılır (yüklenir). Burada kullanıcı (müşteri) yeşil ışık yakana kadar program izlenir. Yazılım tamamlandıktan sonra bile, düzenli olarak bakılması ve değerlendirilmesi gerekir. Bakımın gereği olarak, programlama ekibi program hatalarını düzeltir ve yazılımı günceller.

4. UYGULAMA ALANLARI

Bu başlık altında, C++ dilinde yazılmış ve yazılım uzmanlarının günlük kullandığı çeşitli uygulama alanları listelenmektedir. C++ öğrenmesi zor bir programlama dili olmasına rağmen, bu programlama dilini kullanarak geliştirilebilecek uygulama yelpazesi şaşırtıcıdır.[6]

4.1. Oyun Sektörü

C++ donanıma yakın olduğu için kaynaklara kolayca erişebilir, yoğun işlem gerektiren fonksiyonlar üzerinden prosedürel programlama sağlayabilir ve hızlıdır. Ayrıca 3D oyunların karmaşıklıkları ile kolayca başa çıkabilir ve çok katmanlı ağ bağlantısı sağlar. C++’ın tüm bu faydaları, oyun sistemlerinin yanı sıra oyun geliştirme platformlarının geliştirilmesinde de birincil tercih olmasını sağlar.

4.2. Kullanıcı Ara Yüzü Sağlama

C++, gerekli kabiliyetlere sahip olduğu için, GUI tabanlı ve masaüstü uygulamalarını geliştirmek için de kullanılabilir. ‘Adobe’ ve ‘WinAmp Media Player’ C ++ ile yazılmış GUI tabanlı uygulamalara örnektir.

4.3. Veritabanı Yazılımları

C++ veritabanı yönetim yazılımlarını geliştirmede de kullanılmaktadır. En popüler iki veritabanı MySQL ve Postgres C++ ile yazılmıştır.

4.4. İşletim Sistemi Geliştirme

C++’ın güçlü ve hızlı bir programlama dili olması, onu işletim sistemleri yazmak için ideal bir aday yapmaktadır. Buna ek olarak, C++, alt seviye programlar yazmaya yardımcı olan geniş bir sistem düzeyi fonksiyon koleksiyonuna sahiptir.

Apple OS X’in ve iPod’un bazı bölümleri C++ ile yazılmıştır.

Microsoft’un yazılımlarının çoğu C++ kullanılarak geliştirilmiştir. Windows 95, ME, 98, XP, vb. işletim sistemleri C ++ ile yazılmıştır.

4.5. Web Tarayıcı Geliştirme

Tarayıcılar hızlı ‘render’ için çoğunlukla C++ kullanır. Kullanıcılar web sayfasının yüklenmesini beklemek istemediğinden ‘render’ motorlarının daha hızlı çalışması gerekir. Firefox, Tunderbird, Chrome C++ kullanılan web tarayıcılarına örnektir.

4.6. Grafik ve Gelişmiş Hesaplama

C++, yüksek performanslı görüntü işleme, gerçek zamanlı fiziksel simülasyonlar ve hızlı tepki gerektiren mobil sensör uygulamalarının geliştirilmesinde büyük fayda sağlar.

Maya 3D yazılımı C++ ile geliştirilmiş, animasyon, sanal gerçeklik, 3D grafikler ve ortamlar için kullanılmaktadır.

4.7. Banka Uygulamaları

C ++ eşzamanlılığa yardımcı olduğundan, çoklu iş parçacığı, eşzamanlılık ve yüksek performans gerektiren bankacılık uygulamaları için varsayılan seçim haline gelmiştir.

Infosys Finacle, backend’de programlama dili olarak C++ kullanan popüler bir bankacılık uygulamasıdır.

4.8. Bulut / Dağınık Sistemler

Günümüzde yaygın olarak kullanılan bulut depolama sistemleri donanıma yakın çalışmaktadır. C++, donanıma yakın olduğundan bu tür sistemler için varsayılan bir seçim haline gelir. C++ ayrıca eşzamanlı ve yük toleransı oluşturabilen çoklu iş parçacıkları ile de çalışmayı destekler.

4.9. Derleyici Geliştirme

Çeşitli üst düzey programlama dillerinin derleyicileri C veya C ++ ile yazılır. Bunun nedeni, hem C hem de C++’ın donanıma yakın olan ve temel donanım kaynaklarını programlayıp işleyebilen alt seviye diller olmasından kaynaklanır.

4.10. Gömülü Sistemler

Akıllı saatler, tıbbi ekipman sistemleri gibi çeşitli gömülü sistemler, donanım seviyesine daha yakın olduğu için programlamada C ++ kullanır ve diğer yüksek seviye programlama dillerine kıyasla çok sayıda düşük seviye sistem fonksiyonu sağlayabilir.

4.11. Kütüphane Geliştirme

Çok yüksek düzey matematiksel hesaplamalara ihtiyaç duyduğumuzda, performans ve hız önem kazanır. Bu nedenle kütüphanelerin çoğu temel programlama dili olarak C++ kullanır. Çoğu üst düzey makine dili kitaplığı da backend’de C++ kullanmaktadır.

5. TEMEL KOD BİLEŞENLERİNİN İNCELEMESİ

Temel kod bileşenlerini iki örnek üzerinden inceleyelim. Aşağıdaki kod parçaları parametre olarak integer dizi ve boyutunu almaktadır, döndürdüğü değerler ise dizideki maksimum ve minimum elemanlardır.

0) Main fonksiyon

1) pass-by-reference via pointers

2) pass-by-referance

Fonksiyonların döndürdüğü değerler minimum ve maksimum elemanlar olacak demiştik ama iki fonksiyonumuz da “void” tanımlanmış. C/C++ programlama dillerini güçlü kılan işaretçilerin önemini burada anlıyoruz. Fonksiyonlar istediğimiz değeri döndürmese bile o değerlere elimizdeki adreslerle ulaşabiliriz.

Peki bu fonksiyonlar aynı işi yaptığı halde neden farklı şekillerde tanımlanmış ve main fonksiyonda farklı şekilde çağırılmıştır? Birinci fonksiyon C programlama dilinden aşina olduğumuz klasik bir yöntemle yazılmıştır. C++, C’nin üst kümesi olduğu için C formatında yazılan bu fonksiyonu da destekler. Fakat ikinci fonksiyon sadece C++ derleyici ile çalıştırabilirsiniz. C++ gerçek anlamda değişken adreslerine ulaşmaktadır. Birinci fonksiyonda yaptığımız aslında değişkenin adresini parametre olarak kullanmak iken, ikincinde ise fonksiyonun gövdesinde değişkenlerin önüne herhangi bir operatör sembolü koymadan değerlerini değiştirebiliyoruz.

KAYNAKÇA

[1] “History of C ,” cplusplus.com. [Online]. Available: http://www.cplusplus.com/info/history/. [Accessed: 05-May-2020].

[2] “ISO/IEC 14882:2011,” ISO, 14-Jan-2015. [Online]. Available: https://www.iso.org/standard/50372.html. [Accessed: 05-May-2020].

[3] “A Brief Description,” cplusplus.com. [Online]. Available: http://www.cplusplus.com/info/description/. [Accessed: 05-May-2020].

[4] D. F. Team, “Advantages and Disadvantages of C : Make your Next Move!,” DataFlair, 03-Feb-2020. [Online]. Available: https://data-flair.training/blogs/advantages-and-disadvantages-of-cpp/. [Accessed: 05-May-2020].

[5] SakshiBhakhraCheck, “Software Engineering: Program Development Life Cycle (PDLC),” GeeksforGeeks, 14-Jan-2019. [Online]. Available: https://www.geeksforgeeks.org/software-engineering-program-development-life-cycle-pdlc/. [Accessed: 05-May-2020].

[6] “What Is C Used For? Top 12 Real-World Applications and Uses of C ,” Software Testing Help, 16-Apr-2020. [Online]. Available: https://www.softwaretestinghelp.com/cpp-applications/. [Accessed: 05-May-2020].

--

--