Bu konuda bir yazı yazmamı öneren Tabella yazarı Ece Köseoğlu‘na teşekkür ederim.
Bölüm 2: Peki modern diller hâlâ 0 ve 1 mi kullanıyor?
Hayır! Bir süre sonra insanlar program yazmanın daha kolay bir yolu olmalı diye düşünmeye başladılar (Ekrana sadece isminizi yazdırmak için yarım sayfa 0 ve 1 yazmayı denediniz mi? Ben de! Çok eğlenceli olmasa gerek…). Bir süre sonra, David Wheeler veya Kathleen Booth (bkz: Ek 1) “assembly” dilini icat etti. Bu dil hâlâ günümüzde kullanılan dillere oranla yazması daha zor olsa da, hem tarihî hem de modern açıdan yüksek önem taşır (daha sonra niye olduğunu öğreneceğiz).
Makine kodu gibi, tek bir assembly dili yerine, her işlemci markası/modeli için farklı bir assembly dili vardır. Fakat bu diller arasında bayağı benzerlik vardır. Tamam, assembly diline bakmadan önce, işlemcilerin nasıl işlem yaptığı hakkında bir şey öğrenmemiz lazım. İşlemciler, yaptıkları işlemlerin sonuçlarını “register” diye adlandırılan “hafıza kutuları”na yerleştirirler. Çok basit bir şekilde, bu kutular sayıları depolarlar ve işlemcinin bir önceki işlemlerin sonuçlarını “hatırlamasını” sağlar, bu kadar.
Makine dilinden farklı olarak assembly dilinde artık 0 ve 1’ler yerine 3-4 harflik insan dilinde yazılmış komutları kullanıyoruz. Örneğin bu makine koduna bakarak başlayalım (“;” ile başlayanlar benim açıklamak için koyduğum yorumlardır).
; 0 numaralı kutunun içine 1 değerini koy
; burada 11111111, 0 numaralı kutu için kullanılan özel isimdir.
0101 1 11111111
; 0 numaralı kutudaki değere 4 sayısını ekle
0011 0 101
; 0 numaralı kutudaki değeri 1 numaralı kutuya taşı.
0101 11111110 11111111
Tamam şimdi aynı kodu assembly dilinde yazalım:
; Bu kodda, $0x1 = 1 sayısı, $0x4 = 4 sayısı
MOV $0x1, %0
ADD %0, $0x4
MOV %1, %0
ADD burada toplama işlemini, MOV ise taşıma işlemini temsil eder. Makine koduna kıyasla daha temiz ve anlaşılır.
Bölüm 3: İşlemciler sadece 0 ve 1’leri anlar
Bölüm ismine bakın. Eğer bu doğruysa, o zaman 0 ve 1’lerle yazılmayan assembly kodunu işlemciler nasıl anlar? Şöyle bir örnek vereyim. Siz Fince dilini bilmiyorsunuz ama sadece Fince konuşan biriyle iletişim kurmanız lazım. Nasıl yapabilirsiniz? Tercüman kullanabilirsiniz. Siz Türkçe konuşursunuz, tercüman Fince’ye çevirir. Aynı şekilde bilgisayarlarda da assembly dilini makine koduna çevirebilen bir “tercüman” vardır.
Bölüm 4: Modern diller
Son olarak, günümüzde kullanılan modern, “high level” (üst seviye) dil dediğimiz dilleri ve şimdiye kadar gördüğümüz konseptler ile bağlantılarını görelim. Öncelikle, modern diller, assembly dilleri, makine kodu, hepsi teorik olarak aynı güçtedirler. Biriyle yapabileceğiniz her şeyi diğeriyle de yapabilirsiniz. Aralarındaki fark, bazı dillerde programların daha kolay yazılması veya daha anlaşılır olması (örneğin assembly ve makine kodunu karşılaştırın) ya da bu yazıyı kısa tutmak amacıyla bahsetmeyeceğim daha farklı sebeplerdir, ama her dil teoride aynı güce sahiptir.
Peki modern diller neye benzer? Onlarda yazılan kod nasıldır? Benim bu sıralar favori dilim olan Python’da yazılmış bir koda bakalım:
if 7 > 5:
y = 10
else:
y = 5
Kısacası, bu kod diyor ki eğer 7 sayısı 5 sayısından büyükse (if 7 > 5) y “kutusu”nun değeri 10 olacak (y = 10), fakat eğer bu doğru değilse (else) y kutusunun değeri 5 olacak. Modern bir dilde yazılan bu kodun niye çok daha basit olduğunu anlamak için, aynı kodun assembly dili hâline bakalım (assembly yazmayalı biraz zaman oldu, hatam varsa affedin):
CMP $0x7, $0x5
JG ON
MOV $0x5, %y
JMP CIKIS
ON: MOV $0x10, %y
CIKIS:
Yazıyı kısa tutmak için, bu kodu açıklamıyorum, fakat zaten gerek yok. Modern bir dilde yazılmış kodu programlama bilgisi olmayan biri bile okuyup az çok anlayabilir. Aynı kodun assembly dilindeki hâli ise, karmaşık ve aynı zamanda yazması zor ve zor demek programda daha çok hata olacak demektir. İşte bu yüzden modern diller var.
Son olarak, bir önceki bölümde bahsettiğimiz 0 ve 1’lere tercüme fikrine geri dönelim. Modern diller (çoğu zaman) doğrudan 0 ve 1’lere tercüme edilmez (fakat her zaman dolaylı yoldan çevrilecektir). Bunun yerine, bir kaç farklı popüler seçenek vardır. İki tanesine bakalım:
1. Modern dilde yazılan kod, assembly diline çevrilir, assembly dili makine koduna çevrilir. Bu işlemi gerçekleştiren “tercüme programı”na “compiler”, veya “derleyici” denir. Bu şekilde çalışan iki dil C ve C++’tır.
2. Modern dilde yazılan kod, başka bir dile çevrilmez. Bunun yerine, “‘interpreter” veya “yorumlayıcı” denilen bir program, modern dil kodunu okuyup anlar ve tercüme etmeden bilgisayara ne yapması gerektiğini söyler, yani bir nevi bir “aracı” olarak çalışır.
Her zamanki gibi, umarım yeterince basit ve bu konseptlerle daha önce karşılaşmamış olanların anlayabileceği şekilde açıklayabilmişimdir. Aynı zamanda söylemek isterim ki, bu yazıyı kısa ve anlaşılır tutabilmek için bazı detayları atlamak zorunda kaldım.
Ek 1: Assembly dilini kim icat etti?
Maalesef ki bulabildiğim kaynaklar bu konuda birbiriyle çelişen niteliktedir. IEEE Computer Society (ki bilgisayar biliminde saygı gören bir kurumdur), David Wheeler’ın assembly dilini icat ettiğini kabul eder.[1] Fakat, Centre for Computing History, ilk assembly dilini Kathleen Booth’un icat ettiğini kabul eder.[2]
Referanslar
[1] David Wheeler Biography. IEEE Computer Society.
[2] Kathleen Booth. Centre for Computing History.
Ben proglama ve yazılım işine daha yeni girdim ve buna rağmen en iyi anladığım kaynaklardan birisin.Teşekkürler.