If deyiminin yeteneği nerden geliyor?

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:

Video

Altyazı mevcuttur.

1 Beğeni

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
1 Beğeni

“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.

1 Beğeni

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

3 Beğeni

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.

7 Beğeni

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ş.