Bir yerden başlamak isteyen fakat nerden başlaması gerektiğine henüz karar verememiş arkadaşlardan sitemi yayına aldığımdan beri email almaktayım. Paf takımada sürekli, yeni, genç arkadaşlarımızın katıldığını düşünürsek giriş yapmak isteyen ama nerden başlayacağını bilemeyen sürekli bir kesim olacak. Bu yazıyı yazmamın amacı da detaya girmeden bilgim dahilinde örnekler vererek yeni arkadaşlarımızın kendi kararlarını doğru bir şekilde vermelerine yardımcı olabilmektir.
Programlama Dili Nedir?
Programlama dili bir makinaya belli bir algoritma dahilinde nasıl çalışması gerektiğini, hangi verileri saklayıp hangilerini işlemesini istediğimizi anlatmamıza yarıyan kendine göre kuralları olan üretilmiş bir yapıdır. Burda makinadan kasıt bilgisayar olabileceği gibi evinizdeki buzdolabıda olabilir. Anlatılmak istenen kodları çalıştıracak mikroişlemcisi/mikrodenetleyicisi olan bir donanımdır. İnsan dili gibi doğal değildir. Üretilmiştir ve ifadeler sınırlıdır. Algoritma bir problemi çözmek için tasarlanan, belli girdilere ve şartlara göre ilerleyen bir başlangıcı ve sonu olan yoldur.
Bilgisayar tarihi boyunca binlerce programlama dili geliştirilmiştir. Bunlardan büyük bir çoğunluğu tutunamayıp yok olmuş bazıları ise benimsenip onlarca seneden beri hala daha kullanılmaktadır.Bunlardan bazıları devletin, askerin sistemlerinde özel alanlarda çalışırken bazıları ise insanlığa mal olmuş çok geniş bir uygulama alanı bulmuştur. Yazımda genel olarak herkesin kullanabileceği programlama dillerine değinmeye çalışacağım.
Programlama dillerini makine seviyesi, alt seviye, orta seviye, üst seviye çeklinde sınıflandırabiliriz. Makine seviyesi dilleri bizim anlamamız pek mümkün değildir. Üst seviye dillerden belli bir kurala göre oluşturulmuş sayılardan oluşmaktadırlar. Bir programlayıcı vasıtasıyla hedef mikroişlemciye/mikrodenetleyiciye yüklenip direk olarak çalışmaya başlayabilirler. Bunlardan en popüleri Intel Hex'tir. Intel firmasının zamanında geliştirdiği hexadecimal yani 16 lık sayı sisteminde hazırlanmış bir dosyadır. İsmi burdan gelmektedir. Hedef platforma göre oluşturulmaktadır. Hedef platformdan kastım şuan bu yazıyı okuduğunuz bilgisayarınızın i7, pentium vs işlemcisinden cep telefonunuzun ARM mikrodenetleyicisine, LED yakıp söndürdüğünüz PIC mikronedetleyicinize kadar geniş bir alan olabilir. Aşağıda paylaştığım Intel HEX formatındaki bir dosyayı gördüğünüz gibi anlamaya çalışmanız pek mümkün değil ve anlamsızdır.
Assembly
Assembly dili alt seviye programlama dillerinin başında gelir. Sayısal makine dillerine nazaran insanın daha rahat okuyabileceği harflerden, ifadelerden oluşan bir komut setidir. Örneğin en çok kullanılan assembly komutlarından MOV İngilizce taşı anlamına gelen move kelimesinin, LODSB komutu LOad String Byte ifadesinin, IRET komutu RETurn from Interrupt ifadesinin kısaltmasından oluşturulmuştur. Fark ettiğiniz üzere komutlar ifadelerin baş haflerinin kısaltması olduğundan daha akılda kalıcı ve okunabilirdir. Assembly ile yazılan programlar bir Assembler (çevirici) vasıtasıyla makina diline çevrilmektedir. Çevrim işlemi bire bir ve satır satır yapılmaktadır. Sonuç olarak yukarda gördüğünüz Intel HEX dosyası gibi bir dosyanız olacaktır. Assembly komutları ve Assembler hedef platform ile doğrudan bağlantılı olduğundan büyük değişiklikler göstermektedir. Örneğin bilgisayarımız için 100den fazla assembly komutu varken 8 bitlik modern bir mikrodenetleyici için bu sayı 30 civarıdır. Aynı şekilde ikisi için kullanılan assembler farklıdır. Makine diline dönüştürmeyi birebir yaptığı için assembly dilinde yazdığınız kodlar daha hızlı çalışır ve kod hafızasında daha az yer kaplarlar. Ama kod yazması yinede zahmetlidir.
FORTRAN
1954 yıllarında IBM ürünleri için John Backus isimli bir yazılımcı ve ekibi tarafından geliştirilmeye başlanmıştır. Dilin ismi o dönem yazılan "The IBM Mathematical FORmula TRANSlating" isimli raporda geçen kelimelerden FORTRAN olarak koyulmuştur. İlk çıkış amacı matematiksel ve bilimsel hesaplamaları bilgisayarlara daha efektif yaptırabilmektir. Orta seviye programla dilleri grubuna girer. Oluşturulmaya başlandığı dönemde alt seviye makina dilinde programlama yapmak zor olduğu için hızlı uygulama geliştirmek isteyen firma ve mühendisler daha üst seviye dillerde programlama yapmaya çalışıyorlar fakat o dönemde derleyici mantığı olmadığı için yazılan kodlar bir yorumlayıcı tarafından kod çalışma esnasında yorumlanarak işletiliyordu. Buda zaten o dönem yavaş olan bilgisayarların iyice yavaş çalışmasına sebep oluyordu. FORTRAN ile Backus ve ekibi ilk defa o dönem üst seviye sayılan bir dil için derleyici mantığını ortaya koymuştur. Böylece yazılan program çalışma esnasından önce bir derleyici vasıtasıyla makine diline derlenmekte ve makine kodu olarak çalıştırılmaktadır. Buda üst seviye kodlama yapıldığından daha hızlı kodlama imkanı ve kodun makine diline çevrilmesinden dolayı makinelerde daha hızlı çalışmasını sağlamaktadır. FORTRAN daha sonraları standartlaştırılmış ve günümüze kadar gelmiştir. günümüzde popüler olmasada bazı üniversitelerin mühendislik bölümlerinde hala gösterilmektedir. Kendisinden sonra çıkacak olan Basic ve C gibi programlama dillerini epey etkisinde bırakmıştır. Özel bir alanda kullanmayacaksanız yeni başlayanlara önermiyorum.
Basic
Basic programlama dili 1964 yılında John George Kemeny ve Thomas Eugene Kurtz tarafından oluşturulmuştur. Öğrenmesi kolay üst seviye bir programlama dilidir. Basic dili, bu dili bilmeyen ama İngilizce bilen bir kişinin anlayabileceği kadar sade ve algoritmaya çok yakındır. Bu kadar kolay olmasından dolayı oluşturulduğu tarihten itibaren bir çok türevi çıkmıştır. Microsoft'un da benimseyip derlenebilen Quick Basic versiyonunu geliştirmesi sonucu epey popülerleşmiştir. Özellikle amatör ve hobiciler tarafından benimsenmiştir. Yazılan kodlar derleyici vasıtasıyla FORTRANda olduğu gibi makine diline çevrilmekte ve hızlı çalışmaktadır.
Benim yorumum herkesin bu dili en azından temel/orta seviye bilmesi gerektiği yönündedir. En basitinden Microsoft Ofis ürünlerine bile entegre olduğundan bu programlarda makro yazmada, çeşitli hesaplamalar yaptırmada, kullanıcı seçimlerine göre değişen dinamik dökümanlar oluşturmada kolaylık sağlar. Donanımdan uzak bir yazılımcıysanız ama ufak donanım işleriniz oluyorsa PIC Basic gibi türevleri ile az bir ek bilgi ile mikrodenetleyici programlayıp kullanabilirsiniz. Söz dizimi basit olduğundan ilkokul çağındaki çocukların algoritma geliştirme becerilerinin arttırılması için öğretilebilir. Benimde programlama alanındaki ilk deneyimim Basic ile olmuştu. Bu kadar basit olmasına karşın büyük firmalar tarafından profesyonel işler içinde kullanılabilmektedir.
Bana göre derleme esnasında verimsiz makina kodları üretmektedir. Bunun sonucunda da yoğun ve tekrarlayan işlemler yaparken programın çalışma performansı ciddi seviyelerde düşebilmektedir. Bazı noktalarda ise dil yetersiz kalmakta istediğiniz işi programa yaptırabilmek için uyguladığınız çözümler performansı düşürebilmektedir. Özellikle direk hafızaya erişim, pointer dinamik bellek yönetimi gibi alanlarda yetersizdir. Günümüzde alternatif daha performanslı programlama dilleri varken yeni başlayan mühendis adayları ve üzeri için anadiliniz olarak Basic tavsiye etmem. Ama az yukarda dediğim gibi en azından temel seviye okuyup yazabilin.
C
Üniversitelerin sayısal bölümlerinden mezun her bireyin ister temel ister ileri seviye bir şekilde C veya C++ bilmesi gerektiğine inanıyorum. Programlamanın ötesinde algoritma kurma, karar alma ve disiplinli çalışabilmek içinde kişiyi geliştirdiğine inanıyorum.
C programlama dili orta seviye dil grubuna giren, derlenebilen, yüksek performanslı ve çok esnek bir programlama dilidir. C dili ile herhangi bir sınırlama olmaksızın donanıma veya hafızaya tamamen hükmedebilirsiniz. 1960'lı yılların sonuna doğru Ken Thompson ve Dennis Ritchie tarafından UNIX işletim sistemini geliştirebilmek için kodlanmış ve 1969 yılında ilk sürümü resmi olarak yayınlanmıştır. Çıktığı zamandan bu yana (neredeyse 50 yıl olacak) popülerliği gittikçe artan ve aranan bil dil olmuştur. Resmi bir belge yok ama günümüzde en çok kullanılan programlama dili olabileceğini düşünüyorum. Söz dizimi olarak kendinden sonra çıkan bir çok popüler dili etkisi altında bırakmıştır. Dil popülerleşmeye başlayınca 1989 yılında ANSI tarafından standartlaştırışdı ve bu standart C89 olarak ifade edilmeye başlandı. İlerleyen dönem boyunca gelişen diğer dillerinde etkisinde kaldı ve bu sefer 1999 yılında ISO tarafından C99 adıyla minik eklentiler yapılarak tekrar standartlaştırıldı. Bu standartlaştırmalar sonucu günümüzde kullandığımız modern işletim sistemlerinin büyük bir çoğunluğu sağladığı performans dolayısıyla C ve C++ dillerini kullanarak yazılmıştır.
C89 (ANSI) standartına uyarak kodlama yaparsanız yazdığınız kod standartı uygulayan tüm platformlar arasında taşınabilir hale gelmektedir. Hemen hemen tüm C derleyicileri C89 standartını desteklemekte, yazdığınız kodu hiç bir değişiklik yapmadan hedef platformun işlemcisine göre derlemektedir. Örneğin bilgisayarınız için yazdığınız bir fonksiyonu aynı şekilde oyuncağınızda kullandığınız 8 bitlik basit bir mikrodenetleyicide kullanabilirsiniz. Bu size yüksek oranda kod taşıma esnekliği, dolayısıyla aynı kodları tekrar yazmadığınız için zaman kazandıracaktır. C dili performanslıdır, özel noktalarda daha fazla performans istenirse programcıya C koduna assembly kodları ekleme olanağı sunar.
En çok e-mail aldığım konulardan bir tanesini de burda belirtmek istiyorum. Standart olmayan kütüphane ve fonksiyonlar sadece ilgili platformda çalışacaktır. Örneğin PIC programlayabilmek için CCS firmasının çıkarttığı PICC ile yazdığınız bir kod ANSI standartlarını birebir uygulamadığı için PICC derleyicisinde çalışacak fakat Microchipin derleyicisinde çalışmayacaktır. PIC serisi mikrodenetleyiciler ile uğraşan, başlangıç yapmak isteyen arkadaşlar bu huhusa dikkat etmelidir.
C dilinin günümüzde eksik kalan taraflarıda yok değil. Yazdığınız kodlar makine diline çevrilen derleme esnasında hata vermesede makine üzerinde çalışma esnasında başınızı ağrıtabilir. Bu duruma çalışma zamanı hatası (runtime error) denilmektedir. Örneğin bir sayıyı 0'a böldüğünüzde, hafızanın belli bir adresine ulaşmak istediğinizde derleme esnasında hata almassınız. Derlenen programı çalıştırdığınız anda beklenmedik durumlar ile karşılaşabilirsiniz. Bilgisayarda kodlama yapıyorsanız işletim sisteminiz yanlış adres ataması/erişimi sonucu programınıza ayrılan alanın dışına çıkmaya çalıştığınızı fark edip veya bir sayıyı 0'a bölmeye çalıştığınızı farkedip uygulamanızı kapatabilir.Örnekleri çoğaltmak mümkündür.Mikrodenetleyiciler ile kodlama yapıyorsanız donanımınız olmadık bir yerde kitlenebilir. Bu özel durumlar anında programınız bir makinayı kontrol ediyorsa sıkıntılar yaşayabilirsiniz. Ama bilinçli bir programcı iseniz, hataları ortaya çıkmadan aldığınız önlemler ile engelleyebilirsiniz.
Birçok üniversitenin bir çok bölümünde C veya C++ öğretilmektedir. Sonuç olarak C dilini özellikle donanım işiyle uğraşıyorsanız şiddetle tavsiye ederim.
C++
C++ 1979 yılında Bjarne Stroustrup tarafından geliştirilmeye başlanmıştır. C dili temel alınarak bunun üzerine o dönemlerde yaygınlaşmaya başlayan nesne yönelimli programlama mantığı oturtulmaya çalışılmıştır. C++ dili C dilini kapsayacak şekilde oluşturulmuştur. C dilinde çalışan her program C++ ta da çalışmaktadır ama tersi geçerli değildir. Nesne yönelimli programlama ile C++ yeni kabiliyetler kazanmıştır. Söz dizimi güncellenmiş, sınıf yapısı eklenmiş, yeni anahtar kelimeler eklenmiştir. Bellek yönetimi güçlendirilmiştir. Yazılan kodlar derleyici vasıtasıyla makine diline çevrilir. Orta seviye bir dildir.
C++ sağlamış olduğu sınıf yapısı sayesinde aynı kodlar ve sınıflar tekrar tekrar kullanıldığı için kod yazma zamanı ve maliyeti düşmüş ve sağlamış olduğu yüksek performanslı yapısı sayesinde bir çok programcı tarafından benimsenmiştir. Yıllar içerisinde gelişerek standartlaşmıştır. Microsoft Windows işletim sistemlerinin temelleri performanslı oluşundan dolayı C++ ve C ile yazılmıştır. Microsoftun 1993 yılında Visual C++ isimli IDE sini (entegre geliştirme ortamı) çıkarması sonrası popüleritesi iyice artmıştır. C++ ile beraber gelen bazı kabiliyetler C dilini etkisi altında bırakmış C99 standartının oluşmasını sağlamıştır. Kendisinden sonra gelecek olan nesne yönelimli programlama dillerinin en popülerleri olan Java ve C#'ı büyük ölçüde etkisi altında bırakmıştır. Bana göre C++ dilinin olumsuz diyebileceğim tarafları C deki gibi kod güvenliğinin olmaması, programcının hataya mahal verebilecek işler yapabilmesi ve nesne yönelimini %100 uygulayamamasıdır.
Ünivertsitelerde günümüzde okutulan bir dildir. Donanım ile uğraşıyorsanız bir çok ARM üreticisinin ve derleyici firmasının desteklediği bir dildir. Günümüzde popüler olan başlangıç seviyesi donanım platformu olan Arduino C++ kullanmaktadır. Sonuç olarak öğrenmenizi tavsiye ettiğim bir dildir. Yazılım işi ile uğraşıyorsanız nesne yönelimli daha üst seviye dillere göz atmanızı öneririm.
Java
1995 yılında Sun Microsystems firmasından James Gosling isimli bir mühendis tarafından geliştirilmeye başlanmıştır. C++ dilinden epey etkilenmiştir. O zamandan bugüne kadar epey değişim ve iyileştirme süreci geçirmiştir.Nesne yönelimli, güvenli, üst seviye bir dildir. Derlenerek değil yorumlanarak çalışır. İlk yıllarında taşınabilir cihazlarda kullanılması amaçlanmıştır. Bu yüzden platform bağımsız olacak şekilde tasarlanmış ve platforma kurulan sanal bir makinede kodlar yorumlanarak çalıştırılmaktadır. Java dilinde programcının yazdığı kodlar bir Java derleyicisi ile bytecode adı verilen ara bir koda dönüştürülür. Bu kodlar platform bağımsız olarak taşınabilir hale gelmiştir. Platform bağımsızlığından kasıt Windows, Mac, Linux gibi işletim sistemleri olabileceği gibi mobil platformlarda olabilir. Hedef platforma kurulan ve Java Sanal Makinesi (Java Virtual Machine - JVM) ismi verilen bir program vasıtasıyla bytecodelar tek tek yorumlanarak çalıştırılır. Bu işlem performans kayıplarına yol açar.
Javanın platform bağımsız oluşu ve getirdiği yeniliklerden dolayı bir süre sonra mobil plarformlar ve kurumsal uygulama yapan şirketler tarafından epey benimsenmiş, gelişen Java versiyonlari ile beraber uygulama boyutları da büyüyerek kişisel bilgisayarlarda kullanmak üzere son kullanıcı uygulamaları geliştirilir olmuştur.Hazır API (uygulama geliştirmek için bir araya toplanan kütüphaneler) ve SDK (yazılım geliştirme kiti) eklentileri geniş bir kesim tarafından benimsenmiştir. Güvenli kod yazımı, otomatik hafıza yönetimi, garbage collector (hafızada kullanılmayan nesne ve değişkenlerin otomatik olarak sistem belleğine geri dönüştürülmesi - C/C++ gibi dillerde bu işlemi programcının yapması gerekiyor. Geri verilmeyen bellekler bir süre sonra sıkıntı yaratabiliyor) Javayı aranan bir dil haline getirmeye başlamıştır. Sonuç olarak kendisinden sonra çıkacak olan programlama dillerini etkisi altında bırakmış özellikle yukarda bahsettiğim yönleriyle Microsoftun çıkartmış olduğu C# dilini epey etkilemiştir.
Google'ında mobil Android işletim sistemi için Javayı seçmesi sonucu son dönemlerde daha popüler hale gelmiştir. Sonuç olarak kurumsal uygulamalar gibi platform bağımsızlığına ihtiyaç duyan uygulamalar geliştirmeniz gerekiyorsa, Android işletim sisteminde mobil uygulama geliştirmek istiyorsanız Java öğrenmeye başlayabilirsiniz.
C#
C# programlama dili üst seviye ve günümüzde kullanılan en yaygın programlama dillerinden bir tanesidir. Anders Hejlsberg isimli bir bilgisayar mühendisinin önderliğinde Microsoft çatısı altında 2000 yılında geliştirilmiştir. Microsoft tarafından geliştirilsede ISO tarafından standartlaştırılmış ve bir çok firma ve programcı tarafından kullanılabilir hale gelmiş ve epey sevilmiştir. Microsoft IDE ve diğer ürünleri ücretli olsada C# derleyicisini isteyen herkes kullanıp yazdığı kodları derleyebilir. Ama IDE olmadığı durumda büyük projeleri yazmak ve derlemek zahmetli olacaktır. Microsoft benim bu yazıyı yazdığım dönemde Visual Studio isimli IDE sinin başlangıç paketini öğrenciler, öğretim görevlileri, topluluklar ve küçük ölçekli işletmeler için ücretsiz olarak sunmaktadır. C# Javada olduğu gibi önce ara bir dile çevrilmektedir (Basic.NET ile yazılan kodlarda aynı ara dile çevrilmektedir) . Bu dil daha sonra satır satır işletilerek çalıştırılsada c# performanslı bir dildir. .NET Framework isimli kod kütüphanesini kullanarak kısa zamanda çok iş yapılabilir.
C# kod yazım ve derleme aşamasında daha değer atanmamış değişken kontrolü, dizi ve index taşmaları, güçlü tür ve tür dönüşüm kontrolü, kullanılmayan nesnelerin hafızaya geri dönüştürülmesi (garbage collector), kod güvenliği gibi özelliklerinden dolayı gayet modern, güvenli, yüksek performanslı ve çokça tercih edilen bir dildir. Son dönemde Microsoft tarafından robotik ve mobil alanlar için C# dili kullanılmaya başlanmıştır. Microsoft mobil ürünleri için uygun olsada robotik ve donanım alanında uygulama alanının sınırlı olduğunu düşünüyorum.
Microsoft ürünlerinde uygulama geliştiriyorsanız sahip olduğu üst düzey özellikleri, yüksek performansı ve programcıya sunulan .NET kütüphanesi avantajıyla öğrenmek için çok iyi bir dildir. Özellikle Windows işletim sistemlerinde uygulama geliştirecekseniz kesin öğrenmelisiniz. Donanım ile alakalı C/C++ dilleriyle uygulamalar yapıp bilgisayar tarafındaki kontrollerini C# ile sağlamanız güzel bir yöntem olabilir. Kendini yenileyen üniversitelerinde çeşitli bölümlerinde ders olarak verilmektedir.