Öncelikte tüm mesajları okuyamadığım için özür diliyorum. Sevdiğim bir katılımcı kardeşimin mesajına bakmak için girmişken konuyu gördüm. Sadece kendi fikrimce sorularına cevap vermeye çalışacağım.
Yaptığım tespitler kesinlikle mutlak doğru değil kişisel kanaatlerimden ibarettir. Bu nedenle aynı fikirde olmamanıza, itiraz etmenize saygı duyarım.
Bir çok konu bir arada olduğundan uzatırsam özür dilerim. Olabildiğince kısa tutmaya çalışacağım.
Python da güzel kullanışlı bir dildir, dolaylı olarak yürütülebilir ikili dosyaya dönüştürülebilir. Bu bir kenarda aklımızda dursun.
Neden C ve/veya C++ tavsiye edilir.
Basit, programları işletim sistemleri üzerinde çalıştırıyoruz. İşletim sistemleri de dokümantasyonunu çoğunlukla C dili üzerinden yapıyor (du). Yani işletim sistemi yeteneklerinden faydalanmak istediğimizde açıp dokümandan ilgili API’yi çağıracağımız parametre ve fonksiyonları alabiliyor ve doğrudan kodumuza aktarabiliyoruz.
Ama bu bir zorunluluk değil, aynı API leri bir dönem ihtiyaç duyduğumda Delphi dili için çevirerek kullanabileceğimi ve en az C performansında çalıştırabildiğimi gördüğümde bunu bir zorunluluk olmadığını anlayabildim.
Ve fakat bu dönüşümleri hazır yapan kütüphaneler de olmasına rağmen bazan kendimi rahat hissedemediğimden C ile çalışmaya döndüğüm oldu.
Yazılımla ilgilendiğim günden beri, hangi dil iyi yada hangisi performanslı kavgasının bittiğini görmedim. Göreceğimi de sanmıyorum.
Bu nedenle hangi dil dendiğinde hepsi derim. Yani çatalın görevi ayrı kaşığın görevi ayrı bıçağın görevi ap ayrı. Ama zorda kalırsan çatalın kenarını bıçak gibi, bıçağın yan tarafını kaşık gibi kullanabilirsin. Yani güçlü ve güçsüz olduğu yönleri var ama bu çok da sınırlayıcı güçsüzlükler diyemem.
C ve C++ öğrenmenin şu faydalarını göreceksiniz, Python, C#, java gibi aklınıza gelebilecek dilin yazım şeklinin (syntax) aşağı yukarı aynı olduğunu, ama anahtar kelimelerinin (keywords) farklı olabileceğini. Bu nedenle bunlara dil mi demek gerekir aynı dilin lehçeleri mi demek gerekir tekrar düşünmek gerekir (Bu benim teorim).
Yani C ve C++ ile ilgili çalışan biri, diğer bir çok dili okuyup kodun ne yapmak istediğini anlayabilir.
BASIC veya PASCAL gibi dillerin yazımı oldukça farklıdır. Bunlara ayrı diller demeyi tercih edebilirim. Yani küme parantezi arasına kod yazılan bir dil ile begin end kelimelerinin arasına kod yazılan bir dilin bir birine yakın olduğu söylenemezken, C,C#, Python, java gibi bir çok dil aşağı yukarı aynı şekilde yazılır/kodlanır.
Buraya kadar soruların bir kısmını cevapladığımı düşünüyorum. Konu performans olunca kavga kıyamet kopar zaten asıl benim dilim hızlı hayır onun dili yavaş.
Öncelikle şurada anlaşalım. Bilgisayarın anladığı tek dil 1 ve 0 ve sonuçta her şey 1 ve 0 a dönüştürülür. Burada diller sadece bizim anlamamız için. Anladığımızı 1 ve 0 a çeviren yazılımlar derleyiciler (compiler) ve bağlayıcılar (linker) lardır.
Bu durumda C ve C++ öğrenmenin faydalarında hemfikirsek, ikinci tavsiyem. Derleyici (IDE konusuna girmiyorum, aslında IDE nin derleyici dışındaki tüm diğer ayarlarını da öğrenin.) öğrenin. Derleyiciler sadece içine kod yazılan editörü bulunan run deyince kodda hata varsa gösteren yoksa çalıştıran yazılımlar değildir. Derleyicilerinizin ayarları size bir çok seçenek sunar derleme ve bağlama aşamalarının hangi şekilde yapılacağını ayarlayarak, optimizasyon seçeneklerini düzenleyerek herhangi bir dili başka bir dilden daha hızlı gösterebilirsiniz. Yani derleyicinizde compile like C seçeneği varsa C gibi derleyebilir dahi. Sonuçta sizin nasıl kodladığınız değil kodun nasıl 1 ve 0 lara dönüştürüldüğü önemli dediğimi hatırlatıyorum.
Bu nedenle dillerin hız ve performans verilerine çok takılmayın. Bir çok derleyici inline assembler denilen, satır içi assembly kodu girmenize bile olanak sağlayan özellikler barındırdığından, kullandığınız dilin içine assembly kodu gömerek dahi farklar yaratabilirsiniz.
En iyi dile harici dinamik kütüphaneler kullandırarak, en yavaş denilen dile inline kodlar ekleyerek hızlıyı yavaş yavaşı hızlı gösterebilirsiniz. Çatal kaşık bıçak örneğindeki gibi o kadar farklı yaklaşımları vardır ki, hıza göre sıralayacaksanız yaklaşımları modifiye etmeniz gerekir. Bıçağa çorba içirip, çatala et kestirirseniz hız konusunda beklediğinizi alamazsınız.
Burada size iki hap verirler kırmızı hapı ve mavi hapı. Mavi hapı alıp matrix te mutlu mesut yaşayabilirsiniz.
Kırmızı hap matrix ten çıkışa götürür.
Görecekleriniz artık hoşunuza gitmeyecektir.
Mavi hapı yutanlar, yüksek seviye diye sınıflandırılan (Bu sınıflandırmaya katılmıyorum ama ayrı bir yazı konusu olacak kadar uzun) dillere yönelmelidirler. Bu diller tip kontrolü yaptıkları için atama hataları, bellek taşmaları gibi derlteri olmadan zengin kütüphaneleri ile mutlu mesut yaşarlar (İstisnası derleyici hatalarından dolayı benzer sorunlar nadiren oluşur kullanıcı elinde olmadığından bir sonraki güncellemede ortadan kaldırılır) Nadiren, sınırlara yaklaşmaları gerektiğinden mutlu mesut yaşamlarına devam edebilirler.
İstisnai durumlarda bazı müdahaleleri yapamadıklarını hisseder bu durumda ancak bir alt seviye dillere geçerler. Mesela hazır bir string değişkeninin sınırına takıldıklarında bunu genişletebilecek imkanları olmadığını farkettiklerinde artık kendi string sınırlarını ayarlayabilecekleri bir dil aramaya başlayabilirler. Yada hiç kafa yormayıp bunu kendileri için hazır eden bir başkasını kodunu kullanabilirler. Yadırgamam saygı duyarım. Bazen projenin çapına göre kafa yormak istemediğimde yada asıl amacım başka olan kodları hızlıca test etmek istediğimde bu mavi hap tarafında dilleri kullanırım.
Gelelim kırmızı hapı tercih edenlere… (aslında her cümlede üç nokta kullanırdım gece yarısı bitkin ve kafam başka konularla meşgul olduğundan bu şekilde bir tek üç satırla yetineceğim.)
Kırmızı hapı yutanlar, dikey bir öğrenme çizgisine girerler. Çok öğrenir hiç ilerlemediklerini görürler, çünkü burada her şey serbesttir ve her şeyi sizin düşünüp kontrol etmeniz gerekir.Matrix teki gibi düştüğünüzde yeniden kalkamayabilirsiniz. Gerçekten ölebilirsiniz.
Hangi bellek adresine zıpladığınıza (jump) hangi işaretçileri kullandığınıza (Pointer) hangi yığın adreslerine baktığınıza emin olmanız gerekir.
Bunları bilerek yaparsanız, sınırlı güvenli yüksek seviyeli dillerin sınırlamalarının hepsi sizin için kalkmıştır. Artık verileri byte byte değil bit bit işleyebilirsiniz, string sınırlarınız, donanımsal belleğinizle sınırlı olabilir.
Bunları yapabilmeyi öğrenmekle, donanımın nasıl çalıştığını anlamaya başlarsınız, işletim sisteminizin nasıl çalıştığını kavrar, sık gerekmese de ihtiyaç olduğunda başkalarının yapamadığı yeni özelliklerine kolayca erişebilirsiniz.
Bunu şuna benzetebiliriz, kimi tuğla alıp binasını yapmayı tercih eder uymayan tuğlayı kırar, kimi ise tuğla yapmayı da öğrenmiştir ve istediği boyda tuğlalar üreterek kırmadan kullanabilir. İşte C ve Assembly gibi dillere geçtikçe kendi istediğiniz boyda tuğlalar üretebilecek hale gelmişsiniz demektir.
Ülkede hoşlanmadığım bir özellik vardır. Bir şeyin standart ve olağan halini öğrenmeden, olağan dışı veya extrem diyebilecek özelliklerini konuşmayı tercih ederler. Yani her türlü algoritmayı sindirmiş, yapısal programlamayı kavramış her şeyin sınırlarında kodlarda yetersiz kalmış OOP konuşmaya başlamışlar durumu bana komik geliyor (Şahsi kanaatim alınmaca yok.)
Dönüp yazdığınız kodalara bakın iki bin üç bin satırın üzerine kaç defa çıktınız ki tasarlama yada okuma sorunu yaşadınız da nesneye yönelik programlama ihtiyacı duydunuz desem bilmem burada bir kaç kişi dışında gerçekten sayıca fazla kişi çıkar mı?
Nesneye yönelik programlama kötü değildir, ama iyi de değildir. Aynı C öğrenme eğrisi gibi dik bir hale gelebilir. Ama öğrendiğinize değer mi tartışmaya açık. Aslında daha önce bir yerlerde rastlamış olabilirsiniz:
Amazon.com: C++ Gotchas: Avoiding Common Problems in Coding and Design: 9780321125187: Dewhurst, Stephen C.: Books
C++ dilinde bir nesne türetiyoruz ve sonra bunu mu yapar bunu mu yapar diye kafa yoruyoruz. Göreceksiniz ki gerçekten C++ da tam bir nesneye yönelik dil değil. Operatör atama, öncelikler çağırma sekansları derleyicilerin dahi kafasını karıştırabiliyor.
Nesneye yönelik programlama anlatmayı düşünmüyorum. Kapsülleme, polimorfizm (Türkçe çok şekillik demek yerine elastikiyeet desem daha Türkçe olur mu bilemediğimden olduğu gibi kullandım.) Gibi konular sayfalarca yazı bulabilirsiniz. Malum extrem olunca konuşanı çok ama bazan basit bir algoritma için bir satır açıklama yada konuşanı bulamazsınız.
Nasıl gerekti neden OOP öğrenmek zorunda kaldım. Windows işletim sisteminde saf windows c kodu yazmaya çalıştığım bir dönemde ( Şaşırmayın, windows 3.1 bir işletim sisteminde küçük ve çok yer kaplamayan bir kod yazmanız gerektiğinde olabildiğince windows API’si çağırmanız gerekiyor ve hazır kütüphaneler yerine kendi kodlarınızda pencere ve butonlar oluşturmanız gerekiyor ki küçük bir kodunuz olsun.) basit bir windos penceresi oluşturmak için bir çok yapı oluşturmam gerektiği, bazı callback fonskiyonlar tanımlamam bazı değişken ve yapılara ilk değerler atamam gerektiğini gördüm. Yani oluşturduğunuz pencerenin simge durumuna küçült butonunu bile sizin atamanız ve tanımlamanız gerekiyor. Ve arayüzü oluşturmak için verdiğim mücadele sırasında sayısız alt pencere buton ve diğer bileşenleri tek tek C kodunda tanımladığımda bunun daha kolay bir yolunun olması gerektiğine ikna oldum. İsteyen deneyebilir.
İnanmayan:
https://www.youtube.com/watch?v=6JJ8e5IZ8S4
Buradan deneyebilir.
Bununla sadece bir pencere oluşturabilirsiniz düşünün birden fazla buton ve pencere bileşenleriyle çalıştığınızda başınıza neler gelebileceğini.
Bu arada ufak not, video linkindeki koddaki class kavramının OOP ile alakası yoktur, windows kendi pencere oluşturma yapılarına class demeyi tercih etmiştir bu talihsiz tesadüf kafanızı karıştırmasın, kod tamamen c kodudur.
O kadar çok bileşen arasında kaybolduğunuzda, keşke fonksiyon gruplarını, yapıları, değişkenleri, ilk değer atamalarını bir seferde tanımlayabileceğim bir yapı olsa demeye başlarsınız.
Bu yapı ve kolaylık OOP ile sağlanır. Bir pencere oluşturmakla bir buton oluşturmak için aşağı yukarı aynı şeyleri yaptığınızı gördüğünüzde bunları değiştirip miras alarak polimorfizmin de ne olduğunu anlamaya başlarsınız.
Bu kadar uzun neden anlattım. Bazen kompakt küçük bir kod yazmak için OOP yerine kendiniz yazıp derlenmiş halini küçük tutmak isterken bazen proje büyüklüğünden kafa karışıklığı oluşmaması hızlı kodlama ve yer sıkıntısı olmamasından OOP seçebilirsiniz.
Bu birini diğerine üstün yapmadı iki seçenek sundu size. OOP mavi hap, saf C kodu ise C kodu.
Bu noktada yine kırmızı hapı seçenler artık OOP diye bir şey olmadığını kaşığı eğemeyeceklerini zihninde bu işi yaptıklarını öğrenmek zorunda kaldı. Yani teorik olarak fiilen böyle olmasada olan şey şu. Nasıl değişkenleri data segmentinde, fonksiyonları kod segmentinde tutuyorsa bellekte bilgiysayar bu sefer fonksiyonları da data segmentinde değişken gibi hayal edip, pointerlar aracılığıyla ilgili kodlara zıplayan işaretçi tabloları kullanıyor. Karışık oldu biliyorum ama kırmızı hapı yutanlar zamanla anlayacak.
Yani isterseniz bu kavramlarla C kodu ile de nesneye yönelik programlama yapabilisiniz (iddialı oldu biliyorum derleyici kısıtları var ama işaretçi tabloları üzerinden benzer yeteneklere sahip tanımlamalar yapabileceğinizi zorlarsanız çok daha farklı yetenekler kazanabileceğinizi göreceksiniz. İddialaşmayın şu ana kadar yapılamaz denilen ne varsa C de bir yolunun olduğunu gördüm. Hala ikna olmadıysanız herşeyin 1 ve 0 a dönüştürüldüğün ve hatta #define bildirimiyle mucizeler yaratıldığını gördüğümü de söyleyebilirim.) Ama C++ a tam anlamıyla nesneye yönelik bir dil değildir demişken C bunu tam hakkıyla yapar diyemem.
OOP adını duydunuz ve ihtiyacınız olduğunu anlamadıysanız muhtemelen henüz ihtiyacınız yok demektir. Ama OOP kavramak için kendinizi yorarken asıl diller konusunu ıskalayabileceğinizden çok da takılmamanızı tavsiye ederim.
Ufaktan delphi ye değinip geçeyim. Object pascal diye başlayıp kendini sürükle bırak mantığında bileşen ekleyecek kadar geliştiren bir dil. Bir çok nesne ile size kolaylık sağlar. Bazan arayüz derdi ile uğraşmak istemediğimde kodu denemek için kullandığımı belirtmiştim. Gerçekten de sürükle bırak formlarla çabucak arayüz oluşur size de bu bileşenlerin üzerine tıklayıp eventlerin içine ilgili kodu yazıp denemek kalır. Tadına bir bakın derim. Begin endlere boğulmadan eğlenemezsiniz.
Ama OPP anlamak için size oldukça güzel bir yol sunacaktır. C ve C++ ailesinin acılarını yaşamadan OOP deneyimi için delphi birebirdir. Neden tutmadı bu dil derseniz, ben çok üzüldüm aslında eli öpülesi dillerdendir türediği pascal.
Yeterince OOP konuştuğumu düşünüyorum.
Gelelim oyun geliştirme mevzuuna…
Aynı nedenle C ve C++ tercih edilir. Çünkü OpenGL de eski adı directX yeni adını takip edemediğim embeded durumdaki grafik arayüzü dokümantasyonlarının tamamı C dilindedir. Böyle olunca da bir çok kişi olduğu gibi referans kodları kullanır ve oyunları bununla yazar…
Bir hayır sahibi bu kodları diğer dillere çevirdiğinde onlar da kendi çapında performans sergilerler.
https://edn.embarcadero.com/article/26401
Not: Bazan servis cevap vermeye biliyor yukardaki link çalışmazsa google cache’inden bakabilirsiniz.
https://webcache.googleusercontent.com/search?q=cache:9MfGhTv2I5sJ:https://edn.embarcadero.com/article/26401+&cd=1&hl=tr&ct=clnk&gl=tr
Bir çok dilde performanslı kodlar yazabilirsiniz. Hatta. WebGL diye aratıp…
Web browser üzerinde html kodu ile mucizeler yaratıldığını görebilirsiniz…
https://webglsamples.org/aquarium/aquarium.html
Yani asıl işi işletim sistemi üzerinden yaptığınızda işletim sistemi ile iletişiminiz düzgün bir dilse oyun programlama da bir çok iş için gayet iyidir.
Burada tekraren özetleyeyim kısaca sonra da yazıya son vereyim.
Hangidili öğreneyim? Hepsini.
C /C++ öğrenmenin faydası ne? Diğer lehçeleri , işletim sistemlerini kolayca kavrayabilir diller arasında geçebilir hale gelirsin.
OOP önemli mi? Evet ve Hayır. İhtiyacın olduğunda ihtiyacın olur.
Hangisi hızlı? Hepsi düzgün ayarlar doğru yerde kullanırsan. Bazan hızlı kodlama, bazan az yer kaplama bazan hızlı çalışma gibi farklı özellikler gerekebilir. Çatal mı kaşık mı diye sorma çatal, kaşık, bıçak her birini ayrı ayrı kullanmayı öğren zaten ilerledikçe, tatlı çatalı ve tatlı bıçağı gibi alt ihtiyaçlarını da farkedeceksin.
Şu treni de kaçırmayın derim.
Kod yazmak zorunda değilsiniz.
Kodları görsel olarak sürükleyip bırakarak da kodlama yapılabiliyor.
https://www.postscapes.com/iot-visual-programming-tools/
Her ne kadar eskiden bizim görsel programlamadan anladığımız farklı olsa da bu kavram artık bu anlamda kullanılıyor.
Yani artık kodunuzu yazmak yerine kodunuzu çizmek gerekebilir.
Ve çok uzadı son nacizane tavsiyelerim:
Hangi dil? Hangisi hızlı? Hangisi iyi kavgalarından uzak durun. Henüz biten bir tartışma görmedim çünkü.
Bu kadar yazıyı sabırla okuyanlara kolaylıklar diliyorum. Uzamasın diye kırptığım yazmadığım atladığım hususlar oldu. Varsa yanlış anlaşılan kısımlar ihtiyaç olursa açıklamak üzere ara veriyorum.
Kendime not: Çok fazla yazım hatası var en kısa sürede elden geçirmem gerekiyor.