Mikrokontrolör de C mi, C++ mı? Yoksa Java mı .net mi?

Kısa cevap: C++

Uzun cevap: Her ne kadar kötü tasarlanmış, gereksiz tekrarlar, okumayı zorlaştıran kuralları, kısır alt yapısı da olsa C kadar güçsüz, Java vb’leri kadar da müsrif olmadığı yaygın şekilde hemen her platformda varolduğu için C++.

Gereksiz bir tartışma gibi görünebilir, ancak bir projeye başladıktan sonra kolay değiştiremeyeceğiniz bir seçenek olduğu için önemsiz bir tartışma değil.

C++’a karşı olanların en büyük savunmaları C++’ın C’e oranla yavaş olmasıdır. C’ye eklenecek iki tane + bedava olmasa gerek..

Bu yazıda C++’ın ortalama bir programcının ürettiği C kodundan çoğu zaman daha hızlı, genel olarak da daha az kaynak kullandığını anlatacağım. Buna ek olarak C++’ın sağladığı olanaklarla yazılımcının işini kolaylaştırdığını örneklerle anlatmaya çalışacağım.

C++ Yavaş İddiası

Bu iddia şehir efsanelerinin çıkışına, insanın düşünüldüğünün aksine sağduyulu bir varlık olmaktan çok duygusal bir varlık olduğuna dair yüzlerce örnekten biri daha olabilir.

C++, C’den en büyük farkı denilince “nesne tabanlı programlama” (object oriented programming) akla geliyor, ama bu da aslına bakarsanız yanlış. Nesneye yönelik programlama deniliyorsa, C’de de bu yöntem sıklıkla kullanılıyor. “Hello World” ile C programlamaya başlayan herkes aslında C’ye nesneye yönelik programlamayla başlamıştır diyebiliriz. Her ne kadar “printf” ve türevleri dahil standard kütüphenelerinin tamamını kendi projelerimde kullanmasam da anlatımın kolaylığı açısından aşağıdaki örnekten devam edebiliriz:

printf("hello world!\n");

Yazdığınızda aslında şunu yazmış oluyorsunuz:

fprintf(stdout, "hello world!\n");

yani fprintf fonksiyonuna FILE* tipinde stdout nesenesini vererek, “hello world!\n” metnini ona yazmasını istemiş olursunuz. Fonksiyonları bu şekilde tasarlamanın avantajı aynı fonksiyonları farklı hedeflere yazarken de kullanabilmenizdir. Ortak özellikte farklı hedefler için tekrar bir emek harcamazsınız, hata düzeltmelere gerek duymazsınız. Bir nevi gelecekteki geliştiricilere miras bırakmış olursunuz.

fprintf nasıl yazacağını nasıl bilebilir?

fprintf’i kodlayan geliştirici amatörse fprintf neye yazacağını bilir, geliştirici usta ise yazım işini kime devredeceğini FILE*’in gösterdiği stdout’un içinde tutar. Geliştirici ne yaptığını bilen biri ise stdout’un içinde onunla neler yapabileceğine dair bir listenin adresini tutar.. fp fprintf’e aktarılan argüman olsun, fprintf’in içinde aşağıdakine benzer şeyler görürüz:

Amatör:

if (fp->type == 0)
{
  // write to console
}
else
{
  // write to file
}

Amatör o anda ortaya çıkan bir farklılığı çözmek için if ifadesiyle saldırır. Daha önce ekrana yazı yazan fonksiyonun dosyaya da yazabilmesi istenmiştir. Amatör dosya/ekran ayrımını fp’nin gösterdiği struct’a tutarak çözer.

Usta:

fp->writeChar(..);

Usta amatörün aksine ekrana yazan fonksiyona, dosyaya da yazma talebi geleceğini bilir, hatta yeni eklentilerle belki seri porta, ardından sokete yazma ihtiyacı doğacağını görür ve o işlemlerdeki farklılıkları kolay işleyebilmek için fp’nin gösterdiği struct’ın içine farklılılaşan fonksiyonların adreslerini koyar.

Guru:

fp->vmt->writeChar(fp, ..);

Guru da usta gibi fonksiyonların farklılaşacağını bilir. Ancak farklılaşan fonksiyonları tekrar tekrar verileri tuttuğu struct’ın içine yazmaktansa, o fonksiyonların listesini bir dizide tutup, dizinin adresini struct’a yazar. Guru müsrif değildir.

Bunun C++’la ilgisi nedir?

Programcılık yanlış yapılıyorsa aynı şeyi tekrar etmeyi içerir. Doğru yapılıyorsa tekrar işlemi yazılıma devredilir. C++ bu tür benzer tipte ama farklılaşan işlerde Guru seviyesinde yardımcı olur.