2.3 KiB
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:afalse isebHİÇ değerlendirilmez, sonuçfalse.a || b:atrue isebHİÇ 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.