Günümüz dünyasında pek çok şey artık belli standartlara göre yapılmaktadır. Peki nedir bu standart dediğimiz şey? “Standartlar, ürünleri hizmetler ve üreticiler için kriterler belirleyen belgelenmiş ve genellikle gönüllü anlaşmalardır. Standartlar, ürünlerin ve hizmetlerin amacına uygunluğunu, kıyaslanabilirliğini ve rekabet edebilirliğini sağlar.“[1] Örneğin Türk Standartları Enstitüsü (TSE) tarafından “TS 5676” kodu ile 1988’de onaylanan bir standart, su kirliliği kontrolü ve zehirlilik testleri ile ilgili çeşitli kuralları kapsamaktadır.[2] Bu ve bunun gibi pek çok standart, çeşitli işleri yaparken karşımıza çıkmaktadır.
Bilgisayar dünyasında da çeşitli standartlar ve bu standartları ellerinde barındıran çeşitli kurumlar bulunmaktadır. ISO (International Organization for Standardization), IEEE (The Institute of Electrical and Electronics Engineers) ve ANSI (American National Standards Institute) kurumlarından daha önce bahsetmiştim. Bu kurumlar bilgisayar ve elektronik dünyasındaki çoğu standardı ellerinde barındırmaktadırlar. Kimisi Avrupa ülkelerinde sıkça kullanılırken, kimisi Amerika kıtasında yer alan ülkelerde sıklıkla kullanılmaktadır.
C dilinin tarihinden daha önce bahsetmiştim. Bu dil genellikle ISO ve ANSI kurumlarına ait olan standartlara sahipti. İlk C++ standardı ise 1990 yılında ANSI tarafından yayınlanmıştır. Hemen 1 yıl sonrasında, yani 1991 yılında ise ISO bir standart yayınlamıştır. STL (Standard Template Library) kütüphanesi ise bu yıllarda daha geliştirilmemişti. STL kütüphanesi standartlardan ayrı olarak 1992 yılında geliştirilmeye başlandı. C++ standartlarının en bilineni ve ses getireni ise 1998 yılında ISO kurumu tarafından ISO/IEC 14882:1998 kod adıyla yayınlanan C++98 olmuştur.
C++98 ile dile pek çok yenilik getirilmiştir. Bunlardan en iyisi, dilin artık STL üzerine kurulu olması ve bu kütüphanenin artık resmi olarak bir standart haline gelmesiydi. Böylelikle bilgisayar bilimlerinde karşımıza sıklıkla çıkan algoritmalar ve veri yapıları, baştan implement edilmeye gerek kalmadan rahatça kullanılabilecekti. Ayrıca Iterator (Yineleyici) adı verilen yapılar ile, bu veri yapıları üzerinde rahatça dolaşım yapılabilmekteydi. Aslında C++ dilini tam anlamıyla C’den farklı kılan temel özellikler bu standart ile eklenmişti.
C++98’e tek eklenen şey STL kütüphanesi değildi. Bunun yanında RTTI (Run-time Type Information, Run-time Type Identification) adı verilen mekanizma da oldukça ses getirmiştir. Bu mekanizmayı basitçe anlatacak olursak (C dili ile ilgili derslerin büyük bir kısmını bitirdiğinizi varsayıyorum); bir nesnenin türüne çalışma zamanında karar verilebilmesini sağlamaktaydı. Bunu da dynamic_cast ve typeid gibi yeni gelen anahtar kelimeler ile sağlamaktaydı. İleride çok daha detaylı bir biçimde göreceğimiz için daha fazlasını anlatmıyorum.
C++98 ile dile bool, mutable gibi ileride sıklıkla karşılaşacağımız anahtar kelimeler de eklenmiştir. Bunun yanında fonksiyonları türden bağımsız ve genelleştirilmiş bir biçimde tanımlamak için kullanılan Template (Şablon) tanımlamaları da bu standart ile dile eklenmiştir. Çok yakında bahsedeceğimiz yeni Girdi/Çıktı mekanizması yine bu standart ile gelmektedir. Yani C++’ın günümüzde de kullanılan birçok iskelet özelliği bu standart ile gelmektedir. Bu nedenle bu standardın tarihteki yeri büyüktür.
1999 yılında C++ standartlarının oluşturulmasında görev olan kişilerce geliştirilmeye başlanan Boost isimli kütüphane (veya kütüphaneler topluluğu da diyebiliriz), ileride yayınlanacak olan pek çok C++ standardı için önemli bir temel olmuştur. Bu kütüphanede sık kullanılan veya implementasyonu nadir bulunan veri yapıları ve algoritmalar ile; iletişim, fonksiyonel programlama, paralel programlama, hata yakalama, String işleme, bellek yönetimi ve daha pek çok başlık altında toplanan kütüphaneler bulunmaktadır. İleriki C++ standartlarına yeni eklenen özellikler bu kütüphanede önce kullanıma sunulup test edilmektedir desek yanlış olmaz. Bu nedenle C++’ın tarihi gelişiminde önemli bir yere sahiptir. Kütüphaneler hakkında detaylı bilgi edinmek için www.theboostcpplibraries.com adresine gidebilirsiniz.
2003 yılında ise C++98 standardının küçük bir revizyonu yayınlandı. Bu revizyondaki en önemli özellik ilk değer atama (value initialization) işlemlerine gelen yenilikler olmuştur. Bu revizyon C++03 standardı olarak bilinmektedir. Çok fazla köklü ve büyük değişiklikler yapılmasa da bu standart günümüzde hala çoğu sistemde varsayılan olarak kullanılmaktadır. Fakat artık yerini yavaş yavaş birazdan anlatacağımız standarda bırakmaktadır.
2003 yılından 2011 yılına kadar dil ile ilgili pekçok taslak hazırlansa da bunların hiçbiri standartlaştırılmamıştır. Boost kütüphanelerinde pek çok yenilikler yapılmış ve C99 ile değişen pek çok şey C++ ile de denenmeye başlanmıştır. Bütün bu çalışmaların sonucunda 2011 yılında C++11 adı altında bir standart yayınlanmıştır. Bu standart aslında C++ ile ilgili o ana kadar gelmiş geçmiş en fazla yeniliği barındırmaktaydı. Boost kütüphanelerinden gelen yenilikler başta olmak üzere dile pek çok farklı yaklaşım getirildi. Dildeki çeşitli mantık hataları giderildi ve daha soyut bir yapı elde edilmeye çalışıldı. Ayrıca bu standart ile STL kütüphanesine de pek çok yenilik getirilmiştir.
C++11 ile gelen yenilikleri şu aşamada ayrıntılı bir biçimde incelememiz pek bir anlam ifade etmeyecektir. Eğitim serisi boyunca zaten pek çok yerde bu yeni gelen özelliklere değinmeye çalışacağım. Hatta zaten C++ ile uğraşan ve bu yenilikleri merak eden kişiler için ayrı yazılar da yazabilirim. Bu arada 2009 yılında C++0X adında ara bir revizyon yayınlanmıştır. Bu revizyonda aslında C++11’e eklenen pek çok özellik bulunmaktadır. Eski derleyicilerde bazen C++11 ibaresini bulamazsanız bu standardı seçip yolunuza devam edebilirsiniz.
Şimdi biraz da yakın geçmişten bahsedelim. 2014 yılında yine ufak tefek değişiklikler ile C++14 isimli bir revizyon yayınlanmıştır. Bu revizyon ile dile farklı özelliklerin eklenmesinin yanı sıra, C++11 ile yapılmak istenenen, yazılan kodu türlerden mümkün olduğunca fazla soyutlama olayına dair yenilikler de getirilmiştir. Ayrıca multithreaded (çok iş parçacıklı) işlemler için çeşitli yeni özellikler ve veri yapıları dile eklenmiştir. Günümüz dünyasında bu tip konular diğer dillerde de popülerlik kazanmıştır ve C++’ın da bu konuları oldukça seri bir şekilde yakalayıp kendi bünyesine aldığını da söyleyebiliriz. Fakat ne yazık ki C++ diline hala C dili gözüyle bakılmakta ve bu gibi konuları içerdiği görmezden gelinmektedir.
2017 yılında yayınlanan C++17 standardı ile daha üst seviyeli işlemleri (dosya sistemleri, paralelleştirme vb.) daha az kod yazarak yapmak baz alınarak dile çeşitli yenilikler getirilmiştir. Ayrıca C11 standardı ile gelen özellikler de C++’a bu standart ile eklenmektedir. Bunun yanında dilde derleme zamanı ile ilgili iyileştirmeler yapan çeşitli yapılar bu standart ile gelmiştir. Günümüzdeki derleyicilerin hemen hemen hepsi C++17 standartlarını bünyesine katmıştır. Bununla birlikte geçmişte yazılmış olan C++ projeleri artık bu standardın özelliklerini baz alarak geliştirme yapmaktadır.
Şu anda ISO tarafından kabul edilen en son C++ standardı, Eylül 2020’de kabul edilmiş olan C++20 standardıdır. Bu standart ile C++’da Generic Programming konusunda çok geniş dil özellikleri getirilmiştir. Concept‘ler belki de bunların en önemlileridir. Bunun yanında yine derleme zamanına büyük katkı sağlayacak olan Module ve istenildiği zaman duraklatılabilen fonksiyonları temsil eden Coroutine gibi özellikler bu standart ile dile eklenmiştir. Günümüz derleyicileri henüz bu standardı tam olarak desteklemese de bununla ilgili yoğun bir çalışma vardır. Şu ana kadar anlattığımız standartların özetini şöyle bir tabloda verebiliriz:
Bu günlerde C++ ile ilgili çalışmalar hala devam etmektedir. Gerek Boost, gerekse de birçok farklı ve devasa kütüphenelere yeni özellikler ve fonksiyonlar eklenip test edilmektedir. Bu testler sonucu standartlaştırılmaya uygun görülen konular standartlar komitesine gönderilmektedir. Komite artık her 3 yılda bir standart yayınlama kararı almıştır. Bu nedenle şuan C++23 adıyla bilinen bir standart üzerinde çalışmalar yürütülmektedir. Buradan dile yeni eklenecek olan veya güncellenecek olan daha pek çok özelliğin bulunduğunu görebiliriz.
Bu yazıda C++ standartlarını basit ve fazla ayrıntıya girmeyecek şekilde anlatmaya çalıştım. Gördüğünüz gibi C++ sürekli kendini güncelleyen bir dildir. Kullanım alanı başlarda alt seviye sistemler için oldukça yaygın olsa da günümüzde kullanıcıya yakın sistemler için de oldukça uygun hale gelmektedir. Umarım bu yazı ile çoğu IDE (Integrated Development Environment) veya derleyicide karşınıza çıkacak olan C++ standartlarını ve her birinin ne anlama geldiğini düzgünce anlatabilmişimdir. Bir sonraki ve daha sonraki yazılarda artık C++ dili ile programlamaya geçiyoruz.
REFERANSLAR
- https://www.pilz.com/tr-TR/knowhow/law-standards-norms/standards/iso-iec-standards
- https://intweb.tse.org.tr/Standard/Standard/Kapak.aspx?081118051115108051104119110104055047105102120088111043113104073099066076067109105043076085103103
- https://4.bp.blogspot.com/-vyFmuzpHuCc/XEW5EVYbeZI/AAAAAAAAGdM/ypjcV1sadLU6XMP619CO7l3TVDA2hwyxQCLcBGAs/s1600/Normas.jpg
- https://www.modernescpp.com/images/blog/Cpp20/Overview/TimelineCpp.png




