Programlama Dilleri

Serimizin bu bölümünde programlama dillerini anlamaya ve sınıflandırmaya çalışacağız.

Programlama dili nedir?#

Programlama dili için web’de birçok tanım bulabilirsiniz ancak ,kendimce, ben elimizdeki donanımı (hardware) çeşitli problemlerin çözümünde kullanmak üzere uygun hale getiren komutlar dizisi olarak görüyorum. Aslında sadece dilin tanımını düşünecek olursak, dil insanların birbirleriyle anlaşabilmek için geliştirdiği bir iletişim yöntemidir diyebiliriz. Aynı açıdan programlama dilleri de donanım ile bizim aramızdaki iletişim yöntemidir. Programlama dillerini, doğal dillerden ayıran en önemli özellik ise kurallarının kesin bir biçimde belirgin olması ve bu kuralların dışına çıkıldığında (sentaks bozulduğunda) donanımın bunu anlamayacak olmasıdır. Doğal dillerde ise konuşma esnasında yüzlerce hata yapıyoruz ancak karşımızdaki insan bizi bir şekilde anlayabiliyor.

Sentaks: kelimelerin bir araya gelerek söz dizimi oluşturmasıdır. Bu söz dizimi bir ifade veya tanımlama olabilir, varlıkların hareketini gösterebilir.

Programlama dillerinin türleri nelerdir?#

Programlama dillerinin türlerini ifade ederken teknik yönlerini, ifade özelliklerini, belirli programlama paradigmaları (yazının ilerleyen kısımlarında bu paradigmaları inceleyeceğiz) için doğrudan desteği veya verimlilik gibi konuları dikkate alıyoruz.

  • Makine dilleri (Machine languages)

  • Assembly dilleri (Assembly languages)

  • Yüksek seviyeli diller (High-level languages)

  • Derlenebilen diller (Compiled languages)

  • Yorumlanabilen diller (Scripting languages)

  • Alana/Bölüme özel geliştirilen diller (Domain-specific languages)

  • Görsel diller (Visual languages)

  • Esoterik diller (Esoteric languages)

Bunların dışında da birçok programlama dili kategorisinden söz edilmiştir ancak ben sadece dikkatimi çekenleri buraya aldım. Eğer isterseniz şuradan diğer kategorileri de görebilirsiniz.

Buradaki bir diğer önemli nokta ise bir programlama dili birden fazla kategoriye dahil edilebilir. Yani bir programlama dili hem yüksek seviyeli diller arasındayken hemde derlenen bir dil olma özelliğine sahip olabilir.

Makine Dili

Makine dili donanım üzerinde çalışacak kodun ve verinin direkt olarak yazılımcı tarafından yazılmasıdır. Dolayısıyla kodun yazıldığı donanım dışındaki donanımlarda çalışmaz. Her işlemcinin mimarisine göre belirli komut dizileri bulunur ve makine kodlarında bu komut dizileri kullanılır. Genellikle 16’lık sayı düzeninde ifade edilir.

Örnek: 82 F6 B9 02 03 10 20 67 66 6A B1 33 F1 C0 C2 A3 E1 62 93 EB AA C1

Daha sonra göreceğimiz bütün programlama dilleri türlerinin bir şekilde makine diline çevrildiğini unutmayalım. Netice itibariyle makine dili, elinizdeki donanımın anladığı tek dil.

Assembly Dili

Assembly dili makine kodunun daha okunabilir bir şekilde yazılması için geliştirilmiş dildir. Yazılan kod assembler yardımıyla ilgili donanımın komut setlerine (makine koduna) dönüştürülür. Kodun daha anlaşılır olabilmesi için bazı etiketlemeler yapılabilir, fonksiyonlar tanımlanabilir.

Örnek:

; ----------------------------------------------------------------------------------------
; Writes "Hello, World" to the console using only system calls. Runs on 64-bit Linux only.
; To assemble and run:
;
;     nasm -felf64 hello.asm && ld hello.o && ./a.out
; ----------------------------------------------------------------------------------------

          global    _start

          section   .text
_start:   mov       rax, 1                  ; system call for write
          mov       rdi, 1                  ; file handle 1 is stdout
          mov       rsi, message            ; address of string to output
          mov       rdx, 13                 ; number of bytes
          syscall                           ; invoke operating system to do the write
          mov       rax, 60                 ; system call for exit
          xor       rdi, rdi                ; exit code 0
          syscall                           ; invoke operating system to exit

          section   .data
message:  db        "Hello, World", 10      ; note the newline at the end

Kaynak

Hala kodun çok karmaşık olduğu yazılımcının koyduğu notlar olmasa okunmasının gerçekten zor olduğunu görüyorsunuz. Ancak makine diliyle karşılaştırıldığında neden daha okunabilir dediğimizi anlamış olmalısınız.

Hem makine dili hem assembly yazılımcının donanım üzerinde çok büyük güçlerinin olduğu programlama dilleridir. Yani yazılımcı işlemci içerisindeki parçaların yönetiminden (register) veya hafıza kullanımından direkt sorumludur. Diğer programlama dilleri türlerini gördüğümüzde bu tip problemlerle yazılımcının değil kodu makine diline dönüştüren ara uygulamaların üstlendiğini göreceksiniz.

Yüksek seviyeli diller (High-level programming languages)

Yüksek seviyeli diller, yazılımcının bulunduğu donanımın kısıtlarından birçok anlamda uzaklaştığı, insan diline çok daha yakın programlama dilleridir. Yazılımcının işini kolaylaştıran kompleks veri yapıları, akış yönetim komutları sunar. Kod yazıldıktan sonra çalışması istenen donanıma göre derlenir veya yorumlanır (aradaki farkı ilerleyen konularda değineceğiz). Burada yazılımcının donanım komponentlerine olan direkt etkisi ise kısıtlıdır. Yani işlemci içerisindeki yapılara veya hafızanın yapısına genellikle erişim yoktur veya çok kısıtlıdır. Programın çalışabilmesi için gereken bu işlemci ve hafıza düzenlemesi genellikle derleyici veya yorumlayıcı tarafından halledilir.

Assembly dilinin gösterirken fark ettiyseniz ekrana Hello World! yazdıran bir uygulama örneği göstermiştik. Yüksek seviyeli bir programlama dili olan Python ile bunu yapmak istersek sadece tek satır işimizi görüyor.

print("Hello World!")

Programlamayı, belirli problemlerin çözümü için kullandığımızı göz önüne aldığımızda yüksek seviyeli programlama dilleri, programın çalışabilmesi için donanımın istediği bazı “ritüellerle” uğraşmadan direkt olarak problemimizin çözümüne odaklanmamıza imkan sağlıyor. Ancak tabiki bunun performans anlamında bir maliyeti var.

Derlenen ve yorumlanan diller

Daha önce bahsi geçen bu iki tip programlama dilini inceleyelim. Makine kodu dışında yazılan her kodun bir şekilde makine koduna çevrilmesi gerektiğinden bahsetmiştik, aksi takdirde donanım ile iletişime geçmemizin bir yolu bulunmuyor. Programlama dilleri bu dönüşümü yaparken kullandığı yönteme göre derlenen(compiled) ve yorumlanan(interpreted) diller olarak ayrışabiliyorlar.

  • Derlenen diller: Kodun bir derleyici yardımıyla tamamının makine koduna çevrildiği programlama dilleridir. Yazılan kod derleyici tarafından baştan sona kadar okunur ve makine koduna çevirerek çalıştırılabilir bir dosya çıkarır. Dolayısıyla yazılan kod çalıştırılmadan evvel derlenmek durumundadır. Bir kere derlendikten sonra ise defalarca çalıştırılabilir. Örnek olarak C, C++ ve Golang gibi programlama dilleri gösterilebilir.

  • Yorumlanan diller: Kodun bir yorumlayıcı yardımıyla çalışma esnasında satır satır okunarak makine koduna dönüştürülüp çalıştırıldığı dillerdir. Burada kod çalışma esnasında makine diline dönüştürüldüğü için performansı derlenen dillere göre nispeten daha düşük olur diyebiliriz. Derlenen dillerde kaynak kodda yapılan her değişiklik için tekrardan derleme sürecinin tamamlanması gerekirken, yorumlanan dillerde böyle bir durum söz konusu değildir. Derlenen dillerde ise programı çalıştırmak için sadece derleyici çıktısı yeterli olurken, yorumlanan dillerde kaynak kodu ilgili makinede saklı tutmak zorundasınız. Python, Javascript, Bash gibi programlama dilleri yorumlanan dillere örnek olarak verilebilir.

  • Hibrit diller: Bazı programlama dilleri ise hem derlenen hem yorumlanan programlama dilleri arasında yer alır. Hala popülerliğini koruyan Java buna örnek gösterilebilir. Bu tür programlama dillerinde kaynak kod önce baştan sonra derlenerek ara bir programlama diline (Intermediate Language) dönüştürülür. Daha sonra bu çıktı bir yorumlayıcı yardımıyla satır satır yorumlanarak çalıştırılır.

Yorumlanan veya hibrit dillerdeki en büyük avantaj kodun farklı donanımlarda kolaylıkla taşınabilir olmasıdır. İlgili programlama dilinin yorumlayıcısı o an hangi donanımda bulunuyorsa kodda herhangi bir değişiklik yapılmasına gerek kalmadan çalıştırabilir. Dolayısıyla derlenen dillere göre daha taşınabilir olduğunu söyleyebiliriz. Çünkü derlenen dillerde, uygulama ilgili donanıma göre derlendikten sonra derleyici çıktısını farklı donanımlarda kullanamazsınız. Programın farklı mimarideki donanımlarda çalışmasını istiyorsanız, o mimariye uygun derleyiciye sahip olmanız gerekir. Netice itibariyle bu durum programın taşınabilirliğini düşürür.

Yukarda yazdıımız diğer tipteki programlama dilleri hakkında bilgi verip yazıyı uzatmayacağım. Eğer ilginizi çekiyorsa Google’da kısa bir arama yaparak her türlü bilgiye ulaşabilirsiniz.

Peki 2023 yılında bir backend geliştiricisi adayı olarak hangi programlama dilini öğrenmeliyim?#

Evet, hiçbir zaman değerini yitirmeyecek o altın soru… Hiçbir zaman değerini yitirmeyecek çünkü cevabı yok :)

Yukarda uzun uzun bahsettiğim gibi programlama dilleri sadece birer araç, çalıştığınız alanda hangi programlama dili avantaj sağlıyorsa onu kullanmalısınız. Evet bir programlama dilinde uzmanlaşmak ve derinlemesine bilgi sahibi olmak önemli ve zaman gerektiriyor. En az bir tane programlama dilini iyi bilmeniz, onunla problem çözebiliyor olmanız çok önemli. Bu size dilin paradigmasını öğretecek, bilgisayarla nasıl iletişime geçtiğini, hangi açılardan güçlü hangi açılardan zayıf olduğunu öğretecektir. Başka bir programlama dili öğrenmek istediğinizde, başarılı olduğunuz dil ile kıyaslayıp yapılar hakkında karşılaştırma yapabilir olacaksınız. Bir noktadan sonra ise programlama diline olan bağımlılığınız azalacak, doğru yerde doğru programlama dilini seçebilir olacaksınız.

Ancak;

Dünya üzerinde artık çoğu geliştiricinin kullanmaktan vazgeçtiği, bazı insanların adını hiç duymadığı dilleri öğrenip sektörde yer edinmeye çalışmayın. Söylediğim gibi programlama dillerinin doğal dillerden hiç farkı yok, bugün Asurca veya Hitit dili öğrenirseniz dünya üzerinde anlaşabileceğiniz insan sayısı çok kısıtlı olacaktır. Dolayısıyla güçlü topluluk grupları olan, geliştirmeye devam edilen dilleri tercih etmeniz önemli. Bu hem öğrenme sürecinde internetten birçok kaynak bulmanızı sağlayacak, hem de o dille üretilen proje sayısı çok fazla olacağından sektöre girişinizi kolaylaştıracaktır.

Bu yüzden günümüzde çok popüler olan Python, Java, .NET, JavaScript, Golang gibi programlama dillerinden birini seçmeniz şahsi önerimdir.

Sonuç#

Buradaki amacım programlama dili deyince kafanızda bazı kalıpları oluşturmak, ufak da olsa bir sınıflandırma yapmak. Bu noktadan sonra internette araştırma yaparak bir programlama dili seçin. Onunla matematiksel problemler çözebilir hale gelin. Bu tür problemleri bulabilmek için hackerrank.com veya leetcode.com gibi uygulamaları kullanabilirsiniz. Bu hem algoritma kurma yeteneğinizi geliştirecek, hem de bir dile olan hakimiyetinizi artıracaktır.

Bu serideki temel amacımız bir backend geliştiricisi için yol haritası oluşturmak. Dolayısıyla bir programlama dilini A’dan Z’e öğretmek bu serinin amacı dışında kalıyor. O yüzden bu konuyu bu şekilde es geçiyorum.

Bir sonraki yazımızda, bir yazılımcı için en kıymetli araçlardan biri olan versiyon kontrol sistemlerinden bahsedeceğiz ve modern dünyada yazılım geliştiren ekiplerin süreçlerini ele alacağız.