Merhaba arkadaşlar. Sorum şöyle: if yapısı arkaplanda nasıl çalışır? (Nasıl kullanıldığını değil arkaplandaki algoritmasını öğrenmek istiyorum.)
Bu, if yapısının hangi seviyede nasıl çalıştığını anlamaya yönelik sorulmuş bir soru? Eğer yorumlayıcı seviyesinde soruyorsak POP_JUMP_IF_FALSE
ve JUMP_FORWARD
bytecode’ları kullanılıyor:
>>> from dis import dis
>>> dis("""if a: print("true")
else: print("false")""")
1 0 LOAD_NAME 0 (a)
2 POP_JUMP_IF_FALSE 14
4 LOAD_NAME 1 (print)
6 LOAD_CONST 0 ('true')
8 CALL_FUNCTION 1
10 POP_TOP
12 JUMP_FORWARD 8 (to 22)
2 >> 14 LOAD_NAME 1 (print)
16 LOAD_CONST 1 ('false')
18 CALL_FUNCTION 1
20 POP_TOP
>> 22 LOAD_CONST 2 (None)
24 RETURN_VALUE
>>>
Yorumlayıcı kodunun POP_JUMP_IF_FALSE
bytecode’unu işlediği kısımda da bir if
vardır diye tahmin ediyorum.
İşlemci seviyesinde de branching için çoğunlukla “jump to y
if x
equals true/false” ve "jump to y
" gibi instruction’lar kullanılıyor.
Yukarıda dis
fonksiyonuna argüman olarak verdiğim Python kodu şöyle bir algoritmaya çevrilebilir, sanırım siz bunu soruyorsunuz:
1- eğer a'nın mantıksal (boolean) değeri doğru değil ise 4. adıma git.
2- ekrana "doğru" yaz.
3- 5. adıma git.
4- ekrana "yanlış" yaz.
5- bitiş.
Anladığım kadarıyla cevabınızda aradığım cevabı göremedim. Yazdığınız 5 maddeye de eğer ile başladınız. "Eğer"in mantığını anlamak istiyorum.
“Yorumlayıcı kodunun POP_JUMP_IF_FALSE
bytecode’unu işlediği kısımda da bir if
vardır diye tahmin ediyorum.” yapısında da if kullanılmış olması muhtemel dediğiniz gibi. Öyleyse yazıldığı dilde, onda da zaten bi if yapısı kullanılmışsa, o if yapısının yani içinde if içermeyen if yapısının algoritmesını/yöntemini öğrenmek istiyorum.
genel algoritması için konuşalım
bir ok düşün o an çalıştırılan satırı tutan
->if(true): # burada koşul doğruysa çalıştırılan satırı gösteren kod bir sonraki satıra geçer
print("true")
else: # değilse buraya geçer ve diğer kısım atlanmış(JUMP) olur
print("false")
mesela
-> if (True):
print(12)
else:
print(13)
koşul doğru o yüzden
if (True):
-> print(12)
else:
print(13)
ama yanlış olsaydı
if (False): # bu kısım atlanmış olundu
print(12)
-> else:
print(13)
Şöyle örneklendirmeyi deneyeyim:
a = 1
b = 2
c = 3
b < c
doğru İSE: print(True)
yanlış İSE: print(False)
b < a
doğru İSE: print(True)
yanlış İSE: print(False)
Burada seçimi/atlamayı yaptırmak için if kullanırız. if kullanmaksızın bunu nasıl yapabiliriz? Başka deyişle if bunu nasıl yapar? İSE?
İf olan yerler derleyici tarafından bayraklanıyor (işaretleniyor).Altındaki durumu kontrol ediyor.Eğer durum geçerliyse bayraklı olan yerin altına yazdığımız (if bloğunun altına yazdığımız) yeri çalıştırıyor.Kendi dilimi yapmak istediğimde bunu araştırmıştım ve şuradan öğrendim:
Altyazı mevcuttur.
derleyici çalıştırmaz, derleyici o if bloğunun kodunu assembly halini yazar
assembly deki algoritma da benim dediğim gibi
burada o işleyişi gösteriyordu
“ise” kısmı, yani karşılaştırma kısmı yine işlemci seviyesinde çalışan bir şey. İşlemciler iki sayıyı büyüklük, küçüklük veya eşitlik bakımından karşılaştırabiliyor.
İki seçenek arasında karar verme işlemi yine yapılıyor, ama işlemci seviyesinde. Yani elektrik devreleri ile.
Her şey eninde sonunda makine seviyesine indiğinde 1 ve 0’lardan ibaret oluyor. Makine seviyesinde lojik mantık kapıları var, transistörlerden oluşur. O lojik kapılarda ve, veya kapıları vardır mesela. İf koşulları assembly seviyesinde örneğin BTFSS* gibi (yani ilgili bit 1 ise atla, değilse sonraki komutu çalıştır) komutlara dönüştürülür, ve bu ilgili bitin 1 veya 0 olup olmadığı lojik kapılar ile kontrol edilir.
* Bit Test F, Skip is Set
Cevaplar için teşekkür ederim. Kafamda bir şeyler oluştu. İlerledikçe tam cevabı öğreneceğim inşaallah. Selamlar…
Base–emitter (gate–source) arasinda akim akan (voltaj farki olan) transistorler, collector–emitter (drain–source) arasinda akim akmasina izin verir. Farkli yuk tasiyicisi fazlaliklari olan yariiletken bolgeler arasindaki bu etkilesim, anlayabildigimiz kadariyla, doga kanunu.
Bu transistoru farkli sekillerde bagladiginda olusan “eger base voltaji yuksekse collector voltaji dusuk olur” aciklamasi egerin kullanildigi ilk yer. Ayni zamanda da mantik kapilarinin ve sayisal elektronigin temeli.
JUMP_NEGATİVE.
Olayı basitçe şöyle söylesem herhalde yanlış olmaz:
Yeterli -voltaj uygulanmışsa- bu 1 demektir, yoksa 0. Şartımız bu.
Arkadaşların da dediği gibi “if” yapısı makine seviyesinden geliyormuş.