61 lines
2.3 KiB
Markdown
61 lines
2.3 KiB
Markdown
# ADR-008: && ve || kısa devre değerlendirmesi
|
||
|
||
## Durum
|
||
Kabul edildi.
|
||
|
||
## Bağlam
|
||
Mevcut kodda `&&` ve `||` çalışma anında bozuk: IR üretici bu operatörler için
|
||
`case` içermiyor, `default` koluna düşüp `LOAD_CONST 0` üretiyor — yani değişken
|
||
operandlarda her zaman `false` dönüyor. Yalnızca her iki operand sabit olduğunda
|
||
sabit katlama doğru sonucu veriyor. (Kanıt: `ir_generator.cpp:395-413`,
|
||
`constant_folding.hpp:107-112`; davranış referansı bölüm B.)
|
||
|
||
## Karar
|
||
`&&` ve `||` **KISA DEVRE** değerlendirilir:
|
||
|
||
- `a && b`: `a` false ise `b` **HİÇ değerlendirilmez**, sonuç `false`.
|
||
- `a || b`: `a` true ise `b` **HİÇ değerlendirilmez**, sonuç `true`.
|
||
|
||
Bu, bu operatörlerin sıradan ikili işlem (iki tarafı hesapla sonra birleştir)
|
||
**DEĞİL**, bir dallanma olarak üretilmesi gerektiği anlamına gelir.
|
||
|
||
IR şeması:
|
||
|
||
```
|
||
a && b:
|
||
slot_a = [a değerlendir]
|
||
result = freshSlot()
|
||
LOAD_CONST result, 0 ; varsayılan: false
|
||
JIF_FALSE slot_a → DONE ; a false? b'yi atla, result=0 kalsın
|
||
slot_b = [b değerlendir]
|
||
LOAD_SLOT result, slot_b ; result = b'nin değeri
|
||
DONE:
|
||
|
||
a || b:
|
||
slot_a = [a değerlendir]
|
||
result = freshSlot()
|
||
LOAD_CONST result, 1 ; varsayılan: true
|
||
JIF_TRUE slot_a → DONE ; a true? b'yi atla, result=1 kalsın
|
||
slot_b = [b değerlendir]
|
||
LOAD_SLOT result, slot_b ; result = b'nin değeri
|
||
DONE:
|
||
```
|
||
|
||
`||` için `JIF_TRUE` opcode'u gerekir. `JIF_FALSE`'un simetriği olarak
|
||
`instruction.hpp`'e ve `interpreter.cpp`'e eklendi. `do-while` döngüsünün
|
||
mevcut `EQUAL_EQUAL(cond, 1)` geçici çözümü bu opcode'dan faydalanabilir
|
||
(ayrı düzeltme — bu ADR kapsamı dışı).
|
||
|
||
## Gerekçe
|
||
- C-ailesi dillerin (C, Go, Java, JS, C#) tamamı kısa devre yapar; hedef kitle
|
||
bunu bekler.
|
||
- Performans artısı: gereksiz sağ-taraf değerlendirmesi atlanır; kısa devre
|
||
OLMAYAN versiyon her iki tarafı da her zaman hesaplayacağı için daha yavaştır.
|
||
- Niş ile uyumlu: derleyici "şu çağrı şu durumda atlandı" diye gösterebilir.
|
||
|
||
## Sonuçlar
|
||
- Tek dezavantaj: mantıksal operatörün sağındaki yan etki koşullu çalışır.
|
||
Bu kabul edilir; yan etkiyi koşula gömmek zaten kötü kalıptır.
|
||
- Sabit katlama yolu (`constant_folding.hpp`) zaten doğru çalışıyordu ve
|
||
değiştirilmedi; bu düzeltme yalnızca değişken-operand (IR üretim) yolunu etkiler.
|